天天看点

MyBatis中in的使用

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。

foreach元素的属性主要有 item,index,collection,open,separator,close。

    item表示集合中每一个元素进行迭代时的别名,

    index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,

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

    separator表示在每次进行迭代之间以什么符号作为分隔 符,

    close表示以什么结束。

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

    1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

    2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

    3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可

以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key 下面分别来看看上述三种情况的示例代码:

1.单参数List的类型:

<select id="dynamicForeachTest" resultType="Blog">
          select * from t_blog where id in
       <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
               #{item}
       </foreach>
   </select>
           

2.单参数array数组的类型:

<select id="dynamicForeach2Test" resultType="Blog">
    select * from t_blog where id in
    <foreach collection="array" index="index" item="item" open="(" separator="," close=")">
         #{item}
    </foreach>
</select>
           

3.自己把参数封装成Map的类型

<select id="dynamicForeach3Test" resultType="Blog">
        select * from t_blog where title like "%"#{title}"%" and id in
         <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
              #{item}
         </foreach>
</select>
           

错误示例:

使用in的时候,不能这样写 in ${skuIds}

应该使用foreach标签

参考示例:

(一)、selectByIdSet(List idList)

如果参数的类型是List, 则在使用时,collection属性要必须指定为 list

List<User> selectByIdSet(List idList);
 
<select id="selectByIdSet" resultMap="BaseResultMap">
	SELECT
	<include refid="Base_Column_List" />
	from t_user
	WHERE id IN
	<foreach collection="list" item="id" index="index" open="(" close=")" separator=",">
	  #{id}
	</foreach>
</select>
           

(二)、List<User> selectByIdSet(String[] idList)

如果参数的类型是Array,则在使用时,collection属性要必须指定为 array

List<User> selectByIdSet(String[] idList);
 
<select id="selectByIdSet" resultMap="BaseResultMap">
	SELECT
	<include refid="Base_Column_List" />
	from t_user
	WHERE id IN
	<foreach collection="array" item="id" index="index" open="(" close=")" separator=",">
	  #{id}
	</foreach>
</select>
           

 (三)、参数有多个时

当查询的参数有多个时,有两种方式可以实现,一种是使用@Param("xxx")进行参数绑定,另一种可以通过Map来传参数。

3.1 @Param("xxx")方式

List<User> selectByIdSet(@Param("name")String name, @Param("ids")String[] idList);
 
<select id="selectByIdSet" resultMap="BaseResultMap">
	SELECT
	<include refid="Base_Column_List" />
	from t_user
	WHERE  name=#{name,jdbcType=VARCHAR} and id IN
	<foreach collection="idList" item="id" index="index"
			 open="(" close=")" separator=",">
	  #{id}
	</foreach>
</select>
           

3.2 Map方式

Map<String, Object> params = new HashMap<String, Object>(2);
params.put("name", name);
params.put("idList", ids);
mapper.selectByIdSet(params);
 
<select id="selectByIdSet" resultMap="BaseResultMap">  
     select  
     <include refid="Base_Column_List" />  
     from t_user where 
     name = #{name}
     and ID in  
     <foreach item="item" index="index" collection="idList" open="(" separator="," close=")">  
      #{item}  
     </foreach>  
</select>
           

 mybatis判断list为空

在传入的map或者对象里面存在一个list,此时想要判断list是否为空,可以

<if test="spids.size()>0 " >
        and  SPid not in
        <foreach collection="spids" item="id" index="index"
                 open="(" close=")" separator=",">
          #{id}
        </foreach>
</if>
           

List中存放的是对象类型的情况

public Page<YwbStudent> findStuCoursePage(Page<YwbStudent> ywbStudentPage, YwbStudent ywbStudent)      
YwbStudent类      
public class YwbStudent extends DataEntity<YwbStudent> {
   
   private static final long serialVersionUID = 1L;
   private User user;    // 用户表id
   private String name;      // 姓名
   private String sex;       // 性别
   private String mobile;    // 手机
   private List<YwbCourse> stuCourseList; //学生选课list      

…………

<if test="stuCourseList!= null and stuCourseList.size()>0">
   AND stucou.course_id IN
   <foreach collection="stuCourseList" item="Course" index="index"
          open="(" close=")" separator=",">
      #{Course.id}
   </foreach>
</if>      

继续阅读