MyBatis实现In查询


一. 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:参数类型是List
    List<UserInfoDO> getUserInfobyNames1(List<String> names);

    // 法2:参数类型是Array
    List<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="(" close=")" separator=",">
        #{name}
    </foreach>
</select>

2. Dao层方法的参数有多个

  1. 当Dao层方法的参数有多个时,有两种方式实现:
    • 法1:使用@Param(“xxx”)进行参数绑定
    • 法2:通过Map来传参数
2.1 使用@Param(“xxx”)实现
  • UserInfoDao.java
public interface UserInfoDao {
    List<UserInfoDO> getUserInfobyIdAndName1(@Param("id") int id, @Param("names") String[] names);
}
  • UserInfoMapper.xml
<select id="getUserInfobyIdAndName1" resultType="com.zijikanwa.ssmspringboottest.model.UserInfoDO">
    SELECT * FROM user_info WHERE user_info_id=#{id} and user_name in
    <foreach collection="names" item="name" index="index" open="(" close=")" separator=",">
        #{name}
    </foreach>
</select>
2.2 使用Map实现
  • UserInfoDao.java
public interface UserInfoDao {
    List<UserInfoDO> getUserInfobyIdAndName2(Map<String,Object> params);
}
  • UserInfoMapper.xml
<select id="getUserInfobyIdAndName2" resultType="com.zijikanwa.ssmspringboottest.model.UserInfoDO">
    SELECT * FROM user_info WHERE user_info_id=#{id} and user_name in
    <foreach collection="names" item="name" index="index" open="(" close=")" separator=",">
        #{name}
    </foreach>
</select>

参考资料

Mybatis中的in查询是通过使用条件构造器来实现的。在Mybatis-plus框架中,可以使用QueryWrapper类的in方法来进行in查询。例如,可以使用下面的代码来进行in查询: ``` QueryWrapper<Student> qw = new QueryWrapper<>(); qw.in("id", 7, 9); List<Student> students = studentMapper.selectList(qw); ``` 其中,QueryWrapper类是Mybatis-plus框架提供的条件构造器,in方法用于指定in查询的条件字段和条件值。在这个例子中,我们指定了id字段,并且查询条件为id等于7或9的记录。执行selectList方法后,将返回符合条件的学生列表。 除了直接指定条件值,也可以使用Map来传递条件值。例如: ``` Map<String, Object> params = new HashMap<>(); params.put("name", name); params.put("idList", ids); mapper.selectByIdSet(params); ``` 在这个例子中,我们使用Map来传递条件值,其中name和idList分别对应条件字段和条件值。在selectByIdSet方法中,可以使用参数名来引用Map中的值,并在SQL语句中使用foreach标签来遍历idList的值进行in查询。 总结起来,Mybatis中的in查询可以通过条件构造器的in方法来实现,可以直接指定条件值,也可以使用Map来传递条件值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Mybatis中使用in()查询](https://blog.csdn.net/Syals/article/details/125407251)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [MyBatisin的使用](https://blog.csdn.net/dxyzhbb/article/details/107958528)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值