一、简介

我们在用MyBatis里,很多时间有这样一个需求:POJO里有个属性是非基本数据类型,在DB存储时我们想存的是json格式的字符串,从DB拿出来时想直接映射成目标类型,也即json格式的字符串字段与Java类的相互类型转换

当然,你可以为每个类写一个MyClassTypeHandler,但问题是要为每个类都写一个TypeHandler,过于繁琐。

有了泛型,一个通用的TypeHandler直接搞定。

二、源码

package com.adu.spring_test.mybatis.typehandler;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.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig.Feature;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;/*** mapper里json型字段到类的映射。* 用法一:* 入库:#{jsonDataField, typeHandler=com.adu.spring_test.mybatis.typehandler.JsonTypeHandler}* 出库:* <resultMap>* <result property="jsonDataField" column="json_data_field" javaType="com.xxx.MyClass" typeHandler="com.adu.spring_test.mybatis.typehandler.JsonTypeHandler"/>* </resultMap>** 用法二:* 1)在mybatis-config.xml中指定handler:*      <typeHandlers>*              <typeHandler handler="com.adu.spring_test.mybatis.typehandler.JsonTypeHandler" javaType="com.xxx.MyClass"/>*      </typeHandlers>* 2)在MyClassMapper.xml里直接select/update/insert。*** @author yunjie.du* @date 2016/5/31 19:33*/
public class JsonTypeHandler<T extends Object> extends BaseTypeHandler<T> {private static final ObjectMapper mapper = new ObjectMapper();private Class<T> clazz;public JsonTypeHandler(Class<T> clazz) {if (clazz == null) throw new IllegalArgumentException("Type argument cannot be null");this.clazz = clazz;}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, this.toJson(parameter));}@Overridepublic T getNullableResult(ResultSet rs, String columnName) throws SQLException {return this.toObject(rs.getString(columnName), clazz);}@Overridepublic T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return this.toObject(rs.getString(columnIndex), clazz);}@Overridepublic T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return this.toObject(cs.getString(columnIndex), clazz);}private String toJson(T object) {try {return mapper.writeValueAsString(object);} catch (Exception e) {throw new RuntimeException(e);}}private T toObject(String content, Class<?> clazz) {if (content != null && !content.isEmpty()) {try {return (T) mapper.readValue(content, clazz);} catch (Exception e) {throw new RuntimeException(e);}} else {return null;}}static {mapper.configure(Feature.WRITE_NULL_MAP_VALUES, false);mapper.setSerializationInclusion(Inclusion.NON_NULL);}
}

三、QA

3.1 Q:Cause: java.lang.RuntimeException: Unable to find a usable constructor for class

A:mybatis版本过低,类型不能识别,造成通用typeHandler的构造函数构造失败。之前用3.1.1时报过这个错,后来改成3.2.3就没问题了,现在用3.4.0也没问题。贴上现在的配置吧:

<!-- mybatis -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.0</version>
</dependency>
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version>
</dependency>

在 MyBatis 里,如何将 JSON 型字段到 Java 类的映射相关推荐

  1. excel字段自动java类,Java 接口自动化系列--工具类之Excel测试数据解析封装

    在进行数据解析时,先来看看excel测试数据格式,这里采用接口和测试数据分离的方式,即分为两个sheet页签分别存放接口信息,用例信息 excel封装成对象步骤 1.导入easypoi的坐标 2.加载 ...

  2. java mysql查询字段换行,java类中写sql语句,查询条件包含换行

    java类中写sql语句,查询条件包含换行 detachedCriteria.add(Restrictions.or( Restrictions.like("chengBanDanWeiId ...

  3. fastjson将json字符串转化为java对象

    目录 一.导入一个fastjson的jar包 二.Json字符串格式 三.根据json的格式创建Java类 四.给java类的所有属性添加setter方法 五.转换为java对象 一.导入一个fast ...

  4. JUnit之JSONAssert.assertEquals忽略json里的Array内指定字段

    // 调用这个方法public static void assertEquals(String expectedStr, String actualStr, JSONComparator compar ...

  5. php mysql int string_mysql查出的 int 型字段都是 string

    坑点and埋坑点 - mysql查出的int型字段都是string ¶ 作者:KK 发表日期:2016.10.12 用mysql扩展从数据库里查出来的数据,int型字段都是string类型 ¶ 这导致 ...

  6. 在mybatis里如何自定义类型处理器

    类型处理器(typeHandlers) MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Jav ...

  7. json mysql 字段 默认值_MySQL中的JSON类型

    前言(废话) 昨天抽了点时间在网上搜列了一个开源项目,项目挺完整的,前后台分离还带有微信小程序,我Clone下代码,经过一番倒腾,嘿~还真就跑起来了.在这个过程中,体验了一把VUE项目工程细节,因为之 ...

  8. mybatis动态调用表名和字段名

    一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到.这 ...

  9. java解析sql查询字段_sql解析json格式字段 如何获取json中某个字段的值?

    java将json数据解析为sql语句?小编给你倒一杯热水.可你惦记着其他饮料,所以你将它放置一旁.等你想起那杯水时,可惜它已经变得冰冷刺骨. 图片中是json数据,每个数据的开头都有表名称,操作类型 ...

最新文章

  1. 小程序websocket java_微信小程序websocket java获取不到data
  2. Linux有问必答:如何扩展XFS文件系统
  3. VS2010打不开创建的项目的解决方法
  4. DL之CNN:利用自定义DeepConvNet【7+1】算法对mnist数据集训练实现手写数字识别并预测(超过99%)
  5. java web如何使用aws,amazon-web-services - 使用java Jedis连接到aws elasticache redis
  6. sklearn查看数据
  7. SpringSecurity3整合CAS实现单点登录
  8. Deeping Learning学习与感悟——《深度学习工程师》_2
  9. 用matlab实现快速傅里叶变换的源程序,matlab快速傅里叶变换(三个matlab程序介绍)...
  10. php开启websocket服务,php实现简单的websocket服务
  11. Windows10下安装VS2015和Caffe
  12. 【OpenCV入门指南】第十篇 彩色直方图均衡化
  13. 《Java Web开发实战》Java工程师推荐的进阶之路
  14. shell脚本计时方法
  15. 数据结构——线性表(三)
  16. 第 1 集:招聘风云!
  17. 国际学术论文写作笔记02李福安:怎样用英语撰写科技论文
  18. 交通部 城轨交通运营管理规定_《城市轨道交通运营安全风险分级管控和隐患排查治理管理办法》政策解读...
  19. 2015年12月PMP备考感言
  20. appium---TouchAction

热门文章

  1. 餐饮供应链公司“鲜沐农场”获千万级Pre-A轮融资,未来要打造一站式采购平台...
  2. 微信公众号管理系统 RhaPHP1.2.5更新啦!
  3. 从零开始学_JavaScript_系列(16)——CSSlt;3gt;(文本、对齐、圆角、盒模型、背景)...
  4. SQL日期时间和字符串函数
  5. oracle动态注册和静态注册监听器
  6. Django 运行 runserver 端口占用,报错:Errno 10013
  7. IE6,IE7,FF等浏览器不兼容原因及解决办法(转)
  8. matlab的PDE工具箱的简单使用
  9. TensorFlow——多维矩阵的转置(transpose)
  10. 基于matlab的lsb数字水印