美文网首页程序员
MyBatis中使用foreach完成复杂查询

MyBatis中使用foreach完成复杂查询

作者: 凡哥爱丽姐 | 来源:发表于2020-08-14 21:04 被阅读0次

    1、foreach迭代数组入参

    User实体类

    package com.fan.entity;
    
    public class User {
        private Integer id;
        private String name;
        private String sex;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", sex='" + sex + '\'' +
                    '}';
        }
    }
    
    

    1.1、UserDao2接口类(参数是array类型)

    package com.fan.dao;
    
    import com.fan.entity.User;
    
    import java.util.List;
    
    public interface UserDao2 {
        //参数是数组
        public List<User> findAll1(int[] id);
    }
    

    1.2、配置UserDao2Mapper.xml文件

    <mapper namespace="com.fan.dao.UserDao2">
        <select id="findAll1" resultType="com.fan.entity.User">
            select * from users where id in
            <foreach collection="array" item="id1" open="(" separator="," close=")">
                #{id1}
            </foreach>
        </select>
    </mapper>
    

    注:

    \diamondsuitcollection:最关键并且最容易出错的属性,需要格外注意,该属性必须指定,不同情况下,该属性是不一样的,主要有三种情况:
        1、若入参为单参数且参数是一个数组,则collection属性值为array(此处就用的这个)。
        2、若入参为单参数且参数是一个List,则collection属性值为list。
        3、若传入参数为多参数,就需要把他们封装为一个Map进行处理
    \diamondsuititem:表示集合中每一个元素进行迭代时的别名(此处是id1)。
    \diamondsuitindex:指定一个名称,用于表示在迭代过程中,每次迭代的位置。
    \diamondsuitopen:表示该语句以什么开始(in条件语句是以 "(" 开始)。
    \diamondsuitseparator:表示在每次迭代之间以什么符号作为分隔符(in条件语句以","作为分隔符)。
    \diamondsuitclose:表示语句以什么结束(in条件语句是以 ")" 结束)。

    1.3、测试类

    import com.fan.dao.UserDao2;
    import com.fan.entity.User;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.IOException;
    import java.io.Reader;
    import java.util.List;
    
    public class Test2 {
        public static void main(String[] args) {
            try {
                int[] id=new int[]{1,4,5};
                Reader resourceAsReader = Resources.getResourceAsReader("mybatis-config.xml");
                SqlSession sqlSession = new SqlSessionFactoryBuilder().build(resourceAsReader).openSession();
                UserDao2 mapper = sqlSession.getMapper(UserDao2.class);
                List<User> all1 = mapper.findAll1(id);
                for (User user:all1) {
                    System.out.println(user);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    测试结果如下图所示:

    测试结果

    2、foreach迭代List类型入参

    2.1、UserDao2接口类(参数是List类型)

        //参数是List类型
        public List<User> findAll2(List<Integer> id);
    

    2.2、配置UserDao2Mapper.xml文件

    <mapper namespace="com.fan.dao.UserDao2">
        <select id="findAll2" resultType="com.fan.entity.User">
            select * from users where id in
            <foreach collection="list"  item="id2" open="(" separator="," close=")">
                #{id2}
            </foreach>
        </select>
    </mapper>
    

    2.3、测试类

    import com.fan.dao.UserDao2;
    import com.fan.entity.User;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.IOException;
    import java.io.Reader;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Test2 {
        public static void main(String[] args) {
            try {
                List<Integer> list=new ArrayList<Integer>();
                list.add(1);
                list.add(7);
                Reader resourceAsReader = Resources.getResourceAsReader("mybatis-config.xml");
                SqlSession sqlSession = new SqlSessionFactoryBuilder().build(resourceAsReader).openSession();
                UserDao2 mapper = sqlSession.getMapper(UserDao2.class);
                List<User> all2 = mapper.findAll2(list);
                for (User user:all2) {
                    System.out.println(user);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    测试结果如下图所示:

    测试结果

    3、foreach迭代Map类型入参

    3.1、UserDao2接口类(参数是Map类型)

       //参数是Map类型
        public List<User> findAll3(Map map);
    

    3.2、配置UserDao2Mapper.xml文件

    <mapper namespace="com.fan.dao.UserDao2">
        <select id="findAll3" resultType="com.fan.entity.User">
            select * from users where id in
            <foreach collection="key"  item="id3" open="(" separator="," close=")">
                #{id3}
            </foreach>
        </select>
    </mapper>
    

    3.3、测试类

    import com.fan.dao.UserDao2;
    import com.fan.entity.User;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.IOException;
    import java.io.Reader;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class Test2 {
        public static void main(String[] args) {
            try {
                List<Integer> list=new ArrayList<Integer>();
                list.add(1);
                list.add(2);
                list.add(3);
                Map map=new HashMap();
                map.put("key",list);
                Reader resourceAsReader = Resources.getResourceAsReader("mybatis-config.xml");
                SqlSession sqlSession = new SqlSessionFactoryBuilder().build(resourceAsReader).openSession();
                UserDao2 mapper = sqlSession.getMapper(UserDao2.class);
                List<User> all3 = mapper.findAll3(map);
                for (User user:all3) {
                    System.out.println(user);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    测试结果如下如所示:

    测试结果

    相关文章

      网友评论

        本文标题:MyBatis中使用foreach完成复杂查询

        本文链接:https://www.haomeiwen.com/subject/ydqgahtx.html