MySQL7新特性之JSON数据类型

MySQL 5.7.8开始,原生提供了一个JSON类型的数据格式,在此之前类似的需求都是需要通过VARCHAR的方式来存储处理的。

  • JSON数据类型,拥有自动校验格式功能;
  • 提供操作JSON数据的内置函数;
  • 优化的存储格式,存储在JSON列中的JSON数据被转换成内部的存储格式,允许快速读取;
  • 支持修改JSON对象的特定属性,而不需要更新整个JSON内容;
  • 支持创建JSON对象的特定属性索引;

创建表

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE user
(
id INT AUTO_INCREMENT,
username VARCHAR(12) NOT NULL COMMENT '用户名',
password VARCHAR(32) NOT NULL COMMENT '密码',
extends JSON NULL COMMENT '扩展信息',
CONSTRAINT user_pk
PRIMARY KEY (id)
)
COMMENT '用户表';

CREATE UNIQUE INDEX user_username_uindex
ON user (username);

直接指定字段的类型为JSON即可。

解决FastJson中ref重复引用问题

解决FastJson中”$ref重复引用”的问题,先来看一个例子吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static void main(String[] args) {
UserGroup userGroup = new UserGroup().setName("UserGroup");

User user = new User("User");
for (int i = 0; i < 3; i++) {
userGroup.addUser(user);
}
Console.log(JSON.toJSONString(userGroup));
}


@Data
@AllArgsConstructor
static class User {
private String name;
}

@Data
@Accessors(chain = true)
static class UserGroup {
private String name;
private List<User> users = Lists.newArrayList();

public UserGroup addUser(User user) {
this.getUsers().add(user);
return this;
}
}

输出结果:

1
{"name":"UserGroup","users":[{"name":"User"},{"$ref":"$.users[0]"},{"$ref":"$.users[0]"}]}

上面的现象就是将user对象的引用重复使用造成了重复引用问题,Fastjson默认开启引用检测将相同的对象写成引用的形式:

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×