为了要在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}
分享到:
相关推荐
介绍了mybatis自定义标签,添加自定义标签的实现代码,通过实例代码展示给大家
mybatis 自定义生成 entity/dao/mapper.xml 文件
特殊字符(\,_,%)转义工具类 MyQueryInterceptor.java: Mybatis自定义拦截器 注意:该拦截器只支持QueryWrapper的like方法,serviceImpl层传全角模糊查询(%%) mapper或xml层的全角模糊查询(%*%)和半角模糊查询(%*或*%)
代码包含: EscapeUtil.java:特殊字符(\,_,%)转义工具类 MyQueryInterceptor.java: Mybatis自定义拦截器 注意:该拦截器只支持QueryWrapper的like方法,serviceImpl层传全角模糊查询(%%) mapper或xml层的全角模糊查询(%...
利用自定义jstl标签,实现mybatis分页查询
Mybatis实现自定义的转换器非常的简单,只需要三步就可以实现自定义类型转换器TypeHandler,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
主要给大家介绍了关于MyBatis自定义typeHandler的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MyBatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
主要介绍了MyBatis使用自定义TypeHandler转换类型的实现方法,本文介绍使用TypeHandler 实现日期类型的转换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
1.springbood+mybatis项目demo 2.mybatis自定义枚举类型的转换器以及各种使用场景
MyBatis自定义插件原理
NULL 博文链接:https://gaojingsong.iteye.com/blog/2338178
本博客有零基础入门MyBaits,欢迎关注
主要介绍了Mybatis实现自定义的typehandler三步曲的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
mybatis自定义插件源码,实现了在插入数据记录时自动添加自定义字段值,sql拦截和改造。
本文主要介绍了Mybatis中自定义TypeHandler处理枚举的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
mybatis自定义注解完成数据库切库
解决在springboot+mybatis+postgresql时,数据库字段类型为json时,如何与mybatis进行映射
主要介绍了Mybatis自定义TypeHandler解决特殊类型转换问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Mybatis自定义框架及使用文档结构1.1目录视图Mybatis入门·mybatis的概述·mybatis的环境搭建·mybatis入门案例mybatis基本