当前位置:首页 > Java技术 > Mybatis自定义TypeHandler向数据库中插入Blob数据

Mybatis自定义TypeHandler向数据库中插入Blob数据

2022年09月16日 14:49:45Java技术10

一、引言

最近在做一个客户端日志统计分析的模块,被Java实体类中属性类型与数据库字段属性匹配问题搞的头大。抽个时间,对Mybatis中自定义TypeHandler做一个总结吧。

简单描述一下需求:客户端上报日志接口中,有一个异常内容字段,对应Java实体类excepContent属性,类型为String(此处应该定义为byte[]类型),对应的数据库中的字段为excp_content,类型为blob。

当我们拿到这样一个实体类往数据库中插入数据时,毫无疑问,会报类型不匹配异常,读取时也会报异常。

二、自定义TypeHandler

上面的问题怎么解决呢?这就需要自定义一个TypeHandler类型处理器。实现TypeHandler接口或继承BaseTypeHander都可以。

@MappedJdbcTypes(JdbcType.BLOB) // 声明数据库中对应数据类型
@MappedTypes(value = String.class) // 转化后的数据类型
public class CustomBlobTypeHandler extends BaseTypeHandler<String> {
     

	// 数据插入数据库时调用此方法
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, 
    				String parameter, JdbcType jdbcType)
            throws SQLException {
     
        // 声明一个输入流对象
        ByteArrayInputStream bis = null;
        try {
     
            // 把字符串转为字节流
            bis = new ByteArrayInputStream(parameter.getBytes("gbk"));
        } catch (Exception e) {
     
            throw new RuntimeException("Blob Encoding Error!");
        } finally {
     
            if (bis != null) {
     
                try {
     
                    bis.close();
                } catch (IOException e) {
     
                    throw new RuntimeException("Blob Encoding Error!");
                }
            }
        }
        ps.setBinaryStream(i, bis, parameter.length());
    }


	// 从数据库中读取数据时调用此方法
    @Override
    public String getNullableResult(ResultSet rs, String columnName) 
    		throws SQLException {
     
        Blob blob = (Blob) rs.getBlob(columnName);
        byte[] returnValue = null;
        if (null != blob) {
     
            returnValue = blob.getBytes(1, (int) blob.length());
        }
        try {
     
            //将取出的流对象转为utf-8的字符串对象
            return new String(returnValue, "gbk");
        } catch (Exception e) {
     
            throw new RuntimeException("Blob Encoding Error!");
        }
    }

	// 读取方法同上,方法重载
    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) 
    			throws SQLException {
     
        Blob blob = (Blob) rs.getBlob(columnIndex);
        byte[] returnValue = null;
        if (null != blob) {
     
            returnValue = blob.getBytes(1, (int) blob.length());
        }
        try {
     
            // 将取出的流对象转为utf-8的字符串对象
            return new String(returnValue, "gbk");
        } catch (Exception e) {
     
           throw new RuntimeException("Blob Encoding Error!");
        }
    }

	// 读取方法同上,方法重载
    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) 
    		throws SQLException {
     
        Blob blob = (Blob) cs.getBlob(columnIndex);
        byte[] returnValue = null;
        if (null != blob) {
     
            returnValue = blob.getBytes(1, (int) blob.length());
        }
        try {
     
            //将取出的流对象转为utf-8的字符串对象
            return new String(returnValue, "gbk");
        } catch (Exception e) {
     
           throw new RuntimeException("Blob Encoding Error!");
        }
    }
}

自定义的TypeHandler类型处理器写好了,很简单。但怎么让这个自定义处理器起作用呢?这就需要在配置文件中配置。

三、如何配置

关于如何让自定义TypeHandler生效,分两种情况。一种是Mybatis配置,另一种是tk.mybatis配置。

1、Mybatis配置

此情况下,又分为两种情况。
(1)、全局配置

mybatis:
  config-location: classpath:mybatis-config.xml  # mybatis配置文件位置
  mapperLocations: classpath:mapper/*.xml # mybatis mapper文件位置
  typeAliasesPackage: com.example.domain # java实体类所在包
  type-handlers-package: com.scorpios.analyse.typehandler # 自定义TypeHandler所在包

此种配置方式,全局有效,不用其他任何配置。

(2)、局部配置:在处理某个字段时,设置typeHandler。比较繁琐。

在数据插入时,我们可以做如下指定:

#{
     excpContent,typeHandler="com.scorpios.analyse.typehandler.CustomBlobTypeHandler"}

数据读取时,我们可以用<resultMap>来封装,在属性后面指定typeHandler属性即可。

<result column="excp_content" property="excpContent" typeHandler="com.scorpios.analyse.typehandler.CustomBlobTypeHandler" />

注意:如果在参数位置修改TypeHandler,应该保证保存数据和查询数据用的TypeHandler是一样的。

2、tk.mybatis配置

(1)、全局级别:在 MyBatis 配置文件中配置 typeHandlers。和上述全局配置一样。

(2)、字段级别:@ColumnType 注解

@ColumnType(typeHandler=CustomBlobTypeHandler .class)
private String excpContent;

作者:止步前行
来源链接:https://blog.csdn.net/zxd1435513775/article/details/105063463

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/41938.html

标签: MyBatis
分享给朋友:

“Mybatis自定义TypeHandler向数据库中插入Blob数据” 的相关文章

MyBatis配置的pom文件

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/200...

mybatis:在springboot中的配置

## Mybatis 配置 mybatis.type-aliases-package=com.xfind.core.entity.xianyu mybatis.mapper-locations=classpath:mapper/*.xml #使全局的映射器启用或禁用缓存。 mybati...

SSM:spring+springmvc+mybatis框架中的XML配置文件功能详细解释(转)

原文:https://blog.csdn.net/yijiemamin/article/details/51156189# 这几天一直在整合SSM框架,虽然网上有很多已经整合好的,但是对于里面的配置文件并没有进行过多的说明,很多人知其然不知其所以然,经过几天的搜索和整理,今天总算...

Mybatis分页插件PageHelper的配置和使用方法

Mybatis分页插件PageHelper的配置和使用方法

http://www.cnblogs.com/kangoroo/p/7998433.html   前言 在web开发过程中涉及到表格时,例如dataTable,就会产生分页的需求,通常我们将分页方式分为两种:前端分页和后端分页。 前端...

Mybatis Generator最完整配置详解

Mybatis Generator最完整配置详解

背景 通过mybatis插件自动生成代码 MyBatis 介绍 MyBatis 是一款标准的 ORM 框架,被广泛的应用于各企业开发中。MyBatis 最早是 Apache 的一个开源项目 iBatis,2010 年这个项目由 Apache Software F...

Mybatis使用xml方式配置

Mybatis使用xml方式配置

官网地址:https://mybatis.org/mybatis-3/zh/getting-started.html 使用案例: 我们创建一个数据库叫做mybatis,在其下创建userinfo数据表,然后创建相应的字段,对应的数据库字段如下: 然后,...

Mybatis Generator配置详解

参考:http://www.jianshu.com/p/e09d2370b796          http://mbg.cndocs.tk <?xml version="1.0" encoding="UTF...

Mybatis配置

Mybatis配置

Mybatis配置文件并不复杂,它的所有元素如下: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Confi...

MyBatis配置下划线转驼峰

myBatis配置实现数据库字段下划线映射到java对象的驼峰式命名属性。 要实现上面的配置需要在mybatis-config.xml配置文件中添加如下设置: <?xml version="1.0" encoding="UTF-8" ?>...

SpringBoot整合Mybatis,application.properties里面mybatis.type-aliases-package配置失效

问题 正常情况下只要,在application.properties文件中作了一下配置: mybatis.type-aliases-package=com.nowcoder.community.entity 就可以在mabatis的映...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。