【编码】Mybatis - 使用IN语句查询-详细说明

一. SQL语法实现In查询

1.SQL语句实现In查询

SELECT * FROM user_info WHERE user_name in ('xixi','haha');

二. MyBatis实现In查询

MyBatis提供foreach语句实现In查询。foreach语法如下:

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

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

当Dao层方法的参数只有一个时,有两种方式实现:
法1:如果参数类型是List, 则mapper.xml文件中collection值必须为list。
法2:如果参数类型是Array,则mapper.xml文件中collection值必须为array。


//------------------UserInfoDao.java--------------------
public interface UserInfoDao {
    // 法1:参数类型是List
    List<UserInfoDO> getUserInfobyNames1(List<String> names);
    // 法2:参数类型是Array
    List<UserInfoDO> getUserInfobyNames2(String[] names);
}

//------------------UserInfoMapper.xml--------------------

<!--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来传参数
  • 法3:通过对象来传参数

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>

2.3对象传参实例:

//接口地址     ------------------------------------------------------------
IPage<WarehouseInventoryVO> pageList(Page page, @Param("query") WarehouseInventoryQuery query);

// 核心遍历部分------------------------------------------------------------
WHERE 1 = 1
<!-- 【 ■■■■■■■■■查询条件■■■■■■■■■仓库ID列表】 -->
<if test="query != null and query.warehouseIdList != null and !query.warehouseIdList.isEmpty()">
    AND wi.warehouse_id IN
    <foreach item="item" collection="query.warehouseIdList" open="(" separator="," close=")">
        #{item}
    </foreach>
</if>
### MyBatis 使用指南和常见问题 #### 一、MyBatis 返回行数的技术要点 当利用 MyBatis 执行数据库操作并依赖返回的行数作为成功与否的标准时,需注意 MySQL 数据库默认配置下的行为可能导致误判。具体而言,在某些场景下,匹配行数与受影响行数之间的差异可能引发逻辑错误。为了确保应用稳定运行,建议启用 `useAffectedRows=true` 配置项以获取更精确的结果反馈[^1]。 如果因环境限制而无法设置此选项,则可以考虑采用事务管理机制或其他方式验证数据变更情况,以此规避潜在风险。 #### 二、ResultType 和 ResultMap 的区别 对于 CRUD 操作的支持,MyBatis 提供了两种不同的结果集映射模式——`resultType` 和 `resultMap`: - **resultType**: 直接指定 Java 类型名称用于表示每条记录的数据结构; - **resultMap**: 定义更为复杂的字段到属性间的转换关系,适用于表结构复杂或多表联查的情形; 选择合适的映射策略有助于提高开发效率及程序可维护性[^2]。 #### 三、SQL 动态拼接与安全防护措施 为了避免手动构建 SQL 字符串过程中可能出现的安全隐患(如注入攻击),推荐使用 MyBatis 内建的功能实现动态查询条件组装。例如,借助 `<if>` 或者 `<choose>` 等标签控制语句片段的选择性加入,既简化编码又增强了安全性[^3]。 此外,针对输入参数应始终采取适当的方式进行转义处理,比如通过 `${}` 插值表达式代替直接嵌入变量值的做法已被证明存在极大漏洞,应当予以摒弃。相反地,`${}` 应仅限于那些确实需要被解析成原始文本的内容上,而对于大多数场合来说,应该优先选用带有预编译特性的 `#{}` 占位符语法[^4]。 ```java // 正确做法:使用 #{} public List<User> selectUsers(@Param("name") String name); ``` #### 四、多租户架构下的特殊需求满足 在现代企业级项目中,经常会遇到多个客户共享同一套物理存储资源的情况,即所谓的“多租户”。此时可以通过自定义插件或拦截器等方式向每次请求附加额外的身份标识信息,从而达到隔离不同用户组之间访问权限的目的。以 MyBatis-Plus 为例,默认实现了基于 `app_code` 字段过滤的目标表格记录功能[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值