达梦数据库查询时clob字段无法转换的问题

本文探讨了在使用Spring Boot时,表字段为text类型的数据显示错误,原因在于Jackson库找不到Buffer类的序列化器。解决方法是在数据库连接中设置clobAsString=true。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:表字段类型为text时,数据返回页面出现格式转换错误

org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class dm.jdbc.util.Buffer]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class dm.jdbc.util.Buffer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.gsoft.foa.common.dto.AjaxResult["data"]->java.util.ArrayList[1]->java.util.HashMap["C_CHANGELOG"]->com.alibaba.druid.proxy.jdbc.NClobProxyImpl["rawNClob"]->dm.jdbc.driver.DmdbNClob["K"]->dm.jdbc.driver.DmdbConnection["gX"]->dm.jdbc.c.a["li"])
    

 解决方式

在数据库连接加上参数clobAsString=true,例如 jdbc:dm://xxx:5236/xx?clobAsString=true

CLOB 类型是达梦数据库特有的数据类型,与其他数据库的数据类型不同。因此,在使用 MyBatis 查询达梦数据库中的 CLOB 类型字段,需要进行特殊处理。 下面是一个示例代码,演示如何使用 MyBatis 查询达梦数据库中的 CLOB 类型字段: 1. 在 MyBatis 配置文件中添加类型处理器: ``` <typeHandlers> <typeHandler jdbcType="CLOB" javaType="java.lang.String" handler="com.example.ClobTypeHandler" /> </typeHandlers> ``` 其中,`jdbcType` 表示数据库中的数据类型,`javaType` 表示Java中的数据类型,`handler` 表示自定义的类型处理器。 2. 自定义类型处理器: ``` public class ClobTypeHandler extends BaseTypeHandler<String> { @Override public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { StringReader reader = new StringReader(parameter); ps.setCharacterStream(i, reader, parameter.length()); } @Override public String getNullableResult(ResultSet rs, String columnName) throws SQLException { Reader reader = rs.getCharacterStream(columnName); if (reader == null) { return null; } StringBuilder sb = new StringBuilder(); char[] buffer = new char[4096]; int len = 0; while ((len = reader.read(buffer)) != -1) { sb.append(buffer, 0, len); } return sb.toString(); } @Override public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException { Reader reader = rs.getCharacterStream(columnIndex); if (reader == null) { return null; } StringBuilder sb = new StringBuilder(); char[] buffer = new char[4096]; int len = 0; while ((len = reader.read(buffer)) != -1) { sb.append(buffer, 0, len); } return sb.toString(); } @Override public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { Reader reader = cs.getCharacterStream(columnIndex); if (reader == null) { return null; } StringBuilder sb = new StringBuilder(); char[] buffer = new char[4096]; int len = 0; while ((len = reader.read(buffer)) != -1) { sb.append(buffer, 0, len); } return sb.toString(); } } ``` 该类型处理器将 CLOB 类型转换为 Java 中的 String 类型,并在查询结果中返回。 3. 在 MyBatis 映射文件中使用类型处理器: ``` <resultMap id="userResultMap" type="User"> <id column="id" property="id" /> <result column="name" property="name" /> <result column="description" property="description" jdbcType="CLOB" javaType="java.lang.String" typeHandler="com.example.ClobTypeHandler" /> </resultMap> ``` 其中,`jdbcType` 表示数据库中的数据类型,`javaType` 表示Java中的数据类型,`typeHandler` 表示自定义的类型处理器。 通过以上步骤,你可以在 MyBatis 中查询达梦数据库中的 CLOB 类型字段,并将其转换为 Java 中的 String 类型。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值