<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
JSON型別是MySQL5.7.8中新加入的一種資料型別,並在後續版本尤其是MySQL8.0中得到了大幅增強,現在的JSON型別的功能十分強大,合理使用能讓我們的開發更加有效!
但本文不準備花篇幅來介紹MySQL的JSON型別欄位的相關API,因為官方檔案裡面寫得已經十分詳細了,大家如果對MySQL的JSON型別還不怎麼了解的話可以看看官方檔案:
(ps:英語相對較差的小夥伴可以用chrome瀏覽器開啟,然後用自帶的翻譯工具翻譯後看哦~)
JSON的應用場景還是挺多的,我能想到的兩個是:
資料字典
動態表單
功能方面需要明確的是:
列舉選項是嚴禁直接刪除的。
列舉選項的鍵是嚴禁修改的。
可以增加一些輔助功能。
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 '內容', /* 下面六個欄位根據需要增加 */ `description` varchar(200) DEFAULT NULL COMMENT '描述', `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否刪除 [0未刪除 1已刪除]', `create_by` int(11) DEFAULT NULL COMMENT '建立人', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', `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='系統字典表';
@Getter @Setter @TableName(value = "sys_dict", autoResultMap = true) @ApiModel("系統字典實體類") 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("系統字典內容實體類") public static class DictContent { @ApiModelProperty("鍵") private Integer key; @ApiModelProperty("值") private String value; @ApiModelProperty("排序,數位越小越前面") private Integer order; @ApiModelProperty("是否刪除 [0:未刪除 1:已刪除]") private Integer deleted; //輔助欄位根據需求來定,有必要的情況下可以繼承BaseDO,增加那6個欄位! } } @Getter @Setter public abstract class BaseDO implements Serializable { @ApiModelProperty("備註") private String description; @ApiModelProperty("是否刪除 [0:未刪除 1:已刪除]") private Integer deleted; @ApiModelProperty("建立人") private Integer createBy; //JSONFormat是格式化時間的輸入輸出格式 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", locale = "zh", timezone = "GMT+8") @ApiModelProperty("建立時間") private LocalDateTime createTime; @ApiModelProperty("修改人") private Integer updateBy; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", locale = "zh", timezone = "GMT+8") @ApiModelProperty("修改時間") private LocalDateTime updateTime; }
這裡為了方便,將建立修改資訊等6個欄位抽象出來了,以後建立實體類就直接繼承該類就行,同時該類宣告了序列化,所以其子類也不需要再單獨實現Serializable介面,一舉多得~
這裡有兩個個細節:
通過Mybatis Plus註解實現
上文中的@TableName和@TableField是Mybatis Plus提供的註解,@TableName的autoResultMap屬性一般與content欄位的@TableField的typeHandler屬性一起使用,表示會自動建立resultMap處理查詢返回值,但這個操作僅限於Mybatis Plus提供的查詢方法,自定義方法不會自動建立。
通過ResultMap實現
需要注意的是:如果你在對應的Mapper檔案中自定義了型別為這個實體類的ResultMap的話,上述操作也不會執行。也就是說如果需要自定義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) 失效。
昨天在實際應用過程中遇到了泛型擦除問題,如下圖,content欄位List的泛型明明是DictContent,但是其實際泛型卻是LinkedHashMap!所以在後面的遍歷時報型別轉換失敗的錯,這就是典型的泛型擦除問題!
詳細解決方案請看:>>泛型擦除問題解決傳送門<<
解決方案1:
自定義一個指定泛型的集合類替代List<T>即可。
8.11新增:解決方案2:
本文通過swagger檔案新增操作進行效果展示
JSON型別的功能十分強大,可以通過MySQL提供的JSON相關的方法直接操作JSON欄位中的某個屬性值,也可以針對JSON型別欄位的資料進行各種操作。
相對於使用字串型別儲存JSON字串的方式而言,使用JSON型別的另外一個好處是可以在程式上定義JSON格式,提供更友好而規範的API檔案。
另外如果不想使用JSON型別,直接用Varchar型別也是可以的哦!如果用JSON型別可以根據JSON物件的欄位進行條件查詢!
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45