此前在使用中将CLOB类型的数据转化为可用String类型接受的属性的方法是to_char(......),但在其使用中发现,当其长度超过4000时就会抛出异常( Cause: java.sql.SQLException: ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion)
其实本身这么转换就存在问题,因为CLOB的长度最大可为4G,如此转换肯定会存在问题,以下是正确的转换方式:
在相应的informationRelease.xml文件如此表示
<resultMap id="getInformationByIdResultMap" class="com.foundersc.crmweb.entity.information.InformationTo">
<result property="id" column="id"/>
<result property="title" column="title"/>
<result property="mediaSource" column="mediaSource"/>
<result property="publishDate" column="publishDate"/>
<result property="publishUserName" column="publishUserName"/>
<result property="createDt" column="createDt"/>
<result property="keyword" column="keyword"/>
<result property="cascadeType" column="cascadeType"/>
<result property="industrySort" column="industrySort"/>
<result property="relationCode" column="relationCode"/>
<result property="isRelease" column="isRelease"/>
<result property="publishUserId" column="publishUserId"/>
<result property="sendGroupType" column="sendGroupType"/>
<result property="readedCount" column="readedCount"/>
<result property="message" column="message"/>
<result property="content" column="content" jdbcType="CLOB" javaType = "java.lang.String" typeHandler="com.foundersc.crmweb.util.OracleClobTypeHandlerCallback"/>
</resultMap>
<select id="information.getInformationById" resultMap="getInformationByIdResultMap" parameterClass="java.lang.String">
SELECT distinct info.information_id As id,
info.title AS title,
info.media_source AS mediaSource,
info.publish_date AS publishDate,
userT.userName AS publishUserName,
info.create_dt AS createDt,
infoContent.content AS content,
info.keyword AS keyword,
info.cascade_type AS cascadeType,
info.industry_sort AS industrySort,
info.relation_code AS relationCode,
info.is_release AS isRelease,
info.publish_userId AS publishUserId,
info.send_group_type AS sendGroupType,
info.readed_count AS readedCount,
info.message AS message
FROM crm.crm_t_information info
left join crm.crm_t_information_content infoContent on infoContent.information_id = info.information_id
left join kf.au_t_user userT on userT.user_id = info.create_by
WHERE info.information_id = #informationId#
</select>
其中红色字体标示的地方才是咱们真正关心的,其中typeHandler的值即为咱们写的转换CLOB类型为String类型的java代码的路径,其java代码如下:
package com.foundersc.crmweb.util;
import java.sql.SQLException;
import oracle.sql.CLOB;
import com.ibatis.sqlmap.client.extensions.ParameterSetter;
import com.ibatis.sqlmap.client.extensions.ResultGetter;
import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;
public class OracleClobTypeHandlerCallback implements TypeHandlerCallback {
//获取时将CLOB类型的值转换为我们需要的,此处转换为了Object
public Object getResult(ResultGetter getter) throws SQLException {
CLOB clob = (CLOB) getter.getClob();
return (clob == null || clob.length() == 0 )? "" :clob.getSubString((long)1, (int)clob.length());
}
//用CLOB类型的变量接受从数据库中读取的值
@SuppressWarnings("deprecation")
public void setParameter(ParameterSetter setter, Object obj)
throws SQLException {
CLOB clob = CLOB.empty_lob();
clob.setString(1, (String)obj);
setter.setClob(clob);
}
public Object valueOf(String arg0) {
// TODO Auto-generated method stub
return null;
}
}
备注:在查询的sql语句中不能含有distinct,至于原因我也不太清楚。
分享到:
相关推荐
Caused by: java.net.UnknownHostException: openapi.alipay.com
在IT行业中,数据库操作是核心任务之一,而Ibatis作为一款优秀的Java持久层框架,极大地简化了数据库操作。本文将深入探讨与“sql-map-2.dtd”和“sql-map-config-2.dtd”相关的知识点,以及它们在Ibatis中的作用。 ...
在使用Mybatis框架时,你可能会遇到`org.apache.ibatis.exceptions.PersistenceException`这样的异常。这个异常通常表示在执行数据库查询操作时遇到了问题。本篇将详细分析这个问题并提供解决方法。 ### 问题概述 ...
iBATIS,全称为“Infrastructure for Binding Applications To SQL Maps”,是一个优秀的开源持久层框架,它允许Java开发者将SQL语句与Java代码分离,提供了一种简单但强大的在Java应用中映射SQL和结果集的方式。...
在处理CLOB类型时,MyBatis需要将Java对象中的String或Reader类型数据转换为CLOB,以便存储到数据库中。 1. **CLOB类型数据的插入** 当你需要将一个字符串或者Reader对象插入到CLOB字段时,MyBatis默认可能无法...
ibatis 读取oracle clob类型
CLOB是一种用于存储大量字符数据的数据类型,它可以容纳最大4GB的单个文本对象。在Oracle中,CLOB通常用于存储大段的文本,如文章、报告或者XML文档。 iBATIS是一个Java库,它允许开发者将SQL语句与Java代码分离,...
nested exception is org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.IllegalStateException: Cannot enable lazy loading because CGLIB is not ...
数据类型别名主要用于映射SQL查询结果到Java对象时的数据类型转换。了解这些别名有助于开发者在编写SQL映射文件时更方便地指定数据类型。 1. **string**:`java.lang.String` 2. **byte**:`java.lang.Byte` 3. **...
标题 "ibatis oracle clob" 涉及到的是在Java开发中,使用iBATIS框架与Oracle数据库交互时处理CLOB(Character Large Object)类型数据的问题。CLOB是Oracle数据库用于存储大文本数据(如XML文档、长篇文章等)的...
ibatis的dtd约束,版本2,xml文件中标签提示,网址:http://ibatis.apache.org/dtd/sql-map-2.dtd
IBatis 是由 Clinton Begin 创建的一款优秀的数据库操作框架,它将SQL语句与Java代码分离,提供了灵活的映射机制,使得开发者可以更专注于业务逻辑的实现。DataMapper是IBatis的核心组件,负责处理数据访问层的映射...
1. **IBATIS核心库**: 包含了ibatis-2.x.jar,这是IBATIS框架的主要实现,提供了SQL映射文件解析、事务管理、结果集处理等功能。 2. **JDBC驱动**: 根据实际使用的数据库类型,如MySQL、Oracle、SQL Server等,需要...
iBATIS是一个用于Java的应用程序框架,其核心思想是简化Java持久层编程,并提供一种灵活的方式来处理SQL查询和结果集映射。iBATIS的设计理念强调了开发人员应该能够直接控制SQL语句的编写,这使得iBATIS非常适合那些...
通过学习这个压缩包的内容,开发者可以掌握如何在Java项目中集成和使用iBATIS-SqlMaps-2,从而提高数据库操作的效率和灵活性。此外,了解iBATIS的高级特性如结果映射、缓存机制和动态SQL,可以帮助开发者编写出更加...
在Java编程语言中,与数据库交互是常见的任务,这就涉及到`java.sql.Types`枚举类,它是Java数据类型与数据库字段类型之间的桥梁。`java.sql.Types`定义了一系列常量,这些常量代表了SQL标准中的数据类型,使得我们...
在XML描述文件中,SQL Maps定义了Java Bean、Map实现以及基本数据类型的包装类如何与数据库中的表和记录对应。这些映射文件通常包含SQL查询、存储过程以及事务管理等元素,使得开发者无需编写大量JDBC代码就能完成...
iBATIS-SqlMaps-2-Tutorial_cniBATIS-SqlMaps-2-Tutorial_cn.pdf.pdfiBATIS-SqlMaps-2-Tutorial_cn.pdfiBATIS-SqlMaps-2-Tutorial_cn.pdf
Manning.iBATIS.in.Action.Jan.2007.eBook-BBL.pdf MyBatis 3 User Guide Simplified Chinese.pdf MyBatis-3.0.3-Migrations.pdf MyBatis-3.0.3-User-Guide.pdf ...iBATIS-SqlMaps-2-Tutorial_en.pdf