​Mybatis的MapperXML映射文件应该处理数据库字段类型为CLOB和BLOB类型的数据呢?首先我们先看下CLOB和BLOB这两种数据类型的介绍。

介绍

使用Mybatis时涉及到两种特殊类型的处理,分别是Blob(Binary Large Object)和Clob(Character Large Object)。Blob表示二进制大对象字段,而Clob则表示大字符对象字段。这两种类型需要特殊处理。

Blob主要用于存储大型二进制数据,例如图像、音频或视频文件等。而Clob则用于存储大量文本数据,比如长篇文章、日志等。在JDBC中,PreparedStatement和ResultSet提供了相应的方法来支持Blob和Clob的操作,使得在数据库中存储和检索这些大型数据变得更加容易。

本文首发:https://www.panziye.com/java/7876.html

Mybatis作为一个持久层框架,也对Blob和Clob类型进行了支持。不同版本的Mybatis都提供了对这些类型的存储和读取操作的功能。下面将详细介绍Mybatis中如何操作Clob字段。

对应关系

BLOB和CLOB在不一样的数据库中对应的类型也不同:

MySQL中:clob对应text/longtext,blob对应blob

Oracle中:clob对应clob,blob对应blob

Mapper.xml映射

Mapper文件中查询sql的id为queryByList,report_summary为Oracle数据库中的一个字段,是CLOB类型。myClob为java类,在java类中定义一个String类型的字段reportSummary,用于接收CLOB信息。

1)Mapper.xml文件加入如下配置可以读取CLOB和BLOB类型的数据

jdbcType="CLOB" typeHandler="org.apache.ibatis.type.ClobTypeHandler"
jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BLOBTypeHandler"

2)案例代码

<select id="queryByList" parameterType="Map" resultMap="queryBaseResultMap">
select id ,title,type,report_summary,author from my_clob
where 1 = 1 order by ${orderByClause}
</select>
<resultMap id="queryBaseResultMap" type="com.mxm.model.MyClob" >
<id column="Id" property="id" jdbcType="INTEGER" />
<result column="type" property="type" jdbcType="INTEGER" />
<result column="title" property="title" jdbcType="VARCHAR" />
<result column="author" property="author" jdbcType="VARCHAR" />
<result column="report_summary" property="reportSummary" jdbcType="CLOB" typeHandler="org.apache.ibatis.type.ClobTypeHandler">
</resultMap>

3)如果你的Clob是文本信息,在java实体类中,可以直接使用String字符串去接收处理。

扩展

上面使用的是默认的mybatis提供的ClobTypeHandler,当然,你也可以自定义自己的handler进行处理,这样会有更好的灵活性。这里演示blob与String转换。

场景

数据库中有一个blob字段,在java中用String接收。使用如下方式读取:

<select id="find" resultType="com.example.bean.User">
select id, name, experience, createTime
from user
</select>

如果这里的experience字段为blob类型,那么取出来的数据就会乱码。

解决方法是自定义一个TypeHandler,通过继承BaseTypeHandler类实现。如下。

BlobToStringTypeHandler

先看xml应用:

<resultMap id="UserResultMap" type="com.example.bean.User">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<result property="experience" column="experience" typeHandler="com.example.handler.BlobToStringTypeHandler"></result>
<result property="createTime" column="createTime"></result>
</resultMap> <select id="find" resultMap="UserResultMap">
select id, name, experience, createTime
from user
</select>

再看BlobToStringTypeHandler代码:

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType; import java.sql.*; public class BlobToStringTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter);
} @Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
Blob blob = rs.getBlob(columnName);
return new String(blob.getBytes(1, (int)blob.length()));
} @Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
Blob blob = rs.getBlob(columnIndex);
return new String(blob.getBytes(1, (int)blob.length()));
} @Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
Blob blob = cs.getBlob(columnIndex);
return new String(blob.getBytes(1, (int)blob.length()));
}
}

以上,通过继承BaseTypeHandler并实现其方法,将sql的blob类型字段与java的String类型互相转换。

附录

这里附上Mybatis JdbcType与Oracle、MySql数据类型对应列表

JdbcType Oracle MySql
ARRAY    
BIGINT   BIGINT
BINARY    
BIT   BIT
BLOB BLOB BLOB
BOOLEAN    
CHAR CHAR CHAR
CLOB CLOB 修改为TEXT
CURSOR    
DATE DATE DATE
DECIMAL DECIMAL DECIMAL
DOUBLE NUMBER DOUBLE
FLOAT FLOAT FLOAT
INTEGER INTEGER INTEGER
LONGVARBINARY    
LONGVARCHAR LONG VARCHAR  
NCHAR NCHAR  
NCLOB NCLOB  
NULL    
NUMERIC NUMERIC/NUMBER NUMERIC/
NVARCHAR    
OTHER    
REAL REAL REAL
SMALLINT SMALLINT SMALLINT
STRUCT    
TIME   TIME
TIMESTAMP TIMESTAMP TIMESTAMP/DATETIME
TINYINT   TINYINT
UNDEFINED    
VARBINARY    
VARCHAR VARCHAR VARCHAR

如果表格中有遗漏,​可以直接看官方文档

总结

以上就是MyBatis MapperXML如何处理CLOB和BLOB类型数据的全部内容,希望对你Java框架的学习有帮助!

推荐阅读

MyBatis Plus如何解决百万级大数据量查询慢问题

MyBatis Mapper映射处理CLOB和BLOB类型的更多相关文章

  1. 基于PLSQL的数据库备份方法及如何解决导出clob和blob类型数据报错的问题

    基于PL/SQL的数据库备份方法 PL/SQL Developer是Oracle 数据库中用于导入或导出数据库的主要工具,本文主要介绍了利用PL/SQL Developer导入和导出数据库的过程,并对 ...

  2. 框架学习系列 mybatis mapper映射文件之输出映射

    1: mapper映射文件输出映射(输入类型) 2:resultType的使用 3:resultMap的使用 3:总结&下节预告 本文是<凯哥陪你学系列-框架学习之mybatis框架学习 ...

  3. 自己挖的坑自己填--Mybatis mapper文件if标签中number类型及String类型的坑

    1.现象描述 (1)使用 Mybatis 在进行数据更新时,大部分时候update语句都需要通过动态SQL进行拼接.在其中,if标签中经常会有 xxx !='' 这种判断,若 number 类型的字段 ...

  4. Mybatis Mapper 映射文件(xxxMapper.xml)

    什么是 Mapper 映射文件 Mapper 映射文件是 Mybatis 用于实现 ORM 映射规则的配置文件,Mybatis 通过映射文件可将数据库查询结构映射为 Java 对象. 创建 Mappe ...

  5. mybatis mapper映射文件全解

    目录 select.update.delete.insert 设置参数类型以及取值 基本数据类型 对象数据类型 map数据类型 #{  } 和 ${  } 的区别 ResultMap Auto-map ...

  6. 小峰mybatis(1) 处理clob,blob等。。

    一.mybatis处理CLOB.BLOB类型数据 CLOB:大文本类型:小说啊等大文本的:对应数据库类型不一致,有long等: BLOB:二进制的,图片:电影.音乐等二进制的: 在mysql中: bl ...

  7. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. mybatis学习之CLOB、BLOB处理及多参数方法映射

    CLOB数据mysql对应数据类型为longtext.BLOB类型为longblob: model实体: ... private Integer id; private String name; pr ...

  9. mybatis 处理CLOB/BLOB类型数据

    BLOB和CLOB都是大字段类型. BLOB是按二进制来存储的,而CLOB是可以直接存储文字的. 通常像图片.文件.音乐等信息就用BLOB字段来存储,先将文件转为二进制再存储进去.文章或者是较长的文字 ...

  10. mybatis oracle BLOB类型字段保存与读取

    一.BLOB字段 BLOB是指二进制大对象也就是英文Binary Large Object的所写,而CLOB是指大字符对象也就是英文Character Large Object的所写.其中BLOB是用 ...

随机推荐

  1. Python-3.10手动配置环境变量

  2. lec-4-Introduction to Reinforcement Learning

    模仿学习imitation learning与RL的不同 模仿学习中需要有专家指导的信息 RL不需要访问专家信息 RL Definitions 奖励函数 马尔科夫决策链 只与上一个状态有关 目的 空间 ...

  3. L2-004 这是二叉搜索树吗? (25 分)

    1.题目描述: 一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结点的键值: 其左右子树都是二叉搜索树 ...

  4. springboot 项目国际化+登录拦截器

    项目页面国际化 1.语言配置文件 需要下载插件Resource Bundle Editor 新建国际目录i18n 在properties配置文件中自定义 2.前端index页面要设置语言参数传递给后端 ...

  5. 图解Redis和Zookeeper分布式锁

    1.基于Redis实现分布式锁 Redis分布式锁原理如上图所示,当有多个Set命令发送到Redis时,Redis会串行处理,最终只有一个Set命令执行成功,从而只有一个线程加锁成功 2:SetNx命 ...

  6. 聊聊Spring Cloud Gateway

    网关概述 整体来看,网关有点类似于门面,所有的外部请求都会先经过网关这一层. 网关不仅只是做一个请求的转发及服务的整合,有了网关这个统一的入口之后,它还能提供以下功能. 针对所有请求进行统一鉴权.限流 ...

  7. 【python基础】复杂数据类型-列表类型(元组)

    1.初识元组 列表非常适合用于存储在程序运行期间可能变化的数据集.列表是可以修改的. 然而,有时候需要创建一系列不可修改的元素,元组可以满足这种需求 python将不能修改的值称为不可变的,而不可变的 ...

  8. R画韦恩图之总结

    本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅读的你也加入,一起分 ...

  9. CVE-2021-41773 apache路径遍历

    来自tryhackeme的漏洞复现 CVE-2021-41773/42013 利用:路径遍历利用将允许服务器公开任意文件 需要启用mod_cgi模块才能获得远程代码执行 2021 年 10 月 5 日 ...

  10. 10.5. 版本控制(如Git)

    版本控制系统(Version Control System,VCS)是软件开发过程中用于管理源代码的工具.它可以帮助你跟踪代码的变更历史,方便回滚到之前的版本,以及协同多人共同开发.Git是当前最流行 ...