Maison > Article > base de données > Comment MybatisPlus gère-t-il le type json de Mysql ?
1. Définissez les champs JSON dans la table de base de données
2 Ajoutez @TableName(autoResultMap = true) à la classe d'entité et ajoutez @TableField(typeHandler = JacksonTypeHandler) aux propriétés mappées par. le champ JSON .class);
1. Il y a un attribut dans la classe d'entité qui est d'autres objets, ou une liste lorsqu'il est stocké dans la base de données, le format json de mysql est utilisé pour le moment. mybatis plus @TableField(typeHandler = JacksonTypeHandler.class)
@TableField(typeHandler = JacksonTypeHandler.class)
De cette façon, l'objet peut être automatiquement converti au format json lors de l'enregistrement
2 Alors, comment le cartographier lors de sa suppression Il y a deux situations
a. : Lorsque XML n'est pas utilisé :
@Data @TableName(value = "person",autoResultMap = true)
b: Lors de l'utilisation de fichiers XML :
<result property="advance" column="advance" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
MyBatis Plus a un gros défaut, qui est le ResultMap utilisé lorsque l'insertion et la sélection sont différentes, le correctif consiste à ajouter l'annotation @TableName(autoResultMap = true) à la classe d'entité. Cependant, cet autoResultMap ne peut pas être utilisé sur les méthodes personnalisées et ne prend effet que sur les méthodes intégrées de MyBatis Plus.
Affiche les problèmes avec autoResultMap
Classe d'entité Person
Il existe des gestionnaires de types personnalisés dans cette classe d'entité : 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); }
La méthode personnalisée ne peut pas obtenir certains champs
Parce qu'en personne des orgIds et les passe-temps nécessitent un typeHandler personnalisé. La méthode personnalisée utilise resultType=Person au lieu du ResultMap généré, ils sont donc tous nuls
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()));
Improvement
Set @ResultMap("mybatis-plus_Person")
/** * 设置了ResultMap为`mybatis-plus_Person`后就可以拿到正确的值. */ @ResultMap("mybatis-plus_Person") @Select("SELECT * FROM person WHERE id=#{id}") Person selectOneById(int id);
La règle de dénomination est : mybatis-plus_{entity class name}
Compréhension personnelle
MyBatis Plus lui-même n'est pas un ORM dynamique, mais fournit uniquement des instructions SQL couramment utilisées, resultMap, pour mybatis lorsque mybatis est initialisé. de MyBatis lui-même
FAQ
@TableField(typeHandler = IntegerListTypeHandler.class) ne prend pas effet : le resultType n'est pas configuré sur la méthode personnalisée
JacksonTypeHandler
Prend en charge l'analyse MVC JSON
Prend en charge l'analyse MySQL JSON
La méthode traditionnelle consiste à effectuer le traitement de mappage typeHandler via le resultMap de XML SQL, mais cela affectera la fonction de MP, donc JacksonTypeHandler est simplement compatible avec les fonctionnalités de MP et les capacités prennent en charge l’analyse MySQL JSON.
FastjsonTypeHandler
Prend en charge l'analyse MVC JSON
Ne prend pas en charge l'analyse MySQL JSON
Peut être pris en charge via XML, mais la fonctionnalité MP sera perdue.
<resultMap id="rxApiVO" type="RxApiVO" > <result column="api_dataway" property="apiDataway" typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler" /> </resultMap>
Remarque :
Lors de l'analyse de MVC JSON, vous n'avez pas besoin d'ajouter @TableName(value = "t_test", autoResultMap = true) [partie en surbrillance], mais lors de l'analyse de MySQL JSON pour une requête, si vous ne le faites pas ne l'ajoutez pas, vérifiez Il apparaît comme null
MySQL JSON Lors de l'analyse de la requête, seul le format JSON est pris en charge : {"name": "Tom", "age": 12}, non pris en charge : {"name": Tom","age":12} et "{"name":"Tom","age":12}"
Assurez-vous que la version de mysql est 5.7+
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; @SpringBootTest class 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); // -------------------------------------------------------- } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!