mysql 在 5.7版本以后提供了JSON数据的操作,在8.0以后提供了对JSON数据操作的API;
以下将结合代码以及SQL对JSON日常操作;
这里的JSON
字段可以使用TEXT
或者VARCHAR
在实际使用中使用JSON的格式情况会比较少;
比如在一开始创建表的时候,没有预估在这个字段里面会存哪些信息,同样可能一开始都没有计划对该字段的数据使用JSON
格式的存储;
当然如果使用JOSN
属性,mysql会对插入该字段的值进行校验,优缺点可以自己评估;
创建一个包含json字段的表;
CREATE TABLE `user_test`
(
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(20) DEFAULT NULL,
`details` json DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;
// 插入数据
insert into user_test (user_name, details) VALUE ('张三', '{"key1": "value1","key2": "value2"}');
JSON 合并
update user_test
set details= json_merge('{
"key1": "value1",
"key2": "value2"
}', '{
"key1": "value1",
"key2": "value2"
}')
where user_name = '张三';
// {"key1": ["value1", "value1"], "key2": ["value2", "value2"]}
查询JSON
-- 精确查询
SELECT JSON_KEYS(details) from user_test where user_name = '张三';
-- 模糊查询
select * from table_test t where detail->'$."key1"' LIKE '%张%';
-- 数组查询
-- 模拟数据
select * from table_test where JSON_CONTAINS( extend_info ->> '$."key1"',JSON_ARRAY ('张三'),'$');
JAVA代码
以上说的在实际操作中可以在Mybaits中拼接JSON格式的sql,同样也可以在java中提供代码,将数据拼接完成以后再插入到数据库;
由于直接赋值的话会覆盖之前的值,而一般装在扩展字段里面的值只有追加或者修改,不会做删除操作,替换掉原有的值则不符合业务需求;
// 以下为伪代码,大概的逻辑和意思是这个;
public void addDetail(String key, String value) {
Map<String, String> detail= getDetail();
if (detail== null) {
detail= new HashMap<>();
}
detail.put(key, value);
setDetail(extendInfo);
}
HashMap<String,Object> getDetail(String detail){
if(JSONUtil.isJsON(detail)){ // hutool 工具类
// 取出key转map ,同样有工具类可以快速转
JSONObject obj = JSONObject.parseJSON(detail);
}else{
return new HashMap<>();
}
}
void setDetail(HashMap<String,Object) map){
this.detail = JSONUtil.toJSONString(map);
}
正常调用 新增或者修改接口即可;