解决:oracle+myBatis ResultMap 类型为 map 时,表字段类型有 L
发布时间:2020-12-12 13:43:53 所属栏目:百科 来源:网络整理
导读:前言:最近在做一个通用查询单表的组件,所以 sql 的写法就是?select *,然后?resultType="map" 。如果数据库中的表里有字段类型为 Long 等类型时,mybatis 在执行 sql 时会报错,如果表中有 Blob、Clob 类型在转 json 是也会报错,而且我这里也需要将这几种
long 类型 sql 报错:Blob/Clob 转 json 报错:解决方案:自定义 typeHandle 来统一处理数据库这些特殊的字段。 这里 typeHandle 里面使用注解配置 JdbcType 和 JavaType。这两个注解的定义是:
代码如下: myBatis 的配置文件中加入: <typeHandlers> <!--自定义处理 JdbcType.TIMESTAMP 和 java Object(Data)--> <typeHandler handler="com.yule.querydb.typehandler.MyObjectTimestampTypeHandle"/> <!--自定义处理 JdbcType.Clob 和 java Object(String)--> <typeHandler handler="com.yule.querydb.typehandler.MyObjectClobTypeHandle"/> <!--自定义处理 JdbcType.Blob 和 java Object(String)--> <typeHandler handler="com.yule.querydb.typehandler.MyObjectBlobTypeHandle"/> <!--自定义处理 JdbcType.LONGVARCHAR 和 java Object(String)--> <typeHandler handler="com.yule.querydb.typehandler.MyObjectLongTypeHandle"/> </typeHandlers> 这些 typeHandle 类源码: package com.yule.querydb.typehandler; 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 java.io.StringReader; import java.sql.*; /** * 自定义处理 JdbcType.Blob 和 java Object(String) * 处理转 json 报错,将 oracle.sql.Clob 类型转为 String 类型 * copy org.apache.ibatis.type.ClobTypeHandler 类的处理 * @author yule * @date 2018/10/9 17:57 */ @MappedTypes({Object.class}) @MappedJdbcTypes(value = {JdbcType.CLOB}) public class MyObjectClobTypeHandle extends BaseTypeHandler<Object> { @Override public void setNonNullParameter(PreparedStatement ps,int i,Object parameter,JdbcType jdbcType) throws SQLException { String parameterStr = (String) parameter; StringReader reader = new StringReader(parameterStr); ps.setCharacterStream(i,reader,parameterStr.length()); } @Override public Object getNullableResult(ResultSet rs,String columnName) throws SQLException { String value = ""; Clob clob = rs.getClob(columnName); if(clob != null) { int size = (int)clob.length(); value = clob.getSubString(1L,size); } return value; } @Override public Object getNullableResult(ResultSet rs,int columnIndex) throws SQLException { String value = ""; Clob clob = rs.getClob(columnIndex); if(clob != null) { int size = (int)clob.length(); value = clob.getSubString(1L,size); } return value; } @Override public Object getNullableResult(CallableStatement cs,int columnIndex) throws SQLException { String value = ""; Clob clob = cs.getClob(columnIndex); if(clob != null) { int size = (int)clob.length(); value = clob.getSubString(1L,size); } return value; } } MyObjectBlobTypeHandle package com.yule.querydb.typehandler; 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 java.io.StringReader; import java.sql.*; /** * 自定义处理 JdbcType.Blob 和 java Object(String) * 处理转 json 报错,将 oracle.sql.Blob 类型转为 String 类型 * copy org.apache.ibatis.type.BlobTypeHandler 类的处理 * @author yule * @date 2018/10/9 17:57 */ @MappedTypes({Object.class}) @MappedJdbcTypes(value = {JdbcType.BLOB}) public class MyObjectBlobTypeHandle extends BaseTypeHandler<Object> { @Override public void setNonNullParameter(PreparedStatement ps,JdbcType jdbcType) throws SQLException { byte[] parameterByteArray = (byte[]) parameter; String parameterStr = new String(parameterByteArray); StringReader reader = new StringReader(parameterStr); ps.setCharacterStream(i,String columnName) throws SQLException { Blob blob = rs.getBlob(columnName); byte[] returnValue = null; if(null != blob) { returnValue = blob.getBytes(1L,(int)blob.length()); } return returnValue == null ? "" : new String(returnValue); } @Override public Object getNullableResult(ResultSet rs,int columnIndex) throws SQLException { Blob blob = rs.getBlob(columnIndex); byte[] returnValue = null; if(null != blob) { returnValue = blob.getBytes(1L,(int)blob.length()); } return returnValue == null ? "" : new String(returnValue); } @Override public Object getNullableResult(CallableStatement cs,int columnIndex) throws SQLException { Blob blob = cs.getBlob(columnIndex); byte[] returnValue = null; if(null != blob) { returnValue = blob.getBytes(1L,(int)blob.length()); } return returnValue == null ? "" : new String(returnValue); } } MyObjectLongTypeHandle package com.yule.querydb.typehandler; 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 java.io.StringReader; import java.sql.*; /** * 自定义处理 JdbcType.LONGVARCHAR 和 java Object(String) * 处理转 mybatis 执行返回map的sql 报错,将 oracle Long 型转为 String 类型 * @author yule * @date 2018/10/9 19:18 */ @MappedTypes({Object.class,String.class}) @MappedJdbcTypes(value = {JdbcType.LONGVARCHAR}) public class MyObjectLongTypeHandle extends BaseTypeHandler<Object> { @Override public void setNonNullParameter(PreparedStatement ps,String columnName) throws SQLException { String str = rs.getString(columnName); return str != null ? str : ""; } @Override public Object getNullableResult(ResultSet rs,int columnIndex) throws SQLException { String str = rs.getString(columnIndex); return str != null ? str : ""; } @Override public Object getNullableResult(CallableStatement cs,int columnIndex) throws SQLException { String str = cs.getString(columnIndex); return str != null ? str : ""; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |