这篇文章主要介绍“如何使用mybatis的typeHandler对clob进行流读写”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用mybatis的typeHandler对clob进行流读写”文章能帮助大家解决问题。
分为三步:
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();
}
}
需要注意的是,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}
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})
关于“如何使用mybatis的typeHandler对clob进行流读写”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。