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的方法网站的支持!
猜你喜欢
- 先看看下面的代码能不能编译通过:public static void main(String[] args) {List l1 = new
- 本文实例讲述了C#计算字符串相似性的方法。分享给大家供大家参考。具体如下:计算字符串相似性的办法很多,甚至最笨的办法可以挨个匹配,这里要讲的
- 由 CardLayout 类实现的布局管理器称为卡片布
- 一、传递参数既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员(方法、属性、索引器、运算符和构造函数)更改参数的值,并保持该更
- 光流的概念是由一个叫Gibson的哥们在1950年提出来的。它描述是空间运动物体在观察成像平面上的像素运动的瞬时速度,利用图像序列中像素在时
- C++对string进行大小写转换操作方法方法一:使用C语言之前的方法,使用函数,进行转换#include <iostream>
- 前言如今发短信功能已经成为互联网公司的标配,本篇文章将一步步实现java发送短信考察了许多提供短信服务的三方,几乎所有都需要企业认证才可以使
- 本文是基于springboot完成测试测试代码地址如下:https://github.com/Dr-Water/springboot-act
- 本文实例讲述了C#中HttpWebRequest的用法。分享给大家供大家参考。具体如下:HttpWebRequest类主要利用HTTP 协议
- 在Google I/O 2017中,Google 宣布 Kotlin 成为 Android 官方开发语言。为什么选择 Kotlin? 简洁:
- 本文实例为大家分享了struts2和hibernate实现登录和注册功能,供大家参考,具体内容如下1、该项目使用MySQL数据库,数据库名为
- 先给出网页地址:https://wall.alphacoders.com/featured.php?lang=Chinese主要步骤:利用J
- 多选和单选的不同之处单选的时候,选中一个就可以直接把结果返回,因此本身底部弹窗无需状态管理。但到多选的时候,需要知道当前选中的选项,有选项被
- 一、引言Good Good Study,Day Day Up,童鞋点个关注,不迷路,么么哒~~~MP自带的条件构造器虽然很强大,有时候也避免
- 利用 Spring 工厂加载机制,实例化 ApplicationListener 实现类,并排序对象集合创建应用事件 * 创建类实现接口Ap
- 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题:class Grandpa{static{System.o
- 介绍大家都知道微信支付的回调链接要求不能跟参数,但又要接收返回的xml数据。我开始使用@RequestBody注解在参数上,希望能获取xml
- 一、多线程的优缺点多线程的优点:1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快多线程的代价:1)设计更复杂虽然有一些多线程
- 这篇文章主要介绍了springboot2.0如何通过fastdfs实现文件分布式上传,文中通过示例代码介绍的非常详细,对大家的学习或者工作具
- static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概