MyBatis Mapper映射处理CLOB和BLOB类型
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 Mapper映射处理CLOB和BLOB类型的更多相关文章
- 基于PLSQL的数据库备份方法及如何解决导出clob和blob类型数据报错的问题
基于PL/SQL的数据库备份方法 PL/SQL Developer是Oracle 数据库中用于导入或导出数据库的主要工具,本文主要介绍了利用PL/SQL Developer导入和导出数据库的过程,并对 ...
- 框架学习系列 mybatis mapper映射文件之输出映射
1: mapper映射文件输出映射(输入类型) 2:resultType的使用 3:resultMap的使用 3:总结&下节预告 本文是<凯哥陪你学系列-框架学习之mybatis框架学习 ...
- 自己挖的坑自己填--Mybatis mapper文件if标签中number类型及String类型的坑
1.现象描述 (1)使用 Mybatis 在进行数据更新时,大部分时候update语句都需要通过动态SQL进行拼接.在其中,if标签中经常会有 xxx !='' 这种判断,若 number 类型的字段 ...
- Mybatis Mapper 映射文件(xxxMapper.xml)
什么是 Mapper 映射文件 Mapper 映射文件是 Mybatis 用于实现 ORM 映射规则的配置文件,Mybatis 通过映射文件可将数据库查询结构映射为 Java 对象. 创建 Mappe ...
- mybatis mapper映射文件全解
目录 select.update.delete.insert 设置参数类型以及取值 基本数据类型 对象数据类型 map数据类型 #{ } 和 ${ } 的区别 ResultMap Auto-map ...
- 小峰mybatis(1) 处理clob,blob等。。
一.mybatis处理CLOB.BLOB类型数据 CLOB:大文本类型:小说啊等大文本的:对应数据库类型不一致,有long等: BLOB:二进制的,图片:电影.音乐等二进制的: 在mysql中: bl ...
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- mybatis学习之CLOB、BLOB处理及多参数方法映射
CLOB数据mysql对应数据类型为longtext.BLOB类型为longblob: model实体: ... private Integer id; private String name; pr ...
- mybatis 处理CLOB/BLOB类型数据
BLOB和CLOB都是大字段类型. BLOB是按二进制来存储的,而CLOB是可以直接存储文字的. 通常像图片.文件.音乐等信息就用BLOB字段来存储,先将文件转为二进制再存储进去.文章或者是较长的文字 ...
- mybatis oracle BLOB类型字段保存与读取
一.BLOB字段 BLOB是指二进制大对象也就是英文Binary Large Object的所写,而CLOB是指大字符对象也就是英文Character Large Object的所写.其中BLOB是用 ...
随机推荐
- 2022-03-20:给定一棵多叉树的头节点head, 每个节点的颜色只会是0、1、2、3中的一种, 任何两个节点之间的都有路径, 如果节点a和节点b的路径上,包含全部的颜色,这条路径算达标路径, (
2022-03-20:给定一棵多叉树的头节点head, 每个节点的颜色只会是0.1.2.3中的一种, 任何两个节点之间的都有路径, 如果节点a和节点b的路径上,包含全部的颜色,这条路径算达标路径, ( ...
- 一次redis主从切换导致的数据丢失与陷入只读状态故障
背景 最近一组业务redis数据不断增长需要扩容内存,而扩容内存则需要重启云主机,在按计划扩容升级执行主从切换时意外发生了数据丢失与master进入只读状态的故障,这里记录分享一下. 业务redis高 ...
- Python从0到1丨了解图像形态学运算中腐蚀和膨胀
摘要:这篇文章将详细讲解图像形态学知识,主要介绍图像腐蚀处理和膨胀处理. 本文分享自华为云社区<[Python从零到壹] 四十七.图像增强及运算篇之腐蚀和膨胀详解>,作者: eastmou ...
- 微软Build 2023两大主题:Copilots和插件
在本周大型微软人工智能 2023 开发者大会的开幕式上,人工智能站到了舞台中央--前台和后台以及介于两者之间的所有舞台. 贯穿会议的两个主要主题是Copilots - 涵盖广泛产品和服务的AI助手 - ...
- MySQL-DQL
准备测试表,先跟着执行下面的SQL #1.登录MySQL后 #2.创建test_database数据库,不存在则创建 create database if not exists test_databa ...
- 连接内网 SSH 新姿势,告别慢速度及防火墙限制
近些年,因为某些原因,我们常常在家远程研发业务,当某些程序或业务代码在公司电脑上时,就需要访问公司电脑远程操作, SSH 登录 Linux 是一种非常常见的方式,但是在一些情况下,SSH 无法直接连接 ...
- 代码随想录算法训练营Day14 二叉树
代码随想录算法训练营 代码随想录算法训练营Day14 二叉树|理论基础 递归遍历 基础知识 二叉树都是通过栈来实现的. 二叉树的种类 在我们解题过程中二叉树有两种主要的形式:满二叉树和完全二叉树. 满 ...
- Springboot——参数校验
springboot参数校验注解 在controller层需要对前端传来的参数进行校验 校验简单数据类型 使用springboot自带的validation工具可以从后端对前端传来的数据进行校验 使用 ...
- Bio+IT 生信科技爱好者知识库
欢迎来到 Bio+IT 生信科技爱好者知识库! 关于我们 "BioIT爱好者" 是一个专注于生物信息学和 IT 互联网技术的知识库平台,是一个集合了 Bio+IT 相关的数据分析. ...
- 解码器 | 基于 Transformers 的编码器-解码器模型
基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶.本文简要介绍了神经编码器-解码器模型的历史,更多背景知识,建议读者阅读由 Sebastion ...