Mybatis实现自定义类型转换器TypeHandler的方法

 更新时间:2016年07月22日 10:38:19   投稿:mrr  
Mybatis实现自定义的转换器非常的简单,只需要三步就可以实现自定义类型转换器TypeHandler,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧

先给大家简单介绍下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的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Spring @Transactional事务失效的原因分析

    Spring @Transactional事务失效的原因分析

    一个程序中不可能没有事务,Spring中,事务的实现方式分为两种:编程式事务和声明式事务。日常项目中,我们都会使用声明式事务 @Transactional来实现事务,本文来和大家聊聊什么情况会导致@Transactional事务失效
    2022-09-09
  • Java 通过JDBC连接Mysql数据库

    Java 通过JDBC连接Mysql数据库

    本文给大家详细介绍了java如何使用JDBC连接Mysql的方法以及驱动包的安装,最后给大家附上了java通过JDBC连接其他各种数据库的方法,有需要的小伙伴可以参考下。
    2015-11-11
  • 浅谈Java中的n种随机数产生办法

    浅谈Java中的n种随机数产生办法

    众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的:产生一个0到1之间的随机数。看似简单,但有时我们也会忽略了一些有趣的功能。
    2015-09-09
  • mybatis判断list不为空/大小的问题

    mybatis判断list不为空/大小的问题

    这篇文章主要介绍了mybatis判断list不为空/大小的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java实现添加文字水印&图片水印的方法详解

    Java实现添加文字水印&图片水印的方法详解

    为图片添加水印的主要作用是保护图片版权,防止图片被未经授权的人使用或传播。本文为大家介绍了Java实现添加文字水印&图片水印的具体方法,需要的可以参考一下
    2023-02-02
  • Java Spring的核心与设计思想你知道吗

    Java Spring的核心与设计思想你知道吗

    这篇文章主要为大家详细介绍了Java Spring的核心与设计思想,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 解决HttpServletResponse和HttpServletRequest取值的2个坑

    解决HttpServletResponse和HttpServletRequest取值的2个坑

    这篇文章主要介绍了解决HttpServletResponse和HttpServletRequest取值的2个坑问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 老生常谈设计模式之动态代理

    老生常谈设计模式之动态代理

    下面小编就为大家带来一篇老生常谈设计模式之动态代理。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Java OpenCV实现图像镜像翻转效果

    Java OpenCV实现图像镜像翻转效果

    这篇文章主要为大家详细介绍了Java OpenCV实现图像镜像翻转效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • java中VO的使用解析

    java中VO的使用解析

    这篇文章主要介绍了java中VO的使用解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10

最新评论