本文为博主原创,转载请注明出处,原文地址:https://blog.csdn.net/qq_38688267/article/details/107386138
JSON类型是MySQL5.7.8中新加入的一种数据类型,并在后续版本尤其是MySQL8.0中得到了大幅增强,现在的JSON类型的功能十分强大,合理使用能让我们的开发更加有效!
但本文不准备花篇幅来介绍MySQL的JSON类型字段的相关API,因为官方文档里面写得已经十分详细了,大家如果对MySQL的JSON类型还不怎么了解的话可以看看官方文档:
- MySQL5.7 JSON功能介绍:https://dev.mysql.com/doc/refman/5.7/en/mysql-nutshell.html (搜 JSON support)
- MySQL8.0 JSON增强说明:https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html (搜 JSON enhanc)
- MySQL8.0 JSON功能介绍:https://dev.mysql.com/doc/refman/8.0/en/json.html
(ps:英语相对较差的小伙伴可以用chrome浏览器打开,然后用自带的翻译工具翻译后看哦~)
JSON的应用场景还是挺多的,我能想到的两个是:
本文将针对数据字典使用JSON类型案例进行详细介绍,本文中使用的ORM框架是Mybatis,其他ORM框架应该也大同小异。如果其他框架使用出现问题,可以留言一起讨论哦~
本文中还是用了Swagger、Mybatis Plus、Lombok等工具,如果这些还不熟悉的可以先去做做功课哦,这些都是开发中非常强大而给力的工具,让我们编码时如虎添翼,效率翻倍~
功能方面需要明确的是:
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接口,一举多得~
这里有两个个细节:
- 将BaseDO类声明成抽象类:如果不声明成抽象类的话,在丝袜哥(Swagger)接口文档中就只会显示父类BaseDO的信息,不会显示其子类信息。(我之前就是没有声明成抽象类,出现了这个问题,纠结了一阵。。。)
- 将内部类DictContent用static修饰:如果用static修饰的话,其他地方就无法直接使用该类的构造方法;在查询数据时,Mybatis就无法实例化该对象,会报错的哦。
@TableName
和@TableField
是Mybatis Plus提供的注解,@TableName
的autoResultMap
属性一般与content字段的@TableField
的typeHandler
属性一起使用,表示会自动创建resultMap处理查询返回值,但这个操作仅限于Mybatis Plus提供的查询方法,自定义方法不会自动创建。需要注意的是:
如果你在对应的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) 失效。
本文通过swagger文档添加操作进行效果展示
如果觉得该文档对你有所启发或帮助,记得双击么么哒~
本文地址:https://blog.csdn.net/qq_38688267/article/details/107386138
如对本文有疑问, 点击进行留言回复!!
整合SpringBoot写的Coffee网站,前端模仿星巴克
<Unity Scripts ERROR> Unity 脚本报错合集(附带解决办法)
网络同步在游戏历史中的发展变化(四)—— 状态同步的发展历程与基本原理(下)...
Codeforces - Yet Another Segments Subset
网友评论