在MyBatis Mapper中处理String[]数组参数
当需要在MyBatis Mapper接口中传入String[]数组类型参数时,可以通过以下几种方式实现:
基本实现方式
Mapper接口定义
public interface UserMapper {
List<User> selectUsersByNames(@Param("names") String[] names);
}
XML映射文件写法
<select id="selectUsersByNames" resultType="User">
SELECT * FROM user
WHERE name IN
<foreach collection="names" item="name" open="(" separator="," close=")">
#{name}
</foreach>
</select>
不使用@Param注解的写法
如果不想使用@Param注解,可以直接使用array作为集合名称:
Mapper接口
public interface UserMapper {
List<User> selectUsersByNames(String[] names);
}
XML映射文件
<select id="selectUsersByNames" resultType="User">
SELECT * FROM user
WHERE name IN
<foreach collection="array" item="name" open="(" separator="," close=")">
#{name}
</foreach>
</select>
处理空数组的安全写法
为了防止传入空数组导致SQL语法错误,可以添加判断:
<select id="selectUsersByNames" resultType="User">
SELECT * FROM user
<where>
<if test="names != null and names.length > 0">
name IN
<foreach collection="names" item="name" open="(" separator="," close=")">
#{name}
</foreach>
</if>
<if test="names == null or names.length == 0">
1=0
</if>
</where>
</select>
使用JOIN方式处理大量数据
当数组元素很多时(如超过1000个),可以使用JOIN方式:
<select id="selectUsersByNames" resultType="User">
SELECT u.* FROM user u
JOIN (
<foreach collection="names" item="name" separator="UNION ALL">
SELECT #{name} AS name
</foreach>
) temp ON u.name = temp.name
</select>
调用示例
// 调用示例
String[] names = {"张三", "李四", "王五"};
List<User> users = userMapper.selectUsersByNames(names);
注意事项
数组参数在XML中可以通过array关键字引用,但使用@Param注解指定名称更清楚;
对于大量数据(如超过1000个元素),应考虑分批查询;
字符串数组中的元素会自动进行SQL转义,防止SQL注入;
如果数组可能为null,应在XML中添加判空逻辑,以提高代码安全性;
以上方法可以根据实际业务需求选择使用。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Dominic
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果

