MybatisPlus处理Mysql的json类型

1、在数据库表定义JSON字段;
2、在实体类加上@TableName(autoResultMap = true)、在JSON字段映射的属性加上@TableField(typeHandler = JacksonTypeHandler.class);

1.实体类中有个属性是其他对象,或者是List;在数据库中存储时使用的是mysql的json格式,此时可以用mybatis plus的一个注解@TableField(typeHandler = JacksonTypeHandler.class)

@TableField(typeHandler = JacksonTypeHandler.class)

这样在存入是就可以把对象自动转换为json格式

2.那么取出时怎么进行映射呢,有分为两种情况

​ a:当没有使用到xml时:

@Data
@TableName(value = "person",autoResultMap = true)

​ b:当使用了xml文件时:

<result property="advance" column="advance" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>

MyBatis Plus - xml中如何使用autoResultMap构造的ResultMap

MyBatis Plus有一个很大的缺陷,就是insert和select的时候使用的ResultMap是不同的,修复的办法就是在实体类上增加注解@TableName(autoResultMap = true)。但是这个autoResultMap并不能使用在自定义的方法上,只在MyBatis Plus内置方法上生效。

展示autoResultMap存在的问题

  • 实体类Person

该实体类中有自定义的typehandler: IntegerListTypeHandler, StringListTypeHandler

@TableName(autoResultMap = true)
public class Person {private Integer id;private String name;private Integer age;@TableField(typeHandler = IntegerListTypeHandler.class)private List<Integer> orgIds;@TableField(typeHandler = StringListTypeHandler.class)private List<String> hobbies;
}
@Mapper
public interface PersonMapper extends BaseMapper<Person> {/*** 自定义的根据Id获取Person的方法,与MyBatis-Plus中的selectById相同的功能(但是不能使用autoResultMap生成的ResultMap).*/@Select("SELECT * FROM person WHERE id=#{id}")Person selectOneById(int id);
}
  • 自定义方法拿不到一些字段

因为Person中的orgIds和hobbies需要自定义的typeHandler,自定义的方法使用的是resultType=Person,而不是生成的ResultMap,所以都是null

Person person = new Person();
person.setAge(1);
person.setName("tim");
person.setOrgIds(Lists.newArrayList(1,2,3));
person.setHobbies(Lists.newArrayList("basketball", "pingpong"));
personMapper.insert(person);# 可以得到正确的字段值
Person personInDb = personMapper.selectById(person.getId());# orgIds和hobbies都为null
personInDb = personMapper.selectOneById(person.getId());Preconditions.checkArgument(personInDb.getHobbies().equals(person.getHobbies()));
Preconditions.checkArgument(personInDb.getName().equals(person.getName()));
Preconditions.checkArgument(personInDb.getAge().equals(person.getAge()));
Preconditions.checkArgument(personInDb.getOrgIds().equals(person.getOrgIds()));

改进

设置@ResultMap(“mybatis-plus_Person”)

/*** 设置了ResultMap为`mybatis-plus_Person`后就可以拿到正确的值.*/
@ResultMap("mybatis-plus_Person")
@Select("SELECT * FROM person WHERE id=#{id}")
Person selectOneById(int id);

命名规则就是:mybatis-plus_{实体类名}

  • 个人理解

MyBatis Plus本身并不是一个动态的ORM,而只是在mybatis初始化的时候,为mybatis提供常用的SQL语句,resultMap设置,并不会改变MyBatis本身的行为

  • 常见问题

@TableField(typeHandler = IntegerListTypeHandler.class)没有生效:自定义的方法上没有配置resultType

MyBatis-Plus - JacksonTypeHandler VS FastjsonTypeHandler

JacksonTypeHandler

  • 支持 MVC JSON 解析
  • 支持 MySQL JSON 解析

传统的方法是通过 XML SQL 的 resultMap 来做 typeHandler 映射处理,但是这样会影响 MP 的功能,所以 JacksonTypeHandler 正好可以兼容 MP 的功能和满足 支持 MySQL JSON 解析。

FastjsonTypeHandler

  • 支持 MVC JSON 解析
  • 不支持 MySQL JSON 解析

可以通过 XML 支持,只是会失去 MP 特性。

<resultMap id="rxApiVO" type="RxApiVO" ><result column="api_dataway" property="apiDataway" typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler" />
</resultMap>

注意事项

  • MVC JSON 解析时,可以不用加 @TableName(value = “t_test”, autoResultMap = true) 【高亮部分】,但是 MySQL JSON 解析查询的时候,如果不加,查出来为 null
  • MySQL JSON 解析查询时,只支持JSON格式:{“name”:“Tom”,“age”:12},不支持:{“name”:“Tom”,“age”:12} 和 “{“name”:“Tom”,“age”:12}”

MybatisPlus处理Mysql的json类型相关推荐

  1. mysql存json将utf8编码 去掉,MySQL对JSON类型UTF-8编码导致中文乱码探讨

    原文:https://www.cnblogs.com/CreateMyself/p/12587426.html 前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有 ...

  2. MySQL对JSON类型UTF-8编码导致中文乱码探讨

    继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型的编码导致数据中文出现 ...

  3. MySql中json类型的使用___mybatis存取mysql中的json

    MySql中json类型的使用 MySQL从5.7.8起开始支持JSON字段,这极大的丰富了MySQL的数据类型.也方便了广大开发人员.但MySQL并没有提供对JSON对象中的字段进行索引的功能,至少 ...

  4. 五、Mysql中JSON类型

    文章目录 JSON类型 JSON入门 JSON 函数 JSON_OBJECT 将对象转为 json json_insert 插入数据 json_merge 合并数据并返回 其他函数: JSON 索引 ...

  5. java处理 mysql中json类型

    当数据库中存在json类型的数据,如图 json类型的值在数据库中保存的时候,会先字母排序并加空格后保存 场景:业务上需要校验,此json字段是否跟库里的json完全匹配(验重) 原理:利用mysql ...

  6. MySQL 针对JSON类型字段数据进行提取和查询

    文章目录 前言 背景: JSON数据双引号处理 第一种: 第二种: 第三种: 第四种: 总结 前言 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i. 提示:以下是本篇文章正文内容,下面案例可 ...

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

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

  8. mysql json 中文乱码_MySQL对JSON类型UTF-8编码导致中文乱码探讨

    前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型的编码导致数据中 ...

  9. mysql json类型数组索引_MySQL JSON 类型数据操作

    1.Java 中动态扩展字段,会导致数据库表被锁,在MySQL 5.7.8版本之前,因为MySQL不能直接操作JSON类型数据,可以将一个字段设定成varchar类型,里面存放JSON格式数据,这样在 ...

最新文章

  1. 线段树分治 ---- F. Extending Set of Points(线段树分治 + 可撤销并查集)
  2. 【研发管理】华为十大架构与设计核心原则
  3. c++用一级运算比较大小_1.1.2 python基本数据类型与运算符
  4. JAVA连接MYSQL数据库
  5. C++设计模式--命令模式(Command)
  6. iframe 高度根据子页面来确定
  7. 计算机主板各模块复位,电脑主板复位电路工作原理分析
  8. CreateFile系类异步、并行(同一个串口发送接收)
  9. adc采集出来一段波形 如何求周期与频率_DMA+ADC快速采集直流无刷电机电流
  10. svn增量打包部署_实现Jenkins+svn+bat批处理构建svn版本差异增量的自动化打zip包
  11. BZOJ3729: Gty的游戏(伪ETT)
  12. 如何在PR中同步音频和视频
  13. GPS(全球定位系统)
  14. IT基础架构变革,Hitachi Vantara如何解决超融合(HCI)的真正痛点?
  15. 电影院订票选座小程序 开题报告
  16. 【软件测试基础】控制用例粒度:测试点的组合和拆分
  17. wamp mysql 密码_WAMP中的mysql设置密码
  18. 计算机ir领域,IR领域的相关等级会议和期刊
  19. 如何用awk打印除第一列之外的所有列
  20. C 语言 —— % 运算符

热门文章

  1. springboot 优雅停机_Spring Boot 2.3 新特性优雅停机详解
  2. linux下git的HEAD,Git工具详解以及与GitHub的配合使用
  3. python 判断括号是否匹配_使用Python实现一个栈判断括号是否平衡
  4. mysql去掉两个最高分_从MySQL中的单列获取最高得分值,从两列获取最高得分值...
  5. 7-4 BCD解密(C语言)
  6. python课时费_python(课时1)
  7. tp5权限管理代码_权限系统控制到按钮级别开源推荐 Spring BootShiroVue
  8. Facebook计划整合WhatsApp、Instagram和Messenger的基础设施
  9. Expo大作战(十八)--expo如何发布成独立应用程序,打包成apk或者ipa,发布到对应应用商店...
  10. JDBC+Servlet+JSP整合开发之29-JSP表达式语言(EL)