myBatis自定义传入参数类型(TypeHandler)

为了要在myBatis查询时使用特殊的数据类型时,使用通常的jdbcType不能满足需要的时候,可以使用自定义的类型TypeHandler。

例如,有一个存储过程,我们自定义了一个类型Employee,Employee中有两个属性id(long型),name(String型),然后又要将其放在一个List中,作为参数给一个存储过程批量处理。

以下为Orcale类型:

create or replace
TYPE Employee AS OBJECT
(
ID NUMBER,
NAME VARCHAR2(100 BYTE)
)

create or replace
TYPE Employee_TABLE
AS TABLE OF Employee;


有存储过程如下:

create or replace
PROCEDURE Employee_Process
(
FK_LIST IN Employee_TABLE
) AS
BEGIN
FOR I IN 1..FK_LIST.COUNT LOOP
--操作
END LOOP;
COMMIT;
END Employee_Process;


自定义handler

import ...

//这个jdbcType对应mapper文件中对应的jdbcType
//如果此处不做配置也可以在mybatis-config.xml中配置
@MappedJdbcTypes(JdbcType.ARRAY)
public class MyHandler implements TypeHandler {

public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {

//获取OracleConnection
C3P0NativeJdbcExtractor cp30NativeJdbcExtractor = (C3P0NativeJdbcExtractor) new C3P0NativeJdbcExtractor();
OracleConnection oracleConn=(OracleConnection)cp30NativeJdbcExtractor.getNativeConnection(ps.getConnection());
//这个parameter就是我们自己在mapper中传入的参数
List<Object> dto = (ArrayList<Object>) parameter;
StructDescriptor sd = new StructDescriptor("Employee",oracleConn);
STRUCT[] result = new STRUCT[dto.size()];
for(int index = 0; index < dto.size(); index++){
AccountCommissionDetailDto d = dto.get(index);
Object[] o = new Object[3];
o[0] = new Long("1"); //id
o[1] = new String("aaa"); //name
result[index] = new STRUCT(sd,oracleConn,o);
}
ArrayDescriptor des_Employee_TABLE = ArrayDescriptor.createDescriptor("Employee_TABLE",oracleConn);
ARRAY oracle_array = new ARRAY(des_Employee_TABLE,oracleConn,result);
ps.setArray(i, oracle_array);
}

public Object getResult(ResultSet rs, String columnName) throws SQLException {
log.error("no result!");
return null;
}

public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
log.error("no result!");
return null;
}
}


mybatis-config.xml中加入如下的代码声明自定义handler
如果没有在Handler中注释jdbcType也可在这里设置

<typeHandlers>
<typeHandler javaType="list" <!--jdbcType="ARRAY"--> handler="com.package.MyHandler"/>
</typeHandlers>


最后只要在mapper中做如下设置就能使用了

#{dtos,jdbcType=ARRAY,javaType=list}

或者直接定义需要调用的Handler的类型

#{dtos,jdbcType=ARRAY,javaType=list,typeHandler=com.package.MyHandler}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要定义一个能同时处理 JSONArray 和 JSONObject 类型TypeHandler,您可以使用 `com.alibaba.fastjson.JSON` 类对 JSON 字符串进行序列化和反序列化。以下是一个示例的 TypeHandler 实现: ```java import com.alibaba.fastjson.JSON; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class JsonTypeHandler extends BaseTypeHandler<Object> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, JSON.toJSONString(parameter)); } @Override public Object getNullableResult(ResultSet rs, String columnName) throws SQLException { String json = rs.getString(columnName); if (json != null) { return JSON.parse(json); } return null; } @Override public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String json = rs.getString(columnIndex); if (json != null) { return JSON.parse(json); } return null; } @Override public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String json = cs.getString(columnIndex); if (json != null) { return JSON.parse(json); } return null; } } ``` 在上述示例代码中,我们定义了一个名为 `JsonTypeHandler` 的 TypeHandler,继承了 MyBatis 的 `BaseTypeHandler` 类。 在 `setNonNullParameter()` 方法中,我们将传入参数对象使用 `JSON.toJSONString()` 方法转换为 JSON 字符串,并将其设置为 PreparedStatement 的参数。 在 `getNullableResult()` 方法中,我们从 ResultSet 或 CallableStatement 中获取 JSON 字符串,并使用 `JSON.parse()` 方法将其解析为对应的 Java 对象。 要在 MyBatis 中使用自定义TypeHandler,您需要在 MyBatis 的配置文件中进行配置。在您的 `mybatis-config.xml` 或 `application.properties` 文件中,添加以下配置: ```xml <typeHandlers> <typeHandler handler="com.example.JsonTypeHandler"/> </typeHandlers> ``` 或 ```properties mybatis.type-handlers=com.example.JsonTypeHandler ``` 确保将 `com.example.JsonTypeHandler` 替换为您实际自定义 TypeHandler 的包路径和类名。 通过以上步骤,您应该能够成功定义一个能同时处理 JSONArray 和 JSONObject 类型TypeHandler,并解决在 MyBatis 使用 JSON 数据时的报错问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值