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

网友投稿 955 2022-11-08

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

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

目录typeHandler对clob进行流读写第一步:编写typehandler文件第二步:在mybatis的配置文件中添加节点第三步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;

/**

*

标题:处理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(CallableStahttp://tement cs, int columnIndex) throws SQLException {

final OutputStream outPutStream = new ByteArrayOutputShNxLrSZQtream();

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 类型(可以存储流对http://象),所以后台对前台传递的长文本进行处理。

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})

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:[leetcode] 126. Word Ladder II
下一篇:ubuntu18.04修改密码出现Authentication token manipulation error
相关文章

 发表评论

暂时没有评论,来抢沙发吧~