使用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(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,这是在读取时使用了流,如下所示
【使用mybatis的typeHandler对clob进行流读写方式】② 在写入数据的时候使用:
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})
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- 解决vue表单为空也能提交的问题
- 微信小程序获取用户手机号码的详细步骤
- vue3集成Element-plus实现按需自动引入组件的方法总结
- uniapp地图组件(map)使用与遇到的一些问题总结
- 聊聊消息中心的设计与实现逻辑
- c语言|这可能是最全最详细的C语言指针基础教程
- c语言如何保护全局指针,C语言中全局结构体指针隐含的错误
- 指针c语言与数组,C语言指针与数组
- 牛客网刷题C语言 一天后的时间
- 篮球|中国最会打球的城市,吊打北上广深