MySql中json类型的使用___mybatis存取mysql中的json

MySql中json类型的使用

MySQL从5.7.8起开始支持JSON字段,这极大的丰富了MySQL的数据类型。也方便了广大开发人员。但MySQL并没有提供对JSON对象中的字段进行索引的功能,至少没有直接对其字段进行索引的方法。本文将介绍利用MySQL 5.7中的虚拟字段的功能来对JSON对象中的字段进行索引。


一、使用json的目的

1、可以直接过滤记录
2、可以直接update,而无须先读取
3、可以在一条SQL中完成多条纪录的修改!
4、通过json类型,完美的实现了表结构的动态变化
5、通过计算生成列且在该列上建立索引。提高查询效率

二、开始使用

1.建表

建表语句如下:

CREATE TABLE `msg_info` (`id` int(10) unsigned NOT NULL,`message` json NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.插入数据

insert into msg_info values (1,'{"name":"zhangsan","phone":"13752763211"}');
insert into msg_info values (2,'{"name":"lisi","phone":"13752763222"}');

3.查询更新操作

1、过滤记录

select * from	msg_info where message->'$.phone'='13752763211';

2、查询json内指定字段

select message->'$.name' from	msg_info;
# 这样查询出来的字段是带双引号的,使用如下语句可去除双引号,也可以使用关键字JSON_UNQUOTE
select message->>'$.name' from	msg_info;

3、直接更新json串内的字段内容

UPDATE msg_info set message = JSON_SET(message, '$.name', 'lili') WHERE id = 1;
# 为json串添加字段
update msg_info set message = JSON_INSERT(message, '$.age', 30) WHERE id = 1;

3.动态扩展字段

1、为json添加虚拟字段

ALTER TABLE msg_info  ADD v_phone  varchar (12) GENERATED ALWAYS  AS (JSON_UNQUOTE(message->'$.phone' ));

2、为虚拟字段创建索引,提高查询效率

# 通过执行计划可以查看创建索引前后的变化
ALTER TABLE msg_info ADD INDEX idx_phone(v_phone);

mybatis存取mysql中的json

mysql 5.7后新增了一个json类型字段,以往json入库都是转字符串,取到前端造成了不少困扰。今天就做了个小例子把这个整合到ssm例子中。

这边也顺便说下如果idea在启动tomcat客户端控制台出现乱码处理办法

打开idea安装目录-bin
用记事本打开idea.exe.vmoptions和idea64.exe.vmoptions文件
在文件后面添加一行:-Dfile.encoding=UTF-8

好了进入正题

第一步先配置一个typehandler,代码如下

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig.Feature;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;/*** mapper里json型字段到类的映射。* 用法一:* 入库:#{jsonDataField, typeHandler=com.adu.spring_test.mybatis.typehandler.JsonTypeHandler}* 出库:* <resultMap>* <result property="jsonDataField" column="json_data_field" javaType="com.xxx.MyClass" typeHandler="com.adu.spring_test.mybatis.typehandler.JsonTypeHandler"/>* </resultMap>** 用法二:* 1)在mybatis-config.xml中指定handler:*      <typeHandlers>*              <typeHandler handler="com.adu.spring_test.mybatis.typehandler.JsonTypeHandler" javaType="com.xxx.MyClass"/>*      </typeHandlers>* 2)在MyClassMapper.xml里直接select/update/insert。**/
public class JsonTypeHandler<T extends Object> extends BaseTypeHandler<T> {private static final ObjectMapper mapper = new ObjectMapper();private Class<T> clazz;public JsonTypeHandler(Class<T> clazz) {if (clazz == null) throw new IllegalArgumentException("Type argument cannot be null");this.clazz = clazz;}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, this.toJson(parameter));}@Overridepublic T getNullableResult(ResultSet rs, String columnName) throws SQLException {return this.toObject(rs.getString(columnName), clazz);}@Overridepublic T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return this.toObject(rs.getString(columnIndex), clazz);}@Overridepublic T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return this.toObject(cs.getString(columnIndex), clazz);}private String toJson(T object) {try {return mapper.writeValueAsString(object);} catch (Exception e) {throw new RuntimeException(e);}}private T toObject(String content, Class<?> clazz) {if (content != null && !content.isEmpty()) {try {return (T) mapper.readValue(content, clazz);} catch (Exception e) {throw new RuntimeException(e);}} else {return null;}}static {mapper.configure(Feature.WRITE_NULL_MAP_VALUES, false);mapper.setSerializationInclusion(Inclusion.NON_NULL);}

mapper代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cm.dao.UserDao"><resultMap id="user" type="com.cm.model.UserModel"><id column="id" jdbcType="NUMERIC" property="id"/><result column="name" jdbcType="VARCHAR" property="name"/><result column="age" jdbcType="NUMERIC" property="age"/><result column="hobby" jdbcType="NUMERIC" property="hobby" typeHandler="com.cm.mybaits.JsonTypeHandler"/></resultMap><select id="getAllUsers" resultMap="user">select * from user</select><insert id="addUser"><!--ignore忽略自动增长的主键id-->insert ignore into user (name, age, hobby) values (#{id}, #{name} ,#{hobby, typeHandler=com.cm.mybaits.JsonTypeHandler})</insert><update id="updateUser">update user set name=#{name} where id=#{id}</update><delete id="deleteUser" parameterType="String">delete from user where id=#{id}</delete><select id="getUser" resultType="UserModel">select * from user where id = #{id}</select>
</mapper>

mysql表结构
 在这里插入图片描述
插入的测试代码
在这里插入图片描述

效果预览

入库

在这里插入图片描述
取数据
在这里插入图片描述
这边有个坑是mysql 驱动一定要5.1.40,不然取出来的json中文是乱码。虽然说是低于5.1.36会乱码,但是我试了5.1.6还是乱码。

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.40</version>
</dependency>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度下拉词+php,百度下拉词是如何生成的?

我们在百度搜索某一词汇的时候&#xff0c;都会在搜索框下面弹出一些相关性和搜索次数比较多的语句或词语&#xff0c;我们在百度上搜索一下&#xff0c;就可以看到用户平时搜索习惯&#xff0c;搜索爱好是什么。护发下拉很多小伙伴就又有疑问了&#xff1a;这些下拉词是根据什…

python元组赋值给变量,Python的赋值

一、序列解包多个赋值操作同时进行&#xff1a;赋值多个值后面再遇到对多个变量赋值时&#xff0c;就不需要对一个变量赋完值再对另一个变量赋值了&#xff0c;用一条语句就可以搞定&#xff0c;例如&#xff1a;再次赋值由输出结果看到&#xff0c;x和y的值交换了&#xff0c;…

微服务,你得知道这

目录 一、业务场景介绍 二、Spring Cloud核心组件&#xff1a;Eureka 三、Spring Cloud核心组件&#xff1a;Feign 四、Spring Cloud核心组件&#xff1a;Ribbon 五、Spring Cloud核心组件&#xff1a;Hystrix 六、Spring Cloud核心组件&#xff1a;Zuul 七、总结 概述…

分布式和微服务的区别

分布式和微服务的区别 1.颜老师&#xff0c;分布式和微服务有什么区别呢&#xff1f;网上说啥的都有&#xff0c;越看越晕了。 答&#xff1a;分布式的核心就一个字&#xff1a;拆。只要是将一个项目拆分成了多个模块&#xff0c;并将这些模块分开部署&#xff0c;那就算是分布…

Oracle数据库空间突然增大,Oracle 表空间异常增长过快解决方法

1. 首先用语句查询容量大于1G的数据段select segment_name,sum(bytes)/1024/1024 from dba_segments group by segment_name having sum(bytes)/1024/1024>1000;得到如下结果&#xff1a;SYS_LOB0000136091C00003$$ 255332MSYS_LOB0000136441C00004$$ 7170MSYS_C…

分布式和微服务是什么?二者的区别又是什么?

一、分布式系统 在《分布式系统原理与范型》一书中有如下定义&#xff1a; “分布式系统是若干独立计算机的集合&#xff0c;这些计算机对于用户来说就像单个相关系统”&#xff1b; 分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统…

SpringCloud 超详细个人笔记

文章目录SpringCloud1、常见面试题2、微服务概述2.1、什么是微服务2.2、微服务和微服务架构2.3、微服务优缺点2.4、微服务技术栈有哪些&#xff1f;2.5、为什么选择SpringCloud 作为微服务架构2.5.1、选型依据2.5.2、当前各大IT公司用的微服务架构有哪些&#xff1f;2.5.3、各微…

oracle server process,Oracle体系结构及备份(四)server-process

一 什么是服务器进程 除了 Oracle 的后台进程外&#xff0c;还有一些进程是代表用户的&#xff0c;称为服务器进程。这些服务器进程负责按照用户的要求检索数据&#xff0c;并将结果返回给用户。此外&#xff0c;还负责为用户修改缓冲区高数缓存中的数据。 当用户连接到 Oracle…

潘多拉路由器搭建php,MT7620A 无线路由 极路由 1S 定制版 OPERWRT 潘多拉 中继 营销...

定制版 机器 非原版极路由 1S原版极路由下面连接购买https://item.taobao.com/item.htm?id527531952640这个机器是大客户 定制版 营销路由 硬件和极路由 1S 完全相同&#xff0c;只简化了 SD卡座更换为塑胶外壳可以自己DIY 增加USB 接口和SD卡座电源接口为 MICRO USB接口&…

linux close 头文件,Linux open close read write lseek函数的使用

我们经常需要在Linux中进行文件操作&#xff0c;今天我就来分享下文件操作用到的一些函数1 open所需头文件&#xff1a;函数原型&#xff1a;int open(const char *pathname,flags,int perms)pathname&#xff1a;被打开的文件名&#xff0c;可包含路径flag &#xff1a;文件打…

顺序表的实现(头插、尾插、头删、尾删、查找、删除、插入)

目录 一. 数据结构相关概念​ 二、线性表 三、顺序表概念及结构 3.1顺序表一般可以分为&#xff1a; 3.2 接口实现&#xff1a; 四、基本操作实现 4.1顺序表初始化 4.2检查空间&#xff0c;如果满了&#xff0c;进行增容​编辑 4.3顺序表打印 4.4顺序表销毁 4.5顺…

为什么有了接口还要增加一层抽象类?

文章目录接口&#xff1a;抽象类&#xff1a;区别&#xff1a;表象&#xff1a;深层次理解&#xff1a;类图使用抽象类前使用抽象类后为什么有了接口还要增加一层抽象类&#xff1f;接口&#xff1a; 接口里的方法和抽象类中的方法一样&#xff0c;它的方法是抽象的&#xff0…

linux iptables 编译,Linux下编译安装iptables

Linux下如何编译安装iptables实例&#xff1a;先卸载系统已经安装的iptables&#xff0c;卸载前需备份三个文档&#xff1a;iptables启动脚本&#xff0c;iptables-config配置文档&#xff0c;以及已经建立好的iptables规则文档[rootlinuxidc ~]# cp /etc/init.d/iptables ~/ip…

linux密文解密工具,Linux之加密解密工具openssl的用法以及自建CA

在Linux下的安全工具openssl【安全特性】1、保密性&#xff1a;数据保密性、隐私性2、完整性&#xff1a;数据完整性、系统完整性3、可用性4、真实性&#xff1a;确保数据发送方不是被替换的5、可追溯性【安全***】被动***&#xff1a;窃听主动***&#xff1a;伪装、重播、消息…

Windows远程连接的用户名和密码怎么设置?

1、首先&#xff0c;打开A电脑的控制面板&#xff0c;点击系统和安全进入&#xff0c;设置电脑允许远程访问&#xff1b; ] 2、查看A电脑的ip地址&#xff0c;再次打开控制面板&#xff0c;在“网络和Internet”里面点击查看网络状态和任务。 ] 3、在访问类型连接网络里面点…

linux系统date s使用,简述Linux下date命令的使用方法与实例

在Linux环境中&#xff0c;不管是编程还是其他维护&#xff0c;时间是必不可少的&#xff0c;也经常会用到时间的运算&#xff0c;熟练运用date命令来表示自己想要表示的时间&#xff0c;肯定可以给自己的工作带来诸多方便。1.命令格式&#xff1a;date [参数]... [格式]2.命令…

c语言打印字符的函数参数,C语言格式化打印函数vsnprintf()的实现

Linux内核的格式化打印函数是printk()&#xff0c;它与printf()函数是类似的&#xff0c;都是根据格式字符串把可变参数列表转化成字符序列&#xff0c;然后输出到控制台。printf()是打印到标准输出stdout。printk()是打印到控制台终端。在使用串口线连接嵌入式硬件时&#xff…

使用SpringMVC参数传递时,解决get请求时中文乱码的问题

问题描述: 使用SpringMVC参数传递时, 遇到get请求中文信息时,页面应答会显示中文乱码. 解决办法: 一, 我们需要把request.getParameter(“参数名”)获取到的字符串先用ISO-8859-1编码成字节流&#xff0c;然后再将其用utf-8解码成字符流,代码如下: String str new String(…

get请求URL传中文参数后台接收乱码的解决之道

现在需求是在浏览器里面直接发请求&#xff0c;浏览器发请求&#xff0c;默认发的是get请求&#xff0c;然后带参数&#xff0c;参数包含中文汉字。麻烦就在这里&#xff0c;参数里面的汉字&#xff0c;在后台接收的时候&#xff0c;是乱码。 这么简单的传递参数的方式&#xf…

c语言 dec2oct函数,【Excel函数】DEC2OCT函数 - 曹海峰个人博客

本文介绍Microsoft Excel中DEC2OCT函数的语法和用法。DEC2OCT函数适用于&#xff1a;Excel2003、Excel2007、Excel2010、Excel2013、Excel2016。函数说明DEC2OCT函数的主要作用是将十进制数转换为八进制数。如果该函数不可用&#xff0c;并返回错误值 #NAME?&#xff0c;请安装…