Mybatis实现自定义类型转换器TypeHandler的方法
作者:mrr 发布时间:2023-09-28 14:52:22
先给大家简单介绍下mybatis
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
此文其实是java操作Oracle类型XMLType总结二:使用Mybatis附带的一篇小结。
Mybatis实现自定义的转换器,十分的简单,其主要步骤分为三步,这里以操作XMLType类型为例。
第一步
新建一个转换类,实现TypeHandler接口,接口的泛型指定参数类型,不指定则为Object:
public class XmltypeTypeHandler implements TypeHandler<String>
该接口主要有以下4个方法:
public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) public String getResult(ResultSet rs, String columnName) throws SQLException
public String getResult(ResultSet rs, int columnIndex) throws SQLException
public String getResult(CallableStatement cs, int columnIndex) throws SQLException
方法的作用看名字应该就能明白,setParameter是传入参数时的操作,在参数传入到数据库前需要做加工处理的代码,可以写在该方法内,其它三个均为获取查询结果方法,在得到jdbc的查询结果后可以转换为任意你想要的类型。
第二步
在mapper-config中,注册你实现的转换器类,其中jdbcType可以指定的类型在Mybatis的枚举类org.apache.ibatis.type.JdbcType中有明确的定义,不能为该枚举以外的值,不然会出错。这里因为枚举中没有我们需要的XMLType类型,所以指定为UNDEFINED。(也可以不指定具体的类型,在使用时用typeHandler指定具体的类即可):
<typeHandlers>
<typeHandler javaType="string" jdbcType="UNDEFINED" handler="com.tyyd.dw.context.XmltypeTypeHandler"/>
</typeHandlers>
第三步
在你的mapper映射文件中使用类型转换器:
insert into T_Content(
<include refid="fullColumns"/>
) values (
#{controlId,jdbcType=BIGINT},
#{xmlFile,javaType=string,jdbcType=UNDEFINED,typeHandler=com.tyyd.dw.context.XmltypeTypeHandler},
#{drmFile,jdbcType=BLOB}
)
注意传入的xmlFile参数,指定了javaType、jdbcType和typeHandler,表明我们要使用哪个类型处理器,当然你也可以只指定其中的某一项,但是该项存在必须唯一,如果一模一样存在多个又指定不清晰的话,Mybatis会因为不能进行区分而出现错误。
至此,一个mybatis的自定义类型转换器就实现完成了,需要注意的是,上面指定的类型处理器仅在插入数据时起作用,想要在查询时也使用自定义的类型处理器,需要在resultMap内属性的标签中进行指定,其指定的标签javaType、jdbcType和typeHandler名称和使用方式都是一样的,这里就不再赘述。
附上完整的类型转换器代码,因为XMLType类型要查询时,可以使用数据库的xmltype.getclobval()直接返回当成string来操作,所以返回的方法都没有进行特殊处理。(也可以使用xmltype.getstringval()函数返回string,但在实际使用过程中发现当字段为null时,getstringval()会出现ORA-06502:numeric or value error:character string buffer too small的错误,getclobval()则不会出现错误,所以推荐使用getclobval()函数):
/**
* oracle SYS.XMLTYPE 类型自定义处理器
*
* User: liyd
* Date: 13-12-27
* Time: 下午4:53
*/
public class XmltypeTypeHandler implements TypeHandler<String> {
@Override
public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)
throws SQLException {
//防止为null时,创建XMLType出现错误
if (StringUtils.isNotBlank(parameter)) {
DelegatingConnection connection = (DelegatingConnection) ps.getConnection()
.getMetaData().getConnection();
XMLType xmltype = XMLType.createXML(connection.getDelegate(), parameter);
ps.setObject(i, xmltype);
} else {
ps.setString(i, null);
}
}
@Override
public String getResult(ResultSet rs, String columnName) throws SQLException {
//数据库sql查询时xmltype字段使用xmltype.getclobval()返回
return rs.getString(columnName);
}
@Override
public String getResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getString(columnIndex);
}
@Override
public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getString(columnIndex);
}
}
以上所述是小编给大家介绍的Mybatis实现自定义类型转换器TypeHandler的方法网站的支持!


猜你喜欢
- 创建两个场景同时赋值StaticVarious 脚本 然后按键好,H ,J 进行不断切换场景,会发现unity 控制台输出数字不断增加,然后
- springboot jackson配置项目中使用的json是jackson。这个呢是spring boot自带的,一开始是用阿里的fast
- JSON轻量级的数据交换格式相对于XML来说,JSON的解析速度更快,文档更小。JSON的格式{属性名:属性值,属性名:属性值,……}属性名
- 大家都知道由于性能要求,Android要求只能在UI线程中更新UI,要想在其他线程中更新UI,我大致总结了4种方式,欢迎补充纠正:使用Han
- 本文重在实现理解,过滤器,业务,逻辑需求,样式请无视。。项目结构如下1.idea新建Spring boot项目,在pom中加上thymele
- 本文实例讲述了C#连接ODBC数据源的方法。分享给大家供大家参考。具体实现方法如下:// Namespaces, variables, an
- 泛型代码可以让你写出根据自我需求定义、适用于任何类型的,灵活且可重用的函数和类型。它可以让你避免重复的代码,用一种清晰和抽象的方式来表达代码
- 半路开始看的朋友可以回顾一下前几篇java并发编程专题(一)----线程基础知识java并发编程专题(二)----如何创建并运行java线程
- 用来练手还是不错的,分享大家看一下,还是一些新颖点的!哈哈 就是自定义DataGridView,方便每个功能部分调用!简单!再次重
- 下拉刷新对于一个app来说是必不可少的一个功能,在早期大多数使用的是chrisbanes的PullToRefresh,或是修改自该框架的其他
- 本文实例为大家分享了unity使用socket实现聊天室功能的具体代码,供大家参考,具体内容如下示例:什么是Socket:Socket(套接
- 题目:若希望循环队列中的元素都能得到利用,则需设置一个标志域tag,并以tag的值为0或1来区分队头指针front和队尾指针rear相同时的
- 先附上图片上传的代码jsp代码如下:<form action="${path}/upload/uploadPic.do&qu
- 前言Feign是Netflix开源的声明式HTTP客户端,致力于让编写http client更加简单,Feign可以通过声明接口自动构造请求
- 在开发过程中,与用户交互式免不了会用到对话框以实现更好的用户体验,所以掌握几种对话框的实现方法还是非常有必要的。在看具体实例之前先对Aler
- 一、用法:list集合中contains() 用于判断集合中 是否 包含指定的元素。list会将括号内的元素和list中存在的元素进行逐个比
- 本文实现初次设置密码验证过程,首先实现如下效果布局如下:<?xml version="1.0" encoding=
- Java中避免NullPointerException的方法总结在字符串常量上调用equals// good"string lit
- 这是Hadoop学习全程记录第1篇,在这篇里我将介绍一下如何在Linux下安装Hadoop1.x。先说明一下我的开发环境:虚拟机:VMwar
- 这两天我写了一个测试c++异常处理机制的例子,感觉有很好的示范作用,在此贴出来,给c++异常处理的初学者入门。本文后附有c++异常的知识普及