ホームページ >データベース >mysql チュートリアル >MybatisPlus は Mysql の json タイプをどのように処理しますか

MybatisPlus は Mysql の json タイプをどのように処理しますか

王林
王林転載
2023-05-27 17:07:285038ブラウズ

MybatisPlus は Mysql の json 型を処理します

1. データベース テーブルに JSON フィールドを定義します;

2. @TableName (autoResultMap = true) をエンティティ クラスに追加します。それを JSON に追加 @TableField(typeHandler = JacksonTypeHandler.class) をフィールド マッピング属性に追加します;

1. エンティティ クラスに他のオブジェクトまたはリストである属性があります; mysql はデータベースのjson形式で保存する際に使用しますが、この際、mybatis plus

@TableField(typeHandler = JacksonTypeHandler.class)

のアノテーション@TableField(typeHandler = JacksonTypeHandler.class)を利用することで、オブジェクトをjson形式に自動変換することができます。 Saving

2 . では、取り出すときにどのようにマッピングするのでしょうか? 状況は 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 - autoResultMap で構築された ResultMap を xml で使用する方法

MyBatis Plus には大きな欠陥があります、挿入時と選択時に使用される ResultMap が異なる場合の修正は、エンティティ クラスに @TableName(autoResultMap = true) アノテーションを追加することです。ただし、この autoResultMap はカスタム メソッドでは使用できず、MyBatis Plus 組み込みメソッドでのみ有効です。

autoResultMap の問題を表示します

エンティティ クラス person

このエンティティ クラスにはカスタム タイプハンドラーがあります: 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);
}
  • カスタム メソッドは一部のフィールドを取得できません

個人の orgId と趣味にはカスタム typeHandler が必要であるため、カスタム メソッドは生成された ResultMap ではなく resultType= Person を使用します。したがって、それらはすべて 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()));

改善

Set @ResultMap("mybatis-plus_person")

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

Name ルールは次のとおりです: mybatis- plus_{エンティティ クラス名}

  • 個人的な理解

MyBatis Plus 自体は動的 ORM ではなく、mybatis が初期化されるときの単なる共通の ORM です。 SQL ステートメントと resultMap 設定は mybatis 用に提供されており、MyBatis 自体の動作は変更されません。

  • FAQ

@TableField(typeHandler = IntegerListTypeHandler) .class) は有効になりません: resultType がカスタム メソッドで構成されていません

MyBatis-Plus - JacksonTypeHandler VS FastjsonTypeHandler

JacksonTypeHandler

  • Support 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 であることを確認してください

1. 新しい mysql テーブルを作成し、json フィールドを追加します

MybatisPlus は Mysql の json タイプをどのように処理しますか

2.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.テスト クラス

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);
        // --------------------------------------------------------
    }
}

以上がMybatisPlus は Mysql の json タイプをどのように処理しますかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。