一、實體類
package com.nthforsth;
public Bean{
// 盡管要存儲Clob類型數據,接收時用String類型接收
private String text;
}
二、重寫mybatis的sql執行器
由於Oracle默認會把字符串先轉換成varchar2類型,而varchar2類型最大長度為4000。
為了解決保存數據字段超過4000 char 問題,所以重寫mybatis的sql執行器,並在 Mapper.xml 文件中調用
package com.nthforsth;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import java.sql.*;
/**
* 解決保存數據字段超過4000 char 問題
* @author yuans
* @create 2020-06-02-14:38
*/
public class OracleClobTypeHandler implements TypeHandler<Object> {
@Override
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
Clob clob = ps.getConnection().createClob();
clob.setString(1, (String) parameter);
ps.setClob(i, clob);
}
@Override
public Object getResult(ResultSet rs, String columnName) throws SQLException {
Clob clob = rs.getClob(columnName);
return (clob == null || clob.length() == 0) ? null : clob.getSubString((long) 1, (int) clob.length());
}
@Override
public Object getResult(ResultSet rs, int columnIndex) throws SQLException {
return null;
}
@Override
public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
return null;
}
}
三、插入數據時
Mapper.xml 文件中寫 typeHandler 的全類名
<insert id="insertData" parameterType="com.nthforsth.Bean">
INSERT INTO
Table(TEXT)
VALUES(#{text,typeHandler=com.nthforsth.OracleClobTypeHandler})
</insert>
四、保存數據時
<resultMap id="BaseData" type="com.nthforsth.Bean">
<result column="text" property="text" typeHandler="com.nthforsth.OracleClobTypeHandler"/>
</resultMap>
<select id="selectData" resultMap="BaseData">
select text from table
</select>