Maison  >  Article  >  base de données  >  Comment MybatisPlus gère-t-il le type json de Mysql ?

Comment MybatisPlus gère-t-il le type json de Mysql ?

王林
王林avant
2023-05-27 17:07:284926parcourir

MybatisPlus gère 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 - Comment utiliser autoResultMap pour construire ResultMap en XML

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

MyBatis-Plus - JacksonTypeHandler VS FastjsonTypeHandler

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}"

MybatisPlus lit et écrit le champ json de Mysql

Conditions préalables

Assurez-vous que la version de mysql est 5.7+

1. Créez une nouvelle table mysql et ajoutez le champ json

Comment MybatisPlus gère-t-il le type json de Mysql ?

2. Classe 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;
}

3. Classe de test

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer