> 文章列表 > MyBatis实现In查询

MyBatis实现In查询

我的天啊,MyBatis的In查询怎么实现呀?刚开始学的同学可能会问这个问题。其实,MyBatis的In查询和SQL的In查询不太一样,SQL可以直接写在In后面,像SELECT * FROM user_info WHERE user_name in ('xixi','haha');这样,这在普通SQL里是可以的。但是到了MyBatis里,可就不行了!如果你在MyBatis的xml里面直接写WHERE user_name in (#{names}),那肯定会报错,因为MyBatis根本不认识这个语法。

没关系,MyBatis给我们提供了一个超级好用的foreach语句。这个foreach可以让你像操作数组、集合、Map一样去遍历元素。比如说,你可以这么写:

SELECT * FROM user_info WHERE user_name in
<foreach collection="list" item="name" index="index" open="(" close=")" separator=",">
    #{name}
</foreach>

这里的collection是你的数据类型,可以是List、数组或者Map。item是你给每个元素起的别名,随便你喜欢叫什么名字都行,只要在#{}里面也用这个名字就行。

如果你的Dao方法只有一个参数,比如一个List names,或者一个String[] names,那在Mapper.xml里面直接用上面的foreach就可以。如果参数是多个,那么可能就需要用@Param或者Map来指定参数名了。

MyBatis实现In查询

文章目录

    • 一. SQL语法实现In查询
    • 二. MyBatis实现In查询
      • 1. Dao层方法的参数只有一个
      • 2. Dao层方法的参数有多个
        • 2.1 使用@Param(“xxx”)实现
        • 2.2 使用Map实现
    • 参考资料

一. SQL语法实现In查询

  1. SQL语句实现In查询
SELECT * FROM user_info WHERE user_name in ('xixi','haha');

二. MyBatis实现In查询

  1. 错误范例:如果在MyBatis中也使用类似SQL语法来实现In查询,像如下示例,肯定会报错,因为MyBatis不支持这样的写法。

    // Dao 层
    List<UserInfoDO> getUserInfoByNames(@Param("name") String names); // 其中,names="xixi,haha";
    
    <!-- UserInfoMapper.xml文件 -->
    <select id="getUserInfoByNames" resultType="com.zijikanwa.test.model.UserInfoDO">SELECT * FROM user_info WHERE user_name in (#{names})
    </select>
    
  2. 正确途径:MyBatis提供foreach语句实现In查询。foreach语法如下:

  • collection:该属性的对应方法的参数类型可以是List、数组、Map。如果方法的参数类型不属于前三种,则必须和方法参数@Param指定的元素名一致。
  • item: 表示迭代过程中每个元素的别名。可以随便起名,但是必须跟元素中的#{}里面的名称一致。
  • index:表示迭代过程中每次迭代到的位置(下标)
  • open:前缀
  • close:后缀
  • separator:分隔符,表示迭代时每个元素之间以什么分隔。
  1. MyBatis实现In查询的具体细节如下所示。

1. Dao层方法的参数只有一个

  1. 当Dao层方法的参数只有一个时,有两种方式实现:

    • 法1:如果参数类型是List, 则mapper.xml文件中collection值必须为list。
    • 法2:如果参数类型是Array,则mapper.xml文件中collection值必须为array。
  2. 实现示例

public interface UserInfoDao {// 法1:参数类型是ListList<UserInfoDO> getUserInfobyNames1(List<String> names);// 法2:参数类型是ArrayList<UserInfoDO> getUserInfobyNames2(String[] names);
}
<!-- 法1:参数类型是List -->
<select id="getUserInfobyNames1" resultType="com.zijikanwa.model.UserInfoDO">SELECT * FROM user_info WHERE user_name in<foreach collection="list" item="name" index="index" open="(" close=")" separator=",">#{name}</foreach>
</select><!-- 法2:参数类型是Array -->
<select id="getUserInfobyNames2" resultType="com.zijikanwa.ssmspringboottest.model.UserInfoDO">SELECT * FROM user_info WHERE user_name in<foreach collection="array" item="name" index="index" open