MyBatis如何在XML映射文件中定义数组并传入Java静态方法?
MyBatis mapper文件传递String数组到Java静态方法实现方案
该操作完全可以实现,MyBatis内置的OGNL表达式支持直接构造数组类型,同时支持调用Java静态方法,二者可以结合使用完成需求。
实现步骤
1. 准备待调用的Java静态方法
首先确保目标方法为public static修饰,入参类型匹配String数组,示例如下:
package com.example.common; import java.util.Arrays; public class ArrayProcessUtil { // 示例方法:对传入的String数组进行去重处理 public static String[] deduplicateStrArray(String[] originArray) { if (originArray == null) { return new String[0]; } return Arrays.stream(originArray).distinct().toArray(String[]::new); } }
2. 在mapper映射文件中调用
分为两种常见场景:
- 场景1:直接在mapper中自定义String数组作为参数传递
直接通过OGNL语法构造数组,传入静态方法即可:
<select id="queryUserByTags" resultType="com.example.entity.User"> SELECT id,username,tags FROM user <where> FIND_IN_SET(tag, <!-- 直接构造String数组传入静态方法,获取处理后的返回值作为查询参数 --> #{@com.example.common.ArrayProcessUtil@deduplicateStrArray(new String[]{'admin','normal','guest'})} ) </where> </select>
- 场景2:将Mapper接口传入的String数组参数转发给静态方法
如果数组是从业务层通过Mapper接口传递过来的,直接写参数名即可:
Mapper接口示例:
List<User> queryUserByTags(String[] tags);
对应的Mapper xml写法:
<select id="queryUserByTags" resultType="com.example.entity.User"> SELECT id,username,tags FROM user <where> FIND_IN_SET(tag, #{@com.example.common.ArrayProcessUtil@deduplicateStrArray(tags)} ) </where> </select>
注意事项
- 调用静态方法时如果类不在
java.lang包下,必须写全限定类名 - 构造数组的OGNL语法和Java原生语法一致,要保证数组元素类型和静态方法入参类型匹配,避免出现类型转换异常
- 如果静态方法有多个参数,按顺序传入即可,数组可以和其他类型参数混合传递
内容的提问来源于stack exchange,提问作者Dawid Pawlak
相关产品推荐
相关产品推荐

