前言:最近在做一个通用查询单表的组件,所以 sql 的写法就是 select *,然后 resultType="map" 。如果数据库中的表里有字段类型为 Long 等类型时,mybatis 在执行 sql 时会报错,如果表中有 Blob、Clob 类型在转 json 是也会报错,而且我这里也需要将这几种类型都转为 String 类型到前端。

long 类型 sql 报错:

Blob/Clob 转 json 报错:

解决方案:

自定义 typeHandle 来统一处理数据库这些特殊的字段。

这里 typeHandle 里面使用注解配置 JdbcType 和 JavaType。这两个注解的定义是:

  • @MappedTypes 定义的是 JavaType 类型,可以指定哪些 Java 类型被拦截。
  • @MappedJdbcTypes 定义的是 JdbcType 类型,它需要满足枚举类 org.apache.ibatis.type.JdbcType 所列的枚举类型。

代码如下:

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, int i, Object parameter, JdbcType jdbcType) throws SQLException {
byte[] parameterByteArray = (byte[]) parameter;
String parameterStr = new String(parameterByteArray);
StringReader reader = new StringReader(parameterStr);
ps.setCharacterStream(i, reader, parameterStr.length());
} @Override
public Object getNullableResult(ResultSet rs, 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, 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 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 : "";
}
}
												

解决:oracle+myBatis ResultMap 类型为 map 时,表字段类型有 Long/Blob/Clob 时报错的更多相关文章

  1. 解决:oracle+myBatis ResultMap 类型为 map 时返回结果中存在 timestamp 时使用 jackson 转 json 报错

    前言:最近在做一个通用查询单表的组件,所以 sql 的写法就是 select *,然后 resultType="map" ,然后使用 jackson @ResponseBody 返 ...

  2. 解决Oracle 11g在用EXP导出时,空表不能导出

    实践结论可行,看"2.解决办法" 一.问题原因:     11G中有个新特性,当表无数据时,不分配segment,以节省空间     1.insert一行,再rollback就产生 ...

  3. 【转】解决Oracle 11g在用EXP导出时,空表不能导出

    一.问题原因: 11G中有个新特性,当表无数据时,不分配segment,以节省空间 .insert一行,再rollback就产生segment了. 该方法是在在空表中插入数据,再删除,则产生segme ...

  4. oracle查看某表字段类型

    来源:https://www.cnblogs.com/ufindme/p/5033843.html 今天遇到一个问题:要求在可重复执行的SQL脚本添加一段SQL代码:修改当前的数据类型.因为SQL代码 ...

  5. 通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类

    http://www.cnblogs.com/lbangel/p/3487796.html 1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的 ...

  6. SQLSERVER创建该存储过程时不会出错,但是执行存储过程时报错

    创建该存储过程时,不会出错,但是执行存储过程时,会报出下面这样的错误 这是因为在存储过程创建时,它先做语法检查,如果通过了语法检查,它会尝试解析它包含的对象名,如果存在也会解析该对象引用的对象是否存在 ...

  7. MySQL建表字段类型

    1.数据库:在MySQL中,要存储数据,必须从数据库开始,因此首先要创建数据库,但由于学校的MySQL服务器对学生数据帐号有限止,学生不得创建数据库,故每个学生的帐号中已事先由信息中心为大家建立了一个 ...

  8. SqlBulkCopy 批量导入数据 转换表字段类型

    在使用SqlBulkCopy导入数据时,要有一个跟数据库里面同样的DataTable 要赋值表名 要求每个列跟数据库中列同名,并且列的类型要赋值跟数据库中列的类型对应的NET类型 要求数据库中为Nul ...

  9. 使用SQL语句查询表及表字段类型说明

    今天突然遇到有人要数据库表及表字段说明,数据库表太多又不能一个个表去找,就想想SQL是否能直接查询出来. 经过查询资料,加上一些自己的一些调整写了一个sql语句,在此记录一下,以方便日后查找使用. S ...

随机推荐

  1. DZY Loves Math(莫比乌斯反演)

    \(x=p_1^{\alpha_1}p_2^{\alpha_2}...p_c^{\alpha_c}\) \(f(x)=\max(\alpha_1,\alpha_2,...,\alpha_c)\) \( ...

  2. Yii2 Apache + Nginx 路由重写

    一.什么是路由重写 原本的HTTP访问地址: www.test.com/index.php?r=post/view&id=100 表示这个请求将由PostController 的 action ...

  3. Linux学习笔记-基本操作3

    1. vim编辑器的使用2. gcc编译器3. 静态库的制作 -- lib4. 动态库的制作    -- dll vi -- vimvim是从vi发展过来的一款文本编辑器vi a.txt前提: 安装了 ...

  4. python实用库:PrettyTable 学习

    python实用库:PrettyTable 学习 PrettyTable说明 PrettyTable 是python中的一个第三方库,可用来生成美观的ASCII格式的表格,十分实用. 以下为官方介绍: ...

  5. Python学习之二

    基础语法 一.起始行 #!/usr/bin/python 或 #!/usr/bin/env python 目的是在运行python脚本的时候告诉系统我们要用Python解释器去运行py脚本 # -*- ...

  6. odoo开发笔记--字段追踪,消息通知机制

    odoo有着强大的消息记录.通知机制: 实际开发中,常常会有客户的需求,页面上form视图中的某些字段不允许反复修改, 假如有的用户修改了,恶意搞坏,往往容易给公司利益造成损失,或破坏,那么如何有效的 ...

  7. 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 0、学习目标

    Learn to build a neural network with one hidden layer, using forward propagation and backpropagation ...

  8. Hadoop环境搭建及wordcount程序

    目的: 前期学习了一些机器学习基本算法,实际企业应用中算法是核心,运行的环境和数据处理的平台是基础. 手段: 搭建简易hadoop集群(由于机器限制在自己的笔记本上通过虚拟机搭建) 一.基础环境介绍 ...

  9. 一个对眼睛很好的vim 颜色主题

    地址:https://github.com/altercation/vim-colors-solarized 安装: $ cd vim-colors-solarized/colors $ mv sol ...

  10. 一口一口吃掉Volley(二)

    欢迎访问我的个人博客转发请注明出处:http://www.wensibo.top/2017/02/17/一口一口吃掉Volley(二)/ 相信看了第一篇教程之后,你应该会对Volley有一个初步的了解 ...