MyBatis Mapper映射處理CLOB和BLOB類型
介紹
使用Mybatis時涉及到兩種特殊類型的處理,分別是Blob(Binary Large Object)和Clob(Character Large Object)。Blob表示二進(jìn)制大對象字段,而Clob則表示大字符對象字段。這兩種類型需要特殊處理。
Blob主要用于存儲大型二進(jìn)制數(shù)據(jù),例如圖像、音頻或視頻文件等。而Clob則用于存儲大量文本數(shù)據(jù),比如長篇文章、日志等。在JDBC中,PreparedStatement和ResultSet提供了相應(yīng)的方法來支持Blob和Clob的操作,使得在數(shù)據(jù)庫中存儲和檢索這些大型數(shù)據(jù)變得更加容易。
本文首發(fā):
Mybatis作為一個持久層框架,也對Blob和Clob類型進(jìn)行了支持。不同版本的Mybatis都提供了對這些類型的存儲和讀取操作的功能。下面將詳細(xì)介紹Mybatis中如何操作Clob字段。
對應(yīng)關(guān)系
BLOB和CLOB在不一樣的數(shù)據(jù)庫中對應(yīng)的類型也不同:
MySQL中:clob對應(yīng)text/longtext,blob對應(yīng)blob
Oracle中:clob對應(yīng)clob,blob對應(yīng)blob
Mapper.xml映射
Mapper文件中查詢sql的id為queryByList,report_summary為Oracle數(shù)據(jù)庫中的一個字段,是CLOB類型。myClob為java類,在java類中定義一個String類型的字段reportSummary,用于接收CLOB信息。
1)Mapper.xml文件加入如下配置可以讀取CLOB和BLOB類型的數(shù)據(jù)
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實(shí)體類中,可以直接使用String字符串去接收處理。
擴(kuò)展
上面使用的是默認(rèn)的mybatis提供的ClobTypeHandler,當(dāng)然,你也可以自定義自己的handler進(jìn)行處理,這樣會有更好的靈活性。這里演示blob與String轉(zhuǎn)換。
場景
數(shù)據(jù)庫中有一個blob字段,在java中用String接收。使用如下方式讀取:
<select id="find" resultType="com.example.bean.User">
select id, name, experience, createTime
from user
</select>
如果這里的experience字段為blob類型,那么取出來的數(shù)據(jù)就會亂碼。
解決方法是自定義一個TypeHandler,通過繼承BaseTypeHandler類實(shí)現(xiàn)。如下。
BlobToStringTypeHandler
先看xml應(yīng)用:
<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并實(shí)現(xiàn)其方法,將sql的blob類型字段與java的String類型互相轉(zhuǎn)換。
附錄
這里附上Mybatis JdbcType與Oracle、MySql數(shù)據(jù)類型對應(yīng)列表
| 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 |
如果表格中有遺漏,?可以直接看官方文檔
總結(jié)
以上就是MyBatis MapperXML如何處理CLOB和BLOB類型數(shù)據(jù)的全部內(nèi)容,希望對你Java框架的學(xué)習(xí)有幫助!
推薦閱讀
?

浙公網(wǎng)安備 33010602011771號