ホームページ >データベース >mysql チュートリアル >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 には大きな欠陥があります、挿入時と選択時に使用される 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 がカスタム メソッドで構成されていません
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}"
mysql のバージョンが 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); // -------------------------------------------------------- } }
以上がMybatisPlus は Mysql の json タイプをどのように処理しますかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。