mybatis如何用in语句查询和一些注意事项

平常我们使用in语句查询时,都是 in (xx,xx,xx)的格式,但是mybatis如何用in语句查询呢,我们可以用foreach元素去创建这样的格式。显然foreach元素是一个循环语句,它的作用是遍历集合,支持遍历数据,List,set接口的集合。

我们查询用户表,用户有男,女,未知3种情况,那例子查询男和未知的用户

  1. id="findUserBySex" resultType="User">
  2. select * from t_user where sex in
  3. item="item" index="index" collection="sexList"
  4. open="(" separator="," close=")">#{item}

属性说明:
1.collection:从外面传入进来参数的名称 #{sexLists},可以是数组,集合等
2.item:当前遍历到的元素
3.index:当前元素在集合的下标
4.open和close就是用什么符号包起来这些元素 我们要用”( )”
5.separator:用什么符号分割这些元素 我们要用”,”

注意 对于collection属性由于有数组,集合的区别,所以根据传参的个数有区别

1.当查询的参数只有一个时

  1. findByIds(List<Long> ids)

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

  1. id="findByIdsMap" resultMap="BaseResultMap">
  2. Select
  3. refid="Base_Column_List" >
  4. from jria where ID in
  5. item="item" index="index" collection="list"
  6. open="(" separator="," close=")">
  7. #{item}

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

  1. id="findByIdsMap" resultMap="BaseResultMap">
  2. select
  3. refid="Base_Column_List" >
  4. from jria where ID in
  5. item="item" index="index" collection="array"
  6. open="(" separator="," close=")">
  7. #{item}

2.当查询的参数有多个时

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

@Param(“xxx”)方式

  1. List<User> selectByIdSet(@Param("name")String name, @Param("ids")String[] idList);
  2. <select id="selectByIdSet" resultMap="Map">
  3. SELECT
  4. *
  5. from t_user
  6. WHERE name=#{name,jdbcType=VARCHAR} and id IN
  7. <foreach collection="idList" item="item" index="index"
  8. open="(" close=")" separator=",">
  9. #{item}
  10. foreach>
  11. select>

Map方式

  1. Map<String, Object> params = new HashMap<String, Object>(2);
  2. params.put("name", name);
  3. params.put("idList", ids);
  4. mapper.selectByIdSet(params);
  5. <select id="selectByIdSet" resultMap="Map" parameterType="Map">
  6. select
  7. *
  8. from t_user where
  9. name = #{name}
  10. and ID in
  11. <foreach item="item" index="index" collection="idList" open="(" separator="," close=")">
  12. #{item}
  13. foreach>
  14. select>

bean方式

这时候的bean的属性是要数组的,不能数集合

  1. public class Dag{
  2. private int[] ageArray;
  3. private String name;
  4. //set,get方法
  5. }
  6. <select id="selectByIdSet" resultMap="Map" parameterType="com.nonelonely.Dog">
  7. select *
  8. from t_dog
  9. name = #{name}
  10. and t.age in
  11. <foreach item="item" index="index" collection="ageArray" open="(" separator="," close=")">
  12. #{item}
  13. foreach>
  14. select>