千家信息网

如何使用mybatis的typeHandler对clob进行流读写

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要介绍"如何使用mybatis的typeHandler对clob进行流读写"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"如何使用mybatis的ty
千家信息网最后更新 2025年01月20日如何使用mybatis的typeHandler对clob进行流读写

这篇文章主要介绍"如何使用mybatis的typeHandler对clob进行流读写"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"如何使用mybatis的typeHandler对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; /**  * 

    标题:处理Clob字段

    *

    描述:使用流对Clob字段进行读写

    *

    编译者:zt

    *

    版本:1.0

    */ @MappedTypes({String.class}) @MappedJdbcTypes({JdbcType.CLOB}) public class OscarClobTypeHandler extends BaseTypeHandler { @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的配置文件中添加节点

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

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

         

    第三步

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

             

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

    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

      

    2.sql

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

    关于"如何使用mybatis的typeHandler对clob进行流读写"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

    0