信息发布→ 登录 注册 退出

使用mybatis的typeHandler对clob进行流读写方式

发布时间:2026-01-11

点击量:
目录
  • typeHandler对clob进行流读写
    • 第一步:编写typehandler文件
    • 第二步:在mybatis的配置文件中添加<typeHandlers>节点
    • 第三步
  • mybatis处理clob字段

    typeHandler对clob进行流读写

    分为三步:

    第一步:编写typehandler文件

    package com.dcits.edps.common.utils; 
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.Reader;
    import java.io.StringReader;
    import java.io.Writer;
    import java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
     
    import org.apache.ibatis.type.BaseTypeHandler;
    import org.apache.ibatis.type.JdbcType;
    import org.apache.ibatis.type.MappedJdbcTypes;
    import org.apache.ibatis.type.MappedTypes;
    import org.springframework.util.FileCopyUtils;
     
    /** 
     * <p>标题:处理Clob字段</p>
     * <p>描述:使用流对Clob字段进行读写</p>
     * <p>编译者:zt</p>
     * <p>版本:1.0</p>
     */
     @MappedTypes({String.class})
     @MappedJdbcTypes({JdbcType.CLOB})
     public class OscarClobTypeHandler extends BaseTypeHandler<String> {
    	@Override
    	public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)
    			throws SQLException {
    		final StringReader sr = new StringReader(parameter);
    		final int length = parameter.getBytes().length;
    		ps.setCharacterStream(i, sr, length);
    		sr.close();		
    	}
     
    	@Override
    	public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
    		final OutputStream outPutStream = new ByteArrayOutputStream();
    		final Writer writer = new OutputStreamWriter(outPutStream);
    		try {
    			Reader reader = rs.getCharacterStream(columnName);
    			if(null == reader){
    				return null;
    			}else {
    				FileCopyUtils.copy(reader, writer);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return outPutStream.toString();
    	}
     
    	@Override
    	public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    		final OutputStream outPutStream = new ByteArrayOutputStream();
    		final Writer writer = new OutputStreamWriter(outPutStream);
    		try {
    			Reader reader = rs.getCharacterStream(columnIndex);
    			if(null == reader){
    				return null;
    			}else {
    				FileCopyUtils.copy(reader, writer);
    			} 
    		}catch (IOException e) {
    			e.printStackTrace();
    		}
    		return outPutStream.toString();
    	}
     
    	@Override
    	public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    		final OutputStream outPutStream = new ByteArrayOutputStream();
    		final Writer writer = new OutputStreamWriter(outPutStream);
    		try {
    			Reader reader = cs.getCharacterStream(columnIndex);
    			if(null == reader){
    				return null;
    			}else {
    				FileCopyUtils.copy(reader, writer);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return outPutStream.toString();
    	} 
     }
     

    第二步:在mybatis的配置文件中添加<typeHandlers>节点

    需要注意的是,mybatisd的配置文件中的<configuration>节点中的子节点需要有顺序

    顺序为:properties—>settings—>typeAliases—>typeHandlers—>objectFactory—>objectWrapperFactory—>plugins—>environments—>databaseIdProvider—>mappers。

    <typeHandlers> 
       <typeHandler handler="com.dcits.edps.common.utils.OscarClobTypeHandler"/> 
    </typeHandlers>

    第三步

    ①在resultMap中需要添加jdbcType,这是在读取时使用了流,如下所示

     <resultMap type="com.dcits.edps.swgl.common.bean.SwMain" id="swmain">
          <result property="fsfh" column="fsfh" jdbcType="CLOB"/>
      </resultMap>

    ② 在写入数据的时候使用:

    fsfh=#{fsfh,jdbcType=CLOB}

    mybatis处理clob字段

    1.由于数据库中 ggnr 字段是clob 类型(可以存储流对象),所以后台对前台传递的长文本进行处理。

    2.经过一番查找,找到mybatis处理clob字段的方法,对clob 进行了尝试处理,发现存的数据长度超过一两百,数据库该字段就为空,存的短可以。

    3.经过查阅跟公司同事沟通,总结两种方案:(1).直接获取数据库连接,操作预编译对象(老方法,高并发数据库容易卡死,不符)。(2).sql使用 begin end 方法(经测试可以存储字节4000以内的数据,要求不符)

    4.好吧再次查阅jdbc官方文档,上边提到ojdbc 存在数据限制情况,建议高版本,然后就换了ojdbc6 问题解决。

    换了之后,ok。如果有懒加载,添加上这个 cglib-nodep-3.2.4.jar

    附上Mapper处理:

    1.修改Mapper.xml

      <result column="GGNR" property="ggnr"  javaType="java.lang.String" jdbcType="CLOB" typeHandler="org.apache.ibatis.type.ClobTypeHandler"/>

    2.sql

        insert into CQGG(ggnr) values(#{ggnr,jdbcType=CLOB})

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

    在线客服
    服务热线

    服务热线

    4008888355

    微信咨询
    二维码
    返回顶部
    ×二维码

    截屏,微信识别二维码

    打开微信

    微信号已复制,请打开微信添加咨询详情!