Mybatis存取Oracle Clob数据类型的方法

一、实体类

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>
posted @ 2021-10-09 17:40  落花桂  阅读(2450)  评论(0编辑  收藏  举报
返回顶端
Live2D