mybatis-plus json,

  mybatis-plus json,

  

目录

MybatisPlus处理关系型数据库的数据类型MyBatis Plus - xml中如何使用自动结果图构造的ResultMapMyBatis-Plus-JacksonTypeHandler VS FastjsonTypeHandlerMybatisPlus读写关系型数据库的数据字段前置条件一、新建关系型数据库表增加数据字段二、波乔类三、测试类

 

  

MybatisPlus处理Mysql的json类型

1、在数据库表定义数据字段;

 

  2、在实体类加上@TableName(autoResultMap=true),在数据字段映射的属性加上@ table field(type handler=jacksontypehandler。类);

  1.实体类中有个属性是其他对象,或者是列表;在数据库中存储时使用的是关系型数据库的数据格式,此时可以用mybatis plus的一个注解@ table field(type handler=jacksontypehandler。类)

  @ table field(type handler=jacksontypehandler。类)这样在存入是就可以把对象自动转换为数据格式

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

  a:当没有使用到xml时:

  @Data@TableName(value=person ,autoResultMap=true)http://www . Sina.com/

  结果属性= advance 列= advance 类型处理程序= com。窦米宝。mybatisplus。扩展。经手人。jacksontype处理程序/

  

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

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

 

  b:当使用了xml文件时:

  实体类人

  该实体类中有自定义的类型处理程序: IntegerListTypeHandler,StringListTypeHandler

  @TableName(autoResultMap=true)公共类人员{私有整数id私有字符串名称;私有整数年龄;@ table field(type handler=integerlisttypehandler。class)个人分发名单整数orgIds@ table field(type handler=stringlisttypehandler。class)私有列表字符串爱好;} @ mapper公共接口人员映射器扩展BaseMapperPerson { /** *自定义的根据身份获取人的方法,与MyBatis-Plus中的查询相同的功能(但是不能使用自动结果图生成的结果图)。*/@ Select( Select * FROM Person WHERE id=# { id } )Person selectOneById(int id);}自定义方法拿不到一些字段因为人中的orgIds和业余爱好需要自定义的typeHandler,自定义的方法使用的是结果类型=人员,而不是生成的结果图,所以都是空

  人员人员=新人();人。setage(1);人。集合名称(“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都为nullpersonInDb = 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字段

 

  

前置条件

确保mysql的版本是5.7+

 

  

 

  

一、新建mysql表增加json字段

 

  

 

  

二、pojo类

package com.cxstar.domain;import com.alibaba.fastjson.JSONObject;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableName;import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;import java.io.Serializable;import java.util.Date;@lombok.Data@TableName(autoResultMap = true)public class Data implements Serializable { @TableId(value = "id",type = IdType.AUTO) private Integer id; // 部分字段省略------------- private String title; private String author; private String publisher; // ----------------------- @TableField(typeHandler = FastjsonTypeHandler.class) private JSONObject aggJson;}

 

  

三、测试类

package com.cxstar;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;import com.cxstar.domain.Data;import com.cxstar.domain.SearchMsg;import com.cxstar.mapper.DataMapper;import com.cxstar.service.OrderService;import com.cxstar.service.spider.impl.*;import com.cxstar.service.utils.ExecutorThread;import com.cxstar.service.utils.SpiderThread;import com.cxstar.service.utils.SynContainer;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import java.util.ArrayList;import java.util.Date;import java.util.UUID;@SpringBootTestclass OrderApplicationTests { @Autowired DataMapper dataMapper; @Test void testJson() {// insert ----------------------------------- Data data = new Data(); data.setTitle("计算机安全技术与方法"); data.setPublisher("<<计算机技术>>编辑部出版"); JSONObject jb = new JSONObject(); jb.put("searchKey", "英格"); jb.put("curPage", "1"); JSONArray js = new JSONArray(); js.add("西北政法大学"); js.add("西安理工大学"); jb.put("source", js); data.setAggJson(jb); dataMapper.insert(data); // ------------------------------------------ // select -------------------------------------- Data data1 = dataMapper.selectById(5837); JSONObject jb2 = data1.getAggJson(); System.out.println(jb2.getJSONArray("source")); // ---------------------------------------------// group by -----------------------------------------------LambdaQueryWrapper<Data> lqw = new LambdaQueryWrapper<>(); lqw.select(Data::getAggJson); lqw.groupBy(Data::getAggJson); List<Data> dataList = dataMapper.selectList(lqw); System.out.println(dataList); // -------------------------------------------------------- }}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: