程序员

MyBatis中使用foreach完成复杂查询

2020-08-14  本文已影响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();
        }
    }
}

测试结果如下如所示:

测试结果
上一篇 下一篇

猜你喜欢

热点阅读