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

 更新时间:2022年01月13日 15:29:02   作者:网速20M  
这篇文章主要介绍了使用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;
 
/** 
 * <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})

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

相关文章

  • java理论基础Stream性能论证测试示例

    java理论基础Stream性能论证测试示例

    这篇文章主要为大家介绍了java理论基础Stream性能论证的测试示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • Netty分布式ByteBuf使用的底层实现方式源码解析

    Netty分布式ByteBuf使用的底层实现方式源码解析

    这篇文章主要为大家介绍了Netty分布式ByteBuf使用底层实现方式源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • MyBatis-Plus实现连表查询的方法实例

    MyBatis-Plus实现连表查询的方法实例

    这篇文章主要给大家介绍了关于MyBatis-Plus实现连表查询的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • 平衡二叉树的左右旋以及双旋转的图文详解

    平衡二叉树的左右旋以及双旋转的图文详解

    今天小编就为大家分享一篇关于平衡二叉树的左右旋以及双旋转的图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java pdf和jpg互转案例

    Java pdf和jpg互转案例

    这篇文章主要介绍了Java pdf和jpg互转案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java中的数组使用详解及练习

    Java中的数组使用详解及练习

    数组是Java程序中最常见的一种数据结构,它能够将相同类型的数据用一个标识符封装到一起,构成一个对象序列或基本数据类型,这篇文章主要给大家介绍了关于Java中数组使用详解及练习的相关资料,需要的朋友可以参考下
    2024-03-03
  • Java文件处理之使用XWPFDocument导出Word文档

    Java文件处理之使用XWPFDocument导出Word文档

    最近因项目开发的需要,整理了一份用JAVA导出WORD文档,下面这篇文章主要给大家介绍了关于Java文件处理之使用XWPFDocument导出Word文档的相关资料,需要的朋友可以参考下
    2023-12-12
  • MybatisPlus自带的queryWrapper实现时间倒序方式

    MybatisPlus自带的queryWrapper实现时间倒序方式

    这篇文章主要介绍了MybatisPlus自带的queryWrapper实现时间倒序方式,具有很好的参考价值,希望对的有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • springmvc与mybatis集成配置实例详解

    springmvc与mybatis集成配置实例详解

    这篇文章主要介绍了springmvc与mybatis集成配置实例详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • java中LinkedList使用迭代器优化移除批量元素原理

    java中LinkedList使用迭代器优化移除批量元素原理

    本文主要介绍了java中LinkedList使用迭代器优化移除批量元素原理,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10

最新评论