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