← 返回首页
Mybatis基础教程(十一)
发表时间:2022-03-07 21:28:23
复杂查询

mybatis提供了用于数组和集合循环遍历的foreach元素。

1.foreach foreach元素常用属性见下表: |属性|含义| |-|-| |item|集合中元素迭代时的别名,该参数为必选。| |index|在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。| |open|foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选。| |separator|元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。| |close|foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。| |collection|要做foreach的对象,作为入参时,List对象默认用"list"代替作为键,数组对象有"array"代替作为键,Map对象没有默认的键。当然在作为入参时可以使用@Param("keyName")来设置键,设置keyName后,list,array将会失效。 |

2.foreach迭代数组

映射文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.usersMapper">

    <!--foreach迭代数组-->
    <select id="getUsersByIds" parameterType="java.util.Arrays" resultType="Users">
        select * from users where uid in
        <foreach collection="array" item="uid" index="index" open="(" separator="," close=")">
            #{uid}
        </foreach>
    </select>
</mapper>

测试类:

    @Test
    public void testQueryUsersByIds(){
        SqlSession session = null;
        Integer[] ids = {1,2,4};
        try {
            session = SqlSessionFactoryUtil.openSqlSession();
            List<Users> usersList = session.selectList("getUsersByIds",ids);
            usersList.forEach(System.out::println);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (session != null) {
                session.close();
            }
        }
    }

3.foreach迭代List

映射文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.usersMapper">

   <!--foreach迭代List-->
    <select id="getUsersByIds" parameterType="java.util.List" resultType="Users">
        select * from users where uid in
        <foreach collection="list" item="uid" index="index" open="(" separator="," close=")">
            #{uid}
        </foreach>
    </select>
</mapper>

测试类:

    @Test
    public void testQueryUsersByIds(){
        SqlSession session = null;
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(4);
        try {
            session = SqlSessionFactoryUtil.openSqlSession();
            List<Users> usersList = session.selectList("getUsersByIds",list);
            usersList.forEach(System.out::println);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (session != null) {
                session.close();
            }
        }
    }

4.foreach迭代Set

映射文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.usersMapper">

   <!--foreach迭代Set-->
    <select id="getUsersByIds" parameterType="java.util.Set" resultType="Users">
        select * from users where uid in
        <foreach collection="collection" item="uid" index="index" open="(" separator="," close=")">
            #{uid}
        </foreach>
    </select>
</mapper>

测试类:

    @Test
    public void testQueryUsersByIds(){
        SqlSession session = null;
        Set<Integer> set= new HashSet<Integer>();
        set.add(1);
        set.add(2);
        set.add(4);
        try {
            session = SqlSessionFactoryUtil.openSqlSession();
            List<Users> usersList = session.selectList("getUsersByIds",set);
            usersList.forEach(System.out::println);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (session != null) {
                session.close();
            }
        }
    }

5.foreach迭代Map

根据用户类型和用户编号两个查询条件查询用户资料。

映射文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.usersMapper">

   <!--foreach迭代Map-->
    <select id="getUsersByTypeAndIds" parameterType="java.util.Map" resultType="Users">
        select * from users where type=#{type} and uid in
        <foreach collection="ids" item="uid" index="index" open="(" separator="," close=")">
            #{uid}
        </foreach>
    </select>
</mapper>

测试类:

    @Test
    public void testQueryUsersByTypeAndIds(){
        SqlSession session = null;
        List<Integer> idList = new ArrayList<Integer>();
        idList.add(1);
        idList.add(2);
        idList.add(4);
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("type","student");
        map.put("ids",idList);
        try {
            session = SqlSessionFactoryUtil.openSqlSession();
            List<Users> usersList = session.selectList("getUsersByTypeAndIds",map);
            usersList.forEach(System.out::println);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (session != null) {
                session.close();
            }
        }
    }