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_clobwhere 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, createTimefrom 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, createTimefrom user
</select>
再看BlobToStringTypeHandler
代碼:
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;import java.sql.*;public class BlobToStringTypeHandler extends BaseTypeHandler<String> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, parameter);}@Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {Blob blob = rs.getBlob(columnName);return new String(blob.getBytes(1, (int)blob.length()));}@Overridepublic String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {Blob blob = rs.getBlob(columnIndex);return new String(blob.getBytes(1, (int)blob.length()));}@Overridepublic 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框架的學習有幫助!
推薦閱讀
MyBatis Plus如何解決百萬級大數據量查詢慢問題