最近项目中用到mysql json数据类型,写一个demo来加深自己的理解
- 建表语句如下:
create table t_test
(
id int auto_increment primary key,
name varchar(50) null,
salary int null,
info json null,
create_time datetime null
);
-
插入3条测试数,插入数据的json的key可以随便定义,毕竟是json类型的,插入json是可以是数组或者对象,此处完全是为了sql查询而故意不一样的。
测试数据.png - 用sql语句进行查询测试:
查询1:
select * from t_test where info->'$.address' = 'shanghai';
测试结果如下:

查询1.png
查询2:
select * from t_test where JSON_CONTAINS(info,JSON_OBJECT('major','math','height',1.87));
测试查询结果:

查询2.png
JSON_OBJECT里面的数据是键值对,key不能为null,参数也不能为奇数个。如果把height修改一下再查询,则查询不到对应的结果。
- 用该表结构生成mybatis plus对应的java类:
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_test")
@ApiModel(description="")
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField("name")
private String name;
@TableField("salary")
private Integer salary;
@TableField("info")
private String info;
@TableField("create_time")
private Date createTime;
}
可以看到mybatis plus默认生成的info字段类型是string的,早期版本是@TableField(el = "info,typeHandler = com.ccm.test.handler.ListTypeHandler")试了下并不起作用,并没有去深究,升级版本后
@TableField(typeHandler = JacksonTypeHandler.class)
private List<Info> info;
试了下是可以的,测试的结果是后面重新建了表省去了几个字段

测试结果.png
