当需要在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);

注意事项

  1. 数组参数在XML中可以通过array关键字引用,但使用@Param注解指定名称更清楚;

  2. 对于大量数据(如超过1000个元素),应考虑分批查询;

  3. 字符串数组中的元素会自动进行SQL转义,防止SQL注入;

  4. 如果数组可能为null,应在XML中添加判空逻辑,以提高代码安全性;

  5. 以上方法可以根据实际业务需求选择使用。