做金融网站看那些素材,输入关键词就能写文章的软件,3733手游网站在哪里做的,小程序api手册MySql中json类型的使用
MySQL从5.7.8起开始支持JSON字段#xff0c;这极大的丰富了MySQL的数据类型。也方便了广大开发人员。但MySQL并没有提供对JSON对象中的字段进行索引的功能#xff0c;至少没有直接对其字段进行索引的方法。本文将介绍利用MySQL 5.7中的虚拟字段的功能…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)
) ENGINEInnoDB DEFAULT CHARSETutf8;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-$.phone13752763211;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.encodingUTF-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, typeHandlercom.adu.spring_test.mybatis.typehandler.JsonTypeHandler}* 出库* resultMap* result propertyjsonDataField columnjson_data_field javaTypecom.xxx.MyClass typeHandlercom.adu.spring_test.mybatis.typehandler.JsonTypeHandler/* /resultMap** 用法二* 1在mybatis-config.xml中指定handler:* typeHandlers* typeHandler handlercom.adu.spring_test.mybatis.typehandler.JsonTypeHandler javaTypecom.xxx.MyClass/* /typeHandlers* 2)在MyClassMapper.xml里直接select/update/insert。**/
public class JsonTypeHandlerT extends Object extends BaseTypeHandlerT {private static final ObjectMapper mapper new ObjectMapper();private ClassT clazz;public JsonTypeHandler(ClassT 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 version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.cm.dao.UserDaoresultMap iduser typecom.cm.model.UserModelid columnid jdbcTypeNUMERIC propertyid/result columnname jdbcTypeVARCHAR propertyname/result columnage jdbcTypeNUMERIC propertyage/result columnhobby jdbcTypeNUMERIC propertyhobby typeHandlercom.cm.mybaits.JsonTypeHandler//resultMapselect idgetAllUsers resultMapuserselect * from user/selectinsert idaddUser!--ignore忽略自动增长的主键id--insert ignore into user (name, age, hobby) values (#{id}, #{name} ,#{hobby, typeHandlercom.cm.mybaits.JsonTypeHandler})/insertupdate idupdateUserupdate user set name#{name} where id#{id}/updatedelete iddeleteUser parameterTypeStringdelete from user where id#{id}/deleteselect idgetUser resultTypeUserModelselect * from user where id #{id}/select
/mappermysql表结构 插入的测试代码
效果预览
入库 取数据 这边有个坑是mysql 驱动一定要5.1.40不然取出来的json中文是乱码。虽然说是低于5.1.36会乱码但是我试了5.1.6还是乱码。
dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.40/version
/dependency