最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis-Plus自定義集合類型的類型處理器詳解

 更新時(shí)間:2022年01月13日 15:46:24   作者:nasoda_pro1993  
這篇文章主要介紹了Mybatis-Plus自定義集合類型的類型處理器詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

兩種方法,第一種很麻煩,對mp自帶的插入操作有限制,后來改為更簡潔的第二種方法

1.配合xml文件

TypeHandler

/**
?* 描述:fastjson的集合對象類型處理器,將mysql表中的json字段映射到實(shí)體類中的{@code List<?>}屬性
?* 對照MP自帶的FastjsonTypeHandler,自帶的類型處理器會把所有的{@code List<?>}都會解析為{@code List<JsonObject>},
?* 這樣在遍歷其中對象時(shí),調(diào)用對象屬性的get、set方法就會發(fā)送類型轉(zhuǎn)換JsonObject->?,這種情況轉(zhuǎn)換錯(cuò)誤。
?* 該處理器必須配合xml文件使用,不然無法獲取要解析的對象類型,同時(shí)不能配合MP自帶的{@link com.baomidou.mybatisplus.annotation.TableField}
?* 使用,默認(rèn)情況下@TableField會將JavaType設(shè)置為字段的類型,如果是List<?>則type = List.class,無法明確其中的泛型,類型轉(zhuǎn)換會變成JsonObject。
?* 用法:
?* <pre>{@code
?* 1.實(shí)體類上使用注解@TableName(value = "表名", resultMap = "xml文件中的resultMap的id")
?* 2.xml文件中自定義resultMap并設(shè)置需要JSON轉(zhuǎn)換的字段
?* <result property="實(shí)體類屬性名" column="表字段名" javaType="List中的對象全類名,例如List<Email>,則JavaType為Email的全類名" typeHandler="自定義處理器全類名"/>
?* 3.自定義方法上的用法
?* @Mapper
?* public interface DemoDao extends BaseMapper<DemoEntity> {
?* ? ?@Select("select * from demo where demo_id = #{demoId}")
?* ? ?@ResultMap(value = "xml文件中的resultMap的id")
?* ? ?List<DemoEntity> selectListByDemoId(Long demoId);
?* }
?* }</pre>
?*/
@Slf4j
@MappedJdbcTypes(value = JdbcType.VARCHAR)
public class FastJsonArrayTypeHandler extends AbstractJsonTypeHandler<List<?>> {?
? ? private Class<?> type;?
? ? public FastJsonArrayTypeHandler(Class<?> type) {
? ? ? ? if (log.isTraceEnabled()) {
? ? ? ? ? ? log.trace("FastjsonTypeHandler(" + type + ")");
? ? ? ? }
? ? ? ? Assert.notNull(type, "Type argument cannot be null");
? ? ? ? this.type = type;
? ? }
?
? ? @Override
? ? protected List<?> parse(String json) {
? ? ? ? return JSON.parseArray(json, type);// 注意不要使用parseObject方法
? ? }
?
? ? @Override
? ? protected String toJson(List<?> obj) {
? ? ? ? return JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty);
? ? }?
}

xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="a.b.dao.DemoDao">
? ? <resultMap type="a.b.entity.DemoEntity" id="demoMap">
? ? ? ? <result property="DemoInfo" column="demo_info" javaType="a.b.xx.DiseaseInfo" typeHandler="a.b.handler.FastJsonArrayTypeHandler"/>
? ? </resultMap>
</mapper>

Dao

@Mapper
public interface DemoDao extends BaseMapper<DemoEntity> {
? ? @Select("select * from demo where demo_id = #{demoId}")
? ? @ResultMap(value = "demoMap")
? ? List<DemoEntity> selectListByPlanId(Long demoId);
}

Entity

@Data
@TableName(value = "demo", resultMap = "demoMap")
public class DemoEntity implements Serializable {
? ? private static final long serialVersionUID = -1L;
?
? ? /**
? ? ?* 主鍵
? ? ?*/
? ? @TableId
? ? private Long id;
? ? private Long demoId
? ? /**
? ? ?* json字段
? ? ?*/
? ? private List<DemoInfo> demoInfo;
}

2.手動注冊

TypeHandler

@Slf4j
@MappedJdbcTypes(value = JdbcType.VARCHAR)
public class FastJsonArrayTypeHandler<T> extends AbstractJsonTypeHandler<Object> {?
? ? private TypeReference<List<T>> type;?
? ? public FastJsonArrayTypeHandler(TypeReference<List<T>> type) {
? ? ? ? this.type = type;
? ? }
?
? ? @Override
? ? protected Object parse(String json) {
? ? ? ? return JSON.parseObject(json, type);
? ? }
?
? ? @Override
? ? protected String toJson(Object obj) {
? ? ? ? return JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty);
? ? }?
}

初始化,剩下的bean和dao都不需要額外配置

/**
?* 描述:初始化配置
?* 手動注冊類型處理器
?*/
@Component
public class InitConfig implements CommandLineRunner {
? ? public static final com.alibaba.fastjson.TypeReference<List<DemoInfo>> F_DEMO_INFO = new com.alibaba.fastjson.TypeReference<List<DemoInfo>>() {
? ? };
? ? public static final TypeReference<List<DemoInfo>> M_DEMO_INFO = new TypeReference<List<DemoInfo>>() {
? ? };
? ? // mp自動裝配時(shí)注入的factory,可用于獲取mybatis的配置屬性,這里用來獲取類型處理器的注冊器
? ? private final SqlSessionFactory factory;
?
? ? public InitConfig(SqlSessionFactory factory) {
? ? ? ? this.factory = factory;
? ? }
?
? ? /**
? ? ?* 注冊類型處理器
? ? ?* <pre>{@code
? ? ?* 1.List<DemoInfo>類型處理器
? ? ?* ...
? ? ?* }</pre>
? ? ?*
? ? ?* @param args incoming main method arguments
? ? ?* @throws Exception on error
? ? ?*/
? ? @SuppressWarnings("all")
? ? @Override
? ? public void run(String... args) throws Exception {
? ? ? ? TypeHandlerRegistry typeHandlerRegistry = factory.getConfiguration().getTypeHandlerRegistry();
? ? ? ? typeHandlerRegistry.register(M_DEMO_INFO, new FastJsonArrayTypeHandler(F_DEMO_INFO));
? ? }
}

目前方法二存在的缺陷:雖然新增、查詢不存在問題,執(zhí)行MP自帶的更新操作時(shí),parameterMap參數(shù)類型都是Object,不會經(jīng)過自定義的TypeHandler處理,最后會把json對象直接set進(jìn)去(update demo ..., demo_info = JSON對象 ...)導(dǎo)致報(bào)錯(cuò)

暫無優(yōu)雅的解決方案,先做個(gè)記錄 。以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 原生Java操作兔子隊(duì)列RabbitMQ

    原生Java操作兔子隊(duì)列RabbitMQ

    這篇文章主要介紹了原生Java操作兔子隊(duì)列RabbitMQ,MQ全稱為Message?Queue,即消息隊(duì)列,“消息隊(duì)列”是在消息的傳輸過程中保存消息的容器,需要的朋友可以參考下
    2023-05-05
  • springboot整合security和vue的實(shí)踐

    springboot整合security和vue的實(shí)踐

    本文主要介紹了springboot整合security和vue的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • SpringBoot內(nèi)置Tomcat啟動方式

    SpringBoot內(nèi)置Tomcat啟動方式

    Spring Boot通過啟動類上的@EnableAutoConfiguration注解,自動生成并加載ServletWebServerFactoryAutoConfiguration類,該類通過@Import注解導(dǎo)入TomcatServletWebServerFactory類,該類在getWebServer()方法中創(chuàng)建并啟動TomcatServletWebServer對象
    2024-12-12
  • java讀取txt文件代碼片段

    java讀取txt文件代碼片段

    這篇文章主要為大家詳細(xì)介紹了java讀取txt文件的代碼片段,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java線程池獲取池中所有線程列表的方法總結(jié)

    Java線程池獲取池中所有線程列表的方法總結(jié)

    在Java中,獲取線程池中所有線程列表并不是一個(gè)直接支持的功能,因?yàn)榫€程池的設(shè)計(jì)通常是為了隱藏和管理底層的線程細(xì)節(jié),從而提供更高層次的抽象和并發(fā)控制能力,本文給大家介紹了Java線程池獲取池中所有線程列表的方法,需要的朋友可以參考下
    2024-10-10
  • vscode快速引入第三方j(luò)ar包發(fā)QQ郵件

    vscode快速引入第三方j(luò)ar包發(fā)QQ郵件

    這篇文章主要介紹了vscode快速引入第三方j(luò)ar包發(fā)QQ郵件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • JSON 格式的弊端與解決方法(真實(shí)示例)

    JSON 格式的弊端與解決方法(真實(shí)示例)

    JSON 格式是目前最流行的數(shù)據(jù)交互格式,廣泛應(yīng)用于前后端分離的系統(tǒng)。但也有一些場合不適合使用 JSON 格式,這篇文章主要介紹了JSON 格式的弊端與解決方法,需要的朋友可以參考下
    2022-09-09
  • MybatisPlus?LambdaQueryWrapper使用int默認(rèn)值的坑及解決

    MybatisPlus?LambdaQueryWrapper使用int默認(rèn)值的坑及解決

    這篇文章主要介紹了MybatisPlus?LambdaQueryWrapper使用int默認(rèn)值的坑及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • 4位吸血鬼數(shù)字的java實(shí)現(xiàn)思路與實(shí)例講解

    4位吸血鬼數(shù)字的java實(shí)現(xiàn)思路與實(shí)例講解

    今天小編就為大家分享一篇關(guān)于4位吸血鬼數(shù)字的java實(shí)現(xiàn)思路與實(shí)例講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Struts2實(shí)現(xiàn)自定義攔截器的三種方式詳解

    Struts2實(shí)現(xiàn)自定義攔截器的三種方式詳解

    這篇文章主要介紹了Struts2實(shí)現(xiàn)自定義攔截器的三種方式詳解,一些與系統(tǒng)邏輯相關(guān)的通用功能如權(quán)限的控制和用戶登錄控制等,需要通過自定義攔截器實(shí)現(xiàn),本節(jié)將詳細(xì)講解如何自定義攔截器,需要的朋友可以參考下
    2023-07-07

最新評論

永泰县| 永济市| 义马市| 肇东市| 融水| 凉城县| 仙桃市| 白山市| 仪征市| 丹江口市| 永寿县| 新巴尔虎左旗| 阳谷县| 永川市| 大新县| 新干县| 遂昌县| 潞城市| 青冈县| 洪洞县| 贵阳市| 韶山市| 塔河县| 萨迦县| 景德镇市| 福州市| 康保县| 岐山县| 沾化县| 鄂托克前旗| 宁夏| 诏安县| 呼图壁县| 黄石市| 元谋县| 江城| 安顺市| 肇源县| 剑河县| 隆回县| 和静县|