欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mysql?json類型字段Java+Mybatis數(shù)據(jù)字典功能的實踐方式

 更新時間:2022年08月25日 14:21:37   作者:keep丶  
這篇文章主要介紹了Mysql?json類型字段Java+Mybatis數(shù)據(jù)字典功能的實踐方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

前言

JSON類型是MySQL5.7.8中新加入的一種數(shù)據(jù)類型,并在后續(xù)版本尤其是MySQL8.0中得到了大幅增強,現(xiàn)在的JSON類型的功能十分強大,合理使用能讓我們的開發(fā)更加有效!        

但本文不準備花篇幅來介紹MySQL的JSON類型字段的相關API,因為官方文檔里面寫得已經十分詳細了,大家如果對MySQL的JSON類型還不怎么了解的話可以看看官方文檔:

(ps:英語相對較差的小伙伴可以用chrome瀏覽器打開,然后用自帶的翻譯工具翻譯后看哦~)

應用場景介紹

JSON的應用場景還是挺多的,我能想到的兩個是:

數(shù)據(jù)字典

  • 基本上所有系統(tǒng)都會有數(shù)據(jù)字典,比如各種下拉框的內容,這種數(shù)據(jù)如果需要支持讓用戶自定義,那么基本上就是使用數(shù)據(jù)字典,而字典內容則是標準的JSON對象,用JSON保存再好不過!

動態(tài)表單

  • 如一些信息收集的表單,需要提供用戶自定義信息時,這些信息也是JSON對象,也可以通過JSON字段保存。

數(shù)據(jù)字典案例實踐

  • 本文將針對數(shù)據(jù)字典使用JSON類型案例進行詳細介紹,本文中使用的ORM框架是Mybatis,其他ORM框架應該也大同小異。如果其他框架使用出現(xiàn)問題,可以留言一起討論哦~
  • 本文中還是用了Swagger、Mybatis Plus、Lombok等工具,如果這些還不熟悉的可以先去做做功課哦,這些都是開發(fā)中非常強大而給力的工具,讓我們編碼時如虎添翼,效率翻倍~

功能方面需要明確的是:

枚舉選項是嚴禁直接刪除的。

  • 字典內容只能增加不能減少,因為一旦刪除一個選項,會導致?lián)碛羞@個選項的數(shù)據(jù)無法找到對應枚舉,導致顯示異常。
  • 當然,如果非要有刪除功能,我們也能像表數(shù)據(jù)那樣增加一個邏輯刪除功能。

枚舉選項的鍵是嚴禁修改的。

  • 這個就不用過多解釋了,鍵就相當于表的ID一樣,肯定是不允許修改的,用于展示的值可修改。

可以增加一些輔助功能。

  • 可以對選項增加一個排序功能,讓客戶能自定義排序。
  • 可以增加創(chuàng)建修改信息字段,記錄選項改動信息。

表結構

CREATE TABLE `sys_dict` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` varchar(30) NOT NULL COMMENT '編碼',
  `name` varchar(40) NOT NULL COMMENT '展示名稱',
  `content` json NOT NULL COMMENT '內容',
  /* 下面六個字段根據(jù)需要增加 */
  `description` varchar(200) DEFAULT NULL COMMENT '描述',
  `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否刪除 [0未刪除 1已刪除]',
  `create_by` int(11) DEFAULT NULL COMMENT '創(chuàng)建人',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
  `update_by` int(11) DEFAULT NULL COMMENT '修改人',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系統(tǒng)字典表';

實體類

@Getter
@Setter
@TableName(value = "sys_dict", autoResultMap = true)
@ApiModel("系統(tǒng)字典實體類")
public class SysDict extends BaseDO {

    @TableId(type = IdType.AUTO) //id自增
    private Integer id;

    @ApiModelProperty("編碼")
    private String code;

    @ApiModelProperty("名稱")
    private String name;

    @TableField(typeHandler = JacksonTypeHandler.class)
    @ApiModelProperty("內容列表")
    private List<DictContent> content;

    @Getter
    @Setter
    @NoArgsConstructor
    @ApiModel("系統(tǒng)字典內容實體類")
    public static class DictContent {

        @ApiModelProperty("鍵")
        private Integer key;

        @ApiModelProperty("值")
        private String value;

        @ApiModelProperty("排序,數(shù)字越小越前面")
        private Integer order;

	    @ApiModelProperty("是否刪除 [0:未刪除 1:已刪除]")
	    private Integer deleted;
		
		//輔助字段根據(jù)需求來定,有必要的情況下可以繼承BaseDO,增加那6個字段!
    }
}


@Getter
@Setter
public abstract class BaseDO implements Serializable {

    @ApiModelProperty("備注")
    private String description;

    @ApiModelProperty("是否刪除 [0:未刪除 1:已刪除]")
    private Integer deleted;

    @ApiModelProperty("創(chuàng)建人")
    private Integer createBy;

	//JSONFormat是格式化時間的輸入輸出格式
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", locale = "zh", timezone = "GMT+8")
    @ApiModelProperty("創(chuàng)建時間")
    private LocalDateTime createTime;

    @ApiModelProperty("修改人")
    private Integer updateBy;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", locale = "zh", timezone = "GMT+8")
    @ApiModelProperty("修改時間")
    private LocalDateTime updateTime;

}

這里為了方便,將創(chuàng)建修改信息等6個字段抽象出來了,以后創(chuàng)建實體類就直接繼承該類就行,同時該類聲明了序列化,所以其子類也不需要再單獨實現(xiàn)Serializable接口,一舉多得~ 

這里有兩個個細節(jié):

  • 將BaseDO類聲明成抽象類:如果不聲明成抽象類的話,在絲襪哥(Swagger)接口文檔中就只會顯示父類BaseDO的信息,不會顯示其子類信息。(我之前就是沒有聲明成抽象類,出現(xiàn)了這個問題,糾結了一陣。。。)
  • 將內部類DictContent用static修飾:如果用static修飾的話,其他地方就無法直接使用該類的構造方法;在查詢數(shù)據(jù)時,Mybatis就無法實例化該對象,會報錯的哦。

關系映射

通過Mybatis Plus注解實現(xiàn)

上文中的@TableName和@TableField是Mybatis Plus提供的注解,@TableName的autoResultMap屬性一般與content字段的@TableField的typeHandler屬性一起使用,表示會自動創(chuàng)建resultMap處理查詢返回值,但這個操作僅限于Mybatis Plus提供的查詢方法,自定義方法不會自動創(chuàng)建。

通過ResultMap實現(xiàn)

需要注意的是:如果你在對應的Mapper文件中自定義了類型為這個實體類的ResultMap的話,上述操作也不會執(zhí)行。也就是說如果需要自定義ResultMap,則需要手動增加typeHandler屬性:

沒有使用Mybatis Plus的小伙伴也是通過下述這種方式進行類型轉換~~ 

<!-- 通用查詢映射結果 -->
<resultMap id="BaseResultMap" type="com.copm.ifm.servers.insp.entity.SysDict">
    <id column="id" property="id" />
    <result column="code" property="code" />
    <result column="name" property="name" />
    <!-- 這里顯示指定typeHandler屬性值 -->
    <result column="content" property="content" 
    		jdbcType="JAVA_OBJECT" javaType="java.util.List"
            typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
    <result column="description" property="description" />
    <result column="deleted" property="deleted" />
    <result column="create_by" property="createBy" />
    <result column="create_time" property="createTime" />
    <result column="update_by" property="updateBy" />
    <result column="update_time" property="updateTime" />
</resultMap>

上述代碼中使用的jdbcType="JAVA_OBJECT"中,jdbcType的取值范圍來源于org.apache.ibatis.type.JdbcType枚舉。

content的javaType不要寫成了SysDict#DictContent 哦!他的java類型是List,DictContent是List的泛型。

只要存在type=“com.copm.ifm.servers.insp.entity.SysDict” 的resultMap,就會使Mybatis Plus的 @TableName(autoResultMap = true) 失效。

泛型擦除問題解決(7.21新增)

昨天在實際應用過程中遇到了泛型擦除問題,如下圖,content字段List的泛型明明是DictContent,但是其實際泛型卻是LinkedHashMap!所以在后面的遍歷時報類型轉換失敗的錯,這就是典型的泛型擦除問題!

詳細解決方案請看:>>泛型擦除問題解決傳送門<< 

解決方案1:

自定義一個指定泛型的集合類替代List<T>即可。

8.11新增:解決方案2:

效果展示

本文通過swagger文檔添加操作進行效果展示

接口文檔展示

接口參數(shù)內容

接口響應內容

總結

JSON類型的功能十分強大,可以通過MySQL提供的JSON相關的方法直接操作JSON字段中的某個屬性值,也可以針對JSON類型字段的數(shù)據(jù)進行各種操作。

相對于使用字符串類型保存JSON字符串的方式而言,使用JSON類型的另外一個好處是可以在程序上定義JSON格式,提供更友好而規(guī)范的API文檔。

另外如果不想使用JSON類型,直接用Varchar類型也是可以的哦!如果用JSON類型可以根據(jù)JSON對象的字段進行條件查詢!

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。 

相關文章

  • SpringBoot中dubbo+zookeeper實現(xiàn)分布式開發(fā)的應用詳解

    SpringBoot中dubbo+zookeeper實現(xiàn)分布式開發(fā)的應用詳解

    這篇文章主要介紹了SpringBoot中dubbo+zookeeper實現(xiàn)分布式開發(fā)的應用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 用Java實現(xiàn)希爾排序的示例

    用Java實現(xiàn)希爾排序的示例

    問題:現(xiàn)有一段程序S,可以對任意n個數(shù)進行排序。如果現(xiàn)在需要對n^2個數(shù)進行排序,最少需要調用S多少次?只允許調用S,不可以做別的操作。我們用希爾排序來做解決這個
    2013-11-11
  • Java創(chuàng)建ZIP壓縮文件的方法

    Java創(chuàng)建ZIP壓縮文件的方法

    這篇文章主要介紹了Java創(chuàng)建ZIP壓縮文件的方法,實例分析了java創(chuàng)建zip文件的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Lombok插件有望被Intellij IDEA收編以改善兼容性問題(推薦)

    Lombok插件有望被Intellij IDEA收編以改善兼容性問題(推薦)

    這篇文章主要介紹了Lombok插件有望被Intellij IDEA收編以改善兼容性問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java程序測試上傳Maven工程代碼示例解析

    Java程序測試上傳Maven工程代碼示例解析

    這篇文章主要介紹了Java程序測試上傳Maven工程代碼示例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • java使用compareTo實現(xiàn)一個類的對象之間比較大小操作

    java使用compareTo實現(xiàn)一個類的對象之間比較大小操作

    這篇文章主要介紹了java使用compareTo實現(xiàn)一個類的對象之間比較大小操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • async-excel實現(xiàn)多sheet異步導出方法詳解

    async-excel實現(xiàn)多sheet異步導出方法詳解

    這篇文章主要介紹了async-excel實現(xiàn)多sheet異步導出方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-12-12
  • java虛擬機學習高級篇

    java虛擬機學習高級篇

    在本篇文章里小編給大家整理了關于java虛擬機學習高級篇的相關內容,有興趣的朋友們跟著學習參考下。
    2019-06-06
  • Spring占位符Placeholder的實現(xiàn)原理解析

    Spring占位符Placeholder的實現(xiàn)原理解析

    這篇文章主要介紹了Spring占位符Placeholder的實現(xiàn)原理,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 詳解Java中的Lambda表達式

    詳解Java中的Lambda表達式

    Lambda表達式是Java SE 8中一個重要的新特性。這篇文章主要介紹了Java中的Lambda表達式 ,需要的朋友可以參考下
    2019-04-04

最新評論