MyBatis多参数处理(第二天)

注:

Servlet:就是和前端页面打交道

        (接收请求+数据 )

Service:调用mapper层进行增删改查

        Person person   student  teacher

Mapper: pojo层进行增删改查操作

        (对某一个对象的增删改查就在哪个mapper中进行)

附:  入参

返回值

(三) MyBatis多参数处理

MyBatis中方法中出现了多个参数的处理方式:

 

1、第一种使用方法索引

使用java方法的默认规范,参数是有索引,我们需要在sql中指定参数的的索引位置

<select>

select * from person where id=#{参数索引} and name=#{参数索引}  

</select>

 

2、第二种mapkey

使用map集合的方式传入多个参数值,在sql中我们使用map中的key来映射值

<select>

select * from person where id=#{mapkey} and name=#{mapkey}

</select>

 

3、第三种使用注解

使用MyBatis的注解 @Param("定义参数在sql中的应用名称"),在定义方法的时候声明sql中使用参数的名字

<select>

select * from person where id=#{ddi} and name=#{nnmae}

</select>

 

3、 第四种 使用自定义对象进行封装

<select>

select * from person where id=#{id} and name=#{name}

</select>

(四) 模糊查询

1、占位符方式

1)构建PersonMapper接口

public interface PersonMapper {

public List<Person> findByName(String name);

}

 

2)构建PersonMapper.xml

<mapper namespace="com.offcn.mapper.PersonMapper">

<select id="findByName" parameterType="string" resultType="person">

  select * from person where name like #{name}

</select>

</mapper>

 

3)测试

@Test

public void testFindByUsername() throws Exception {

PersonMapper personMapper= sqlSession.getMapper(PersonMapper.class);

List<Person> list = personMapper.findByName("%%");

for (Person person: list) {

System.out.println(person);

}

}

2、字符串拼接方式

1)构建PersonMapper接口

public interface PersonMapper{

public List<Person> findByName(String name);

}

 

2)构建PersonMapper.xml

<mapper namespace="com.offcn.mapper.PersonMapper">

<!-- 不推荐使用,因为Oracle数据库 除了设置别名其余位置不能使用 双引号 -->

<select id="findByName" parameterType="string" resultType="person">

select * from person where name like "%"#{name}"%"

</select>

</mapper>

 

3)测试

@Test

public void testFindByUsername() throws Exception {

PersonMapper personMapper= sqlSession.getMapper(PersonMapper.class);

List<Person>  list = personMapper.findByName("");

for (Person person: list) {

System.out.println(person);

}

}

3$的拼接方式

(3)构建PersonMapper 接口

public interface PersonMapper {

public List<Person> findByName(String name);

}

 

构建PersonMapper.xml

<mapper namespace="com.offcn.mapper.PersonMapper ">

<!--不推荐使用,因为会出现sql注入问题-->

<select id="findByName" parameterType="string" resultType="person">

select * from person where name like '%${value}%'

</select>

</mapper>

测试

@Test

public void testFindByName() throws Exception {

PersonMapper personMapper= sqlSession.getMapper(PersonMapper.class);

List<Person>  list = personMapper.findByName("");

for (Person person: list) {

System.out.println(person);

}

}

4、使用函数拼接数据

1)构建PersonMapper 接口

public interface PersonMapper {

public List<Person> findByName(String name);

}

 

2)构建PersonMapper.xml

<mapper namespace="com.offcn.mapper.PersonMapper">

<!-- 推荐使用,concat() 字符串拼接函数 注意:在Oracle中,concat() 函数只能传递二次参数,我们解决方案是嵌套拼接 -->

<select id="findByName" parameterType="string" resultType="person">

select * from person where name like concat(concat('%',#{name}),'%');

</select>

</mapper>

 

3)测试

@Test

public void testFindByName() throws Exception {

PersonMapper personMapper= sqlSession.getMapper(PersonMapper.class);

List<Person>  list = personMapper.findByName("");

for (Person person: list) {

System.out.println(person);

}

}

 

总结:${} #{} 区别

#{} :表示一个占位符号

通过 #{} 可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。#{} 可以接收简单类型值或pojo属性值。

如果parameterType传输单个简单类型值, #{} 括号中可以是value或其它名称。

 

${} :表示拼接sql

通过 ${} 可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,会出现sql注入问题。

${} 可以接收简单类型值或pojo属性值。如果parameterType传输单个简单类型值, ${} 括号中可以使任意名称

 

配置文件深入学习

(一)主键处理

应用场景

我们很多时候有这种需求,向数据库插入一条记录后,希望能立即拿到这条记录在数据库中的自动生成的主键值。以便后续业务的使用。

1、第一种方式使用属性useGeneratedKeys

<!--  useGeneratedKeys="true" 声明返回主键

keyProperty="id" 把返回主键的值,封装到实体的id属性中

注意:只适用于主键自增的数据库,MySQLsqlserver支持,oracle不行 -->

<insert id="insert" parameterType="person" useGeneratedKeys="true" keyProperty="id">

INSERT INTO `person` (name,bir,address) values(#{name},#{bir},#{address})

</insert>

 

2、第二种方式使用标签selectKey

<!-- selectKey 适用范围广,支持所有类型数据库

keyColumn="id" 指定主键列名

keyProperty="id" 指定主键封装到javaBean中的id属性中

resultType="int" 指定主键类型

order="AFTER" 设置在sql语句执行前(),执行此语句

-->

<insert id="insert" parameterType="person" useGeneratedKeys="true" keyProperty="id"> <selectKey keyColumn="id" keyProperty="id" resultType="int" order="AFTER">

SELECT LAST_INSERT_ID();

    </selectKey>

INSERT INTO `person` (name,bir,address) values(#{name},#{bir},#{address})

</insert>

(二)sql片段

1应用场景

映射文件中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的

2、实现步骤

(1) 抽取的sql片段

 <sql id="column_list">

   Id,name,bir,address

 </sql>

(2) 使用sql片段

<select id="findById" parameterType="int" resultType="person" >

<!--引入sql片段-->

select <include refid="column_list"></include> from person where id=#{id}

 </select>

注:在我们需要使用公共sql的地方,使用标签 include 引入sql片段。

(三)plugins分页查询

1、应用场景

MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据,分页功能只需要在配置文件中引入plugins标签

2、代码实现

(1) 导入PageHelper分页插件坐标

<!--分页插件-->

<dependency>

<groupId>com.github.pagehelper</groupId>

<artifactId>pagehelper</artifactId>

  <version>5.1.3</version>

</dependency>

(2) MyBatis核心配置文件配置PageHelper分页插件

<!--设置分页插件-->

<plugins>

<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>

</plugins>

(3) 测试代码

// 分页插件测试

@Test

public void testPageHelper() throws Exception {

PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);

// 指定查询页码和每页显示条数

PageHelper.startPage(1, 3);

List<Person> list = PersonMapper.findByIdAndNameIf(null);

for (Person person: list) {

System.out.println(person);

}

// 获取其他分页数据

PageInfo<Person> pageInfo = new PageInfo<>(list);

System.out.println(pageInfo.getTotal()); //总记录数

System.out.println(pageInfo.getPages());//总页数

System.out.println(pageInfo.getPageNum()); //当前页

System.out.println(pageInfo.getPageSize());//每页显示条数

System.out.println(pageInfo.isIsFirstPage());//是否为第一页

System.out.println(pageInfo.isIsLastPage());//是否为最后一页

}

二、MyBatis的多表联合查询

(一) 一对一

一对一操作:通过一方可以关联查询出另外一方的关系数据

案例中是通过Person可以查询当前Person关联的唯一的证件Card的数据,card表中我们设定了一个外键字段per_fk 关联peson表中的主键id字段。

1、创建数据库表

  CREATE TABLE `person` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(32) DEFAULT NULL,

   PRIMARY KEY (`id`)

)

CREATE TABLE `card` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(32) DEFAULT NULL,

  `num` varchar(32) DEFAULT NULL,

  `per_fk` int(11) DEFAULT NULL,

   PRIMARY KEY (`id`)

)

 

2、创建类Person

public class Person implements Serializable {

private int id;

private String name;

private Card  card ;

3、创建Person的关联类型 Card

public class Card implements Serializable {

    private int id;

    private String name;

private String num;

4、创建PersonMapper接口定义方法

public Person getInfoByName( @Param("name") String name);

5、创建文件 PersonMapper.xml

<resultMap type="person" id="newperson">

        <id property="id" column="id"/>

        <result property="name" column="name"/>

        <!--

        一对一操作的映射配置

        column: 当前的主类,提供查询从表对象的依据.

        javaType: 查询从表最终获取的结果类型.    

property  当前类型中对应的属性    

         -->

       <association property="card" column="id" javaType="com.offcn.bean.Card">

           <id property="id" column="id"/>

           <result property="name" column="name"/>

           <result property="num" column="num"/>

        </association>        

  </resultMap>

 

<select id="getInfoById" parameterType="string" resultMap="newperson">

   <!--  第一种和第二种配置方式的查询语句写法 -->

    SELECT p.*,c.* FROM  person p,card c WHERE p.id=c.per_fk AND p.name=#{name}   

  </select>

6、编写mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration

  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>

  <environments default="development">

    <environment id="development">

      <transactionManager type="JDBC"/>

      <dataSource type="POOLED">

        <property name="driver" value="${driver}"/>

        <property name="url" value="${url}"/>

        <property name="username" value="${username}"/>

        <property name="password" value="${password}"/>

      </dataSource>

    </environment>

  </environments>

    <mappers>

<mapper resource="org/offcn/mapper/PersonMapper.xml"/>

</mappers>

</configuration>

 

7、编码测试

@Test

public void test() {

//使用MyBatis的内置工具类解析MyBatis-config.xml文件

String filename="MyBatis-config.xml";

try {

    //使用流读取文件

InputStream is = Resources.getResourceAsStream(filename);

//根据流读取的内容创建一个MyBatis的核心对象

SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);

//生成session

SqlSession session = build.openSession();

PersonMapper mapper = session.getMapper(PersonMapper.class);

Person infoByName= mapper.getInfoByName("小黑");

System.out.println(infoByName);

//提交事务

session.commit();

//关闭session

session.close();

} catch (Exception e) {

e.printStackTrace();

}

 

(二) 一对多

本案例采用的是用户和订单来进行讲解,一个用户可以关联查询出自己的订单信息,在订单表中添加一个外键字段关联用户表中的主键。 

1、创建对应的数据库表

 订单表

   CREATE TABLE `orders` (

   `oid` varchar(64) NOT NULL,

   `odis` varchar(32) DEFAULT NULL,

   `onum` varchar(32) DEFAULT NULL,

   `cus_fk` int(11) DEFAULT NULL,

    PRIMARY KEY (`oid`),

);

用户表

CREATE TABLE `customer` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(32) DEFAULT NULL,

 PRIMARY KEY (`id`)

);

 

2、构建beanCustomer

public class Customer implements Serializable {

private int id;

private String name;

private List<Orders>  orders;

 

3、创建beanOrders

public class Orders implements Serializable {

    private int  oid;

    private String  odis;

private String  onum;

 

4、创建CustomerMapper接口并定义方法

public Customer getInfoByName( @Param("name") String name);       

5、创建CustomerMapper接口对应的映射文件 CustomerMapper.xml

 <resultMap type="customer" id="newCustomer">

       <id property="id" column="id"/>

       <result property="name" column="name"/>

<!-- 一对多第一种配置定义多方的映射关系 -->

<collection property="orders" column="id" ofType="com.offcn.bean.Orders" >

<id property="oid" column="oid" />

<result property="odis" column="odis"/>

            <result property="onum" column="onum"/>

</collection>           

</resultMap>

<select id="getInfoByName"  parameterType="string" resultMap="newperson">

select c.*,o.* from customer c ,orders o where c.id=o.per_fk and c.name=#{name}      

</select>

6、编写mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration

  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>

  <environments default="development">

    <environment id="development">

      <transactionManager type="JDBC"/>

      <dataSource type="POOLED">

        <property name="driver" value="${driver}"/>

        <property name="url" value="${url}"/>

        <property name="username" value="${username}"/>

        <property name="password" value="${password}"/>

      </dataSource>

    </environment>

  </environments>

    <mappers>

<mapper resource="org/offcn/mapper/CustomerMapper.xml"/>

</mappers>

</configuration>

 

7、编码测试

@Test

  public void test() {

    //使用MyBatis的内置工具类解析MyBatis-config.xml文件

String filename="MyBatis-config.xml";

try {

//使用流读取文件

InputStream is = Resources.getResourceAsStream(filename);

//根据流读取的内容创建一个MyBatis的核心对象

SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);

//生成session

SqlSession session = build.openSession();

CustomerMapper mapper = session.getMapper(CustomerMapper .class);

Person info = mapper.getInfoByName("小黑");

List<Orders> cards = info.getOrders();

for(Orders ods:cards) {

System.out.println("订单信息为名称"+ods.getOnum()+ods.getOdis());

}

//提交事务

session.commit();

//关闭session

session.close();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

(三)多对多

物品(items)和订单(orders)是多对多映射.两者实际上是通过OrderDetails中间表完成了关联.

需求:查询用户.同时查询出用户所关联的所有的订单,同时查询出订单所对应的所有的订单项以及订单项所对应的物品.

1、创建实体bean对应的表

用户表

CREATE TABLE `customer` (

  `cid` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(32) DEFAULT NULL,

  PRIMARY KEY (`id`)

)

订单表

CREATE TABLE `orders` (

  `oid` int(11) NOT NULL AUTO_INCREMENT,

  `dis` varchar(32) DEFAULT NULL,

`cus_fk` int(11) DEFAULT NULL,

  PRIMARY KEY (`id`)

  FOREIGN KEY (`cus_fk`) REFERENCES `customer` (`id`)

)

商品表

CREATE TABLE `items ` (

  `itemid` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(32) DEFAULT NULL,

  `price` double  DEFAULT NULL,

  PRIMARY KEY (`id`)

)

订单详情表

CREATE TABLE `ordersdetail ` (

  `odid` int(11) NOT NULL AUTO_INCREMENT,

  `items_id` int(11) DEFAULT NULL,

`orders_id` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

FOREIGN KEY (`items_id`) REFERENCES `items` (`itemid`)

FOREIGN KEY (`orders_id`) REFERENCES `orders` (`oid`)

  )

2、创建bean模型类 Customer

public class Customer implements Serializable {

private int cid;

private String name;

private List<Orders>  orders;

3、创建订单模型Orders

public class Orders implements Serializable {

    private int  oid;

private String  dis;

Private Customer customer;

Private List<Orderdetail> detailList

4、创建商品模型Items

public class Items implements Serializable {

    private int  itemid;

    private String  name;

private double price;

 

5、创建订单详情模型Ordersdetail

 public class Ordersdetail implements Serializable {

    private int  odid;

private Orders  orders;

private Items items;

6、创建接口 CustomerMapper

List<Customer> findCustomerById(Integer cid);

7、创建Mapper接口对应的配置文件 UserMapper.xml

<resultMap type="Customer" id="userManyToManyMap">

        <!--配置customer-->

        <id column="cid" property="cid"/>

        <result column="name" property="name"/>

        <!-- 配置user对应的Orders 一对多 -->

        <collection property="orders" ofType="Orders">

            <id column="oid" property="oid"/>

            <result column="dis" property="dis"/>

            <!-- 配置orders对应的orderdetail一对多 -->

            <collection property="detailList" ofType="Orderdetail">

                <id column="odid" property="odid"/>

                 <!-- 配置orderdetail对应的items 一对一-->

                <association property="items" javaType="Items">

                    <id column="itemid" property="itemid"/>

                    <result column="name" property="name"/>

                    <result column="price" property="price"/>

                </association>

            </collection>

        </collection>

    </resultMap>

    <select id="findAllUsers"  parameterType="int" resultMap="userManyToManyMap">

        SELECT c.*,o.*,od.*,i.*

        FROM customer c,orders o,orderdetail od,items i

        WHERE c.cid=o.cus_fk and o.oid=od.orders_id

        AND od.items_id=i.itemid and c.cid=#{cid}

    </select>

8、测试代码

@Test

  public void test() {

    //使用MyBatis的内置工具类解析MyBatis-config.xml文件

String filename="MyBatis-config.xml";

try {

//使用流读取文件

InputStream is = Resources.getResourceAsStream(filename);

//根据流读取的内容创建一个MyBatis的核心对象

SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);

//生成session

SqlSession session = build.openSession();

CustomerMapper mapper = session.getMapper(CustomerMapper .class);

Person info = mapper.getInfoByName(1);

System.out.println(info);

         }catch(Exception e){

            e.printStackTrace();

}

}

三、MyBatis的嵌套查询

什么是嵌套查询

嵌套查询就是将原来多表查询中的联合查询语句拆成单个表的查询,再使用MyBatis的语法嵌套在一起。

(一)一对一的嵌套

需求:查询一个订单,与此同时查询出该订单所属的用户

代码实现

1OrdersMapper接口中定义方法

public interface OrderMapper {

public List<Order> findAllWithUser();

}

2OrderMapper.xml映射

<!--一对一嵌套查询-->

<resultMap id="orderMap" type="orders">

<id column="oid" property="oid"></id>

<result column="dis" property="dis"></result>

<!--根据订单中cus_fk外键,查询用户表数据-->

<association

property="customer"

javaType="com.offcn.bean.Customer"

column="cus_fk"

select="com.offcn.mapper.CustomerMapper.findById"

</association>

</resultMap>

<select id="findAllWithCustomer" resultMap="orderMap" >

SELECT * FROM orders

</select>

 

3CustomerMapper接口

  Customer findById(Integer cid);

4CustomerMapper.xml 映射

<select id="findById" parameterType="int" resultType="com.offcn.bean.Customer">

SELECT * FROM `customer` where cid = #{cid}

</select>

5、测试代码

@Test

public void testOrderWithCustomer() throws Exception {

OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);

List<Order> list = orderMapper.findAllWithCustomer();

for (Order order : list) {

System.out.println(order);

}

}

 

(二)一对多的嵌套

需求:查询一个用户,与此同时查询出该用户具有的订单

 

1CustomerMapper接口并定义方法

public Customer getInfoByName( @Param("name") String name);

 

2CustomerMapper.xml映射文件

<resultMap type="Customer" id="newCustomer">

       <id property="cid" column="cid"/>

       <result property="name" column="name"/>

        <collection

property="orders"

column="id"

ofType="com.offcn.bean.Orders"

select="com.offcn.mapper.OrdersMapper.getOneByfk">

        </collection>      

</resultMap>

    <select id="getInfoByName"  resultMap="newperson">          

    SELECT c.*FROM customer c WHERE c.name=#{name};         

    </select>

3OrdersMapper接口

public Orders getOneByfk(int fk);

4OrdersMapper.xml的映射文件        

   <select id="getOneByfk" resultType="com.offcn.bean.Orders">

      select * from orders where cus_fk=#{cusid}       

   </select>

5、测试代码

@Test

public void testOrderWithCustomer() throws Exception {

CustomerMapper customerMapper= sqlSession.getMapper(CustomerMapper.class);

Customer  customer = customerMapper.getInfoByName(“张三”);

System.out.println(customer );

}

四、MyBatis的动态sql

(一) 动态sql基本使用

1、 动态sql<if><where>

需求

根据idusername查询,但是不确定两个都有值。

1PersonMapper接口

public List<Person>  findByIdAndNameIf(Person person);

2PersonMapper.xml映射

<!--

where标签相当于 where 1=1,但是如果没有条件,就不会拼接where关键字

同时where标签可以忽略我们成立条件前面的and 或者是or关键字

-->

<select id="findByIdAndNameIf" parameterType="person" resultType="person">

   SELECT * FROM `person`

<where>

<if test="id != null">

AND id = #{id}

</if>

<if test="name != null">  

AND name= #{name}

</if>

</where>

</select>

 

3)测试代码

// if标签  where标签

@Test

public void testFindByIdAndUsernameIf() throws Exception {

PersonMapper personMapper = sqlSession.getMapper(PersonMapper .class);

Person param = new Person();

// param.setId(2);

// param.setName("张三");

List<User> list = personMapper .findByIdAndNameIf(param);

System.out.println(list);

}

 

 

2、 动态sql<choose>

需求

如果有id只使用id做查询,没有id的话看是否有name,有name就根据name做查询,如果都没有,就不带条件查询全部内容

 

1PersonMapper接口

public List<Person> findByIdAndNameChoose(Person person);

 

2PersonMapper.xml文件

<!-- choose标签相当于swtich语句 when标签相当于case语句 otherwise标签相当于default语句 -->

<select id="findByIdAndNameChoose" parameterType="person" resultType="person"> SELECT * FROM `person`

<where>

<choose>

<when test="id != null">

AND id = #{id}

</when>

 <when test="name!= null">

AND name= #{name}

</when>

<otherwise>

AND 1=1

 </otherwise>

</choose>

</where>

</select>

3测试代码

@Test

public void findByIdAndNameChoose() throws Exception {

PersonMapper personMapper = sqlSession.getMapper(PersonMapper .class);

Person param = new Person();

// param.setId(2);

// param.setName("张三");

List<User> list = personMapper .findByIdAndNameChoose(param);

System.out.println(list);

}

 

 

3、 动态sql<set>

需求

动态更新user表数据,如果该属性有值就更新,没有值不做处理。

1PersonMapper接口

public void updateIf(Person  person);

2PersonMapper.xml文件

<!-- set标签在更新的时候,自动加上set关键字,然后去掉最后一个条件的逗号 -->

<update id="updateIf" parameterType="person">

UPDATE `person`

<set>

<if test="name!= null"> name= #{name}, </if>

<if test="bir!= null"> bir= #{bir}, </if>

<if test="address !=null"> address = #{address}, </if>

</set>

WHERE id = #{id}

</update>

 

3)测试代码

@Test

public void testUpdateIf()throws Exception{

PersonMapper personMapper= sqlSession.getMapper(PersonMapper.class);

Person person = new Person();

person .setId(1);

person .setName("李四");

personMapper.updateIf(person);

}

4、 动态sql<trim>(了解)

1)重写set标签

<update id="updateIf" parameterType="person">

UPDATE `person`

<trim prefix="set" suffixOverrides=",">

<if test="name!= null"> name= #{name}, </if>

<if test="bir!= null"> bir= #{bir}, </if>

<if test="address !=null"> address = #{address}, </if>

</trim>

WHERE id = #{id}

</update>

 

2)重写where标签

<!-- prefix="where" 表示此标签前缀为 where prefixOverrides="and | or" 表示去掉sql语句中的第一个and 或者 or -->

<select id="findByIdAndNameIf" parameterType="person" resultType="person">

select * from person

<trim prefix="where" prefixOverrides="and | or">

<if test="id != null "> and id = #{id} </if>

<if test="name!= null"> and name= #{name} </if>

</trim>

</select>

3)测试代码使用对应标签的测试代码就好,不需要更改,这里就省略了。

(二)动态sql的高级应用

1动态sql<foreach>

foreach主要是用来做数据的循环遍历

例如: select * from person where id in (1,2,3) 在这样的语句中,传入的参数部分必须依靠 foreach遍历才能实现。

 

标签简介

<foreach>标签用于遍历集合,它的属性:

collection:代表要遍历的集合元素

open:代表语句的开始部分

close:代表结束部分

item:代表遍历集合的每个元素,生成的变量名

sperator:代表分隔符

 

1)集合类型参数

a.创建PersonMapper接口

public List<Person> findByList(List<Integer> ids);

 

b.PersonMapper.xml映射文件

<!-- 如果查询条件为list集合,collection属性值为:collection 或者 list -->

<select id="findByList" parameterType="list" resultType="person" >

 SELECT * FROM `person`

<where>

<foreach collection="collection"  open="id in(" close=")"  item="id"  separator=",">

#{id}

</foreach>

</where>

 </select>

 

c.测试代码

// foreach标签 list

@Test

public void testFindByList() throws Exception {

PersonMapper  personMapper= sqlSession.getMapper(PersonMapper.class);

List<Integer> ids = new ArrayList<>();

ids.add(46);

ids.add(48);

ids.add(51);

List<User> list = personMapper.findByList(ids);

System.out.println(list);

}

 

(2)数组

a.PersonMapper接口

public List<Person> findByArray(Integer[] ids);

 

b.PersonMapper.xml映射文件

<!-- 如果查询条件为array数组,coolection属性值为:array -->

<select id="findByArray" parameterType="int[]" resultType="person">

SELECT * FROM `person`

<where>

<foreach collection="array" open="id in(" close=")" item="id" separator=","> #{id} </foreach> </where>

</select>

 

c.测试代码

@Test

public void testFindByArray() throws Exception {

PersonMapper  personMapper= sqlSession.getMapper(PersonMapper.class);  

Integer[] ids = {12, 23, 34};

List<User> list = userMapper.findByArray(ids);

System.out.println(list);

}

 

 

原文地址:https://www.cnblogs.com/masterhxh/p/13810572.html