MyBatis-foreach迭代

数组,List类型的foreach迭代

​ foreach元素,雨欣我们指定一个集合,并指定开始和结束字符,也可以加入一个分隔符到迭代器中,并能智能处理该分隔符,不会出现多余的分隔符

item:标识集合中每一个元素进行迭代时的别名

index:指定一个名称,用户表示在迭代过程中,每次迭代到的位置 (可省略)

open:表示该语句以什么开始

separator:表示在每次进行循环时之间以什么符号作为分隔符

close:表示该语句以什么结束

collention:该属性必须指定,不同情况下,该属性的值不一样

  • 若入参为单参数且参数类型是一个List的时候,collection属性值为list。
  • 若入参为单参数且参数类型是一个数组的时候,collection属性值为array
  • 若传入参数我多参数,就需要把它们封装为一个Map进行处理
<select id="allBillByproId" resultType="Bill">
    SELECT * FROM `smbms_bill` WHERE providerId IN
    <foreach collection="array" item="arr" open="(" separator="," close=")">
        #{arr}
    foreach>
select>
@Test
public void allBillByproId() {
    System.out.println("--------int数组查询-----------");
    ArrayMapper mapper = MybatisUtil.mapper(ArrayMapper.class); //自己封装的mybatis工具类
    int[] arr = {1,2,3};	//创建一个数组
    List<Bill> list = mapper.allBillByproId(arr);	//传入一个数组查询
    for (Bill bill : list) {
        System.out.println(bill.getId()+"--"+bill.getProductName());
    }
}

Map类型的foreach迭代

个人理解:

  • “list” 和 “数组” 相当于mybatis底层默认封装了一个Map,而 ”list“ 和 ”array” 是底层Map中的Key,当你传入的形参是 “list” 或 “数组” 并且collection的值是 ”list“ 或 ”array” “foreach迭代" 就会自动循环list或数组
  • 如果传入的直接是Map集合,则 “foreach“ 就会从你这个Map中的Key去循环对应的value值 , (传入Map时如果和Mybatis底层默认的 “list” 或 ”array“ 相同也不影响)

接口代码:

List<Bill> selectmap(Map<String,List<Integer>> maps);

xml代码:

​ 注意:

  • item:确保 item=“maps” 的值和迭代输出的值 #{maps} 要保持一致,不一致会报错
  • collection:传入map中的Key ,因为 foreach迭代 是根据传入的Map中的Key 根据Key去找value,进行迭代
<select id="selectmap" resultType="bill">
    SELECT * FROM `smbms_bill` WHERE providerId IN
    <foreach collection="list" item="maps" open="(" separator="," close=")">
        #{maps}
    foreach>
select>

测试类:

@Test
public void select() {
    System.out.println("--------Map集合查询-----------");
    ArrayMapper mapper = MybatisUtil.mapper(ArrayMapper.class);
    List<Integer> arr = new ArrayList<Integer>();
    arr.add(1);
    //arr.add(2);
    //arr.add(3);
    Map<String,List<Integer>> maps  = new HashMap<String,List<Integer>>();
    maps.put("list", arr);
    List<Bill> list = mapper.selectmap(maps);
    for (Bill bill : list) {
        System.out.println(bill.getId()+"--"+bill.getProductName());
    }
    System.out.println();
}

choose(when,otherwise)

  • when元素:相当于switch中的case
    -otherwise元素:当when中的所有条件都不满足时,会自动输出otherwise元素中的内容

结构:

<select id="id" resultType="bill">
    SELECT * FROM `smbms_bill` where 1=1
    <choose>
        <when test="userName != null">
            and userName like concat('%',#{userName},'%')
        when>
        <when test="userCode != null">
            and userCode like concat('%',#{userCode},'%')
        when>
        <otherwise>
            and YEAR(creationDate) =YEAR(#{creationDate})
        otherwise>
    choose>
select>

4.10 limit分页查询

接口:

List<Bill> SelectLimit(@Param("start") int start,@Param("pageSize") int pageSize);

xml代码:

<select id="SelectLimit" resultType="bill">
    SELECT * FROM `smbms_bill` 
    LIMIT #{start},#{pageSize}
select>

测试类:

@Test
public void SelectLimit() {
    ArrayMapper mapper = MybatisUtil.mapper(ArrayMapper.class);
    int start = 0;
    int pageSize = 5;
    List<Bill> list = mapper.SelectLimit(start,pageSize);
        for (Bill bill : list) {
        System.out.println(bill.getId()+"--"+bill.getProductName());
    }
}

你可能感兴趣的:(mybatis,mybatis,java,xml)