如何调用DB2存储过程传递List<String>参数并解决createArrayOf报错
错误根因
AbstractMethodError是因为你调用的createArrayOf是JDBC 4.0版本才新增的接口方法,当前运行环境没有对应实现:
- WebSphere 8.5内置的数据源连接代理默认遵循JDBC 3.0规范,你代码里拿到的
Connection是WebSphere包装后的代理对象,没有实现该方法 - DB2 JDBC驱动本身也不支持JDK标准的
createArrayOf接口,需要使用DB2专属的数组创建API - DB2不支持直接使用
VARCHAR作为数组类型名,需要先在数据库层面定义自定义数组类型
解决步骤
1. 开启WebSphere数据源原生连接访问权限
登录WebSphere管理控制台,进入对应数据源的配置页,找到「WebSphere 特定数据源属性」,开启「允许访问底层原生连接」选项,保存后重启服务生效。
2. 修改类型处理器代码,获取DB2原生连接
将类型处理器中获取连接、创建数组的逻辑替换为以下代码:
// 获取代理连接 Connection proxyCon = arg0.getConnection(); // 解包拿到DB2原生连接 com.ibm.db2.jcc.DB2Connection con = proxyCon.unwrap(com.ibm.db2.jcc.DB2Connection.class); // 使用DB2专属API创建数组,VARCHAR_ARRAY为数据库中预先定义的数组类型 string = con.createArray("VARCHAR_ARRAY", stringArray);
3. 预先在DB2中创建自定义数组类型
执行SQL创建对应长度的字符串数组类型,示例如下:
-- 可根据实际业务调整字符串长度、数组最大容量 CREATE TYPE VARCHAR_ARRAY AS VARCHAR(10) ARRAY[100];
4. 修改MyBatis Mapper配置
将数组参数的jdbcTypeName修改为你创建的自定义数组类型名:
#{param.addOrRemoveList, jdbcType=ARRAY, mode=IN, jdbcTypeName=VARCHAR_ARRAY, typeHandler=com.pseuplex.core.db.handlers.StringHandler}
兜底兼容方案
如果无法修改WebSphere配置获取原生连接,可使用兼容性更高的实现方式:
将货币代码列表拼接为逗号分隔的字符串传入存储过程,在存储过程内部拆分字符串转为数组处理,无需依赖JDBC版本特性。
内容的提问来源于stack exchange,提问作者Pseuplex
相关产品推荐
相关产品推荐

