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 |
如果表格中有遗漏,可以直接看https://www.panziye.com/java/7876.html
总结
以上就是MyBatis MapperXML如何处理CLOB和BLOB类型数据的全部内容,希望对你Java框架的学习有帮助!