首页 > 数据库 >Mybatis和Mybatis-Plus对MySQL中json类型处理

Mybatis和Mybatis-Plus对MySQL中json类型处理

时间:2023-05-19 09:33:40浏览次数:55  
标签:JSONObject param json SQLException Plus Mybatis import com

目录

1 MySQL中json类型处理

1.1 引言

mysql5.7 开始支持json类型字段
点击了解MySQL中JSON类型数据操作

1.2 准备建表

CREATE TABLE `user` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `content` json DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

1.3 Mybatis

由于 Mybatis 不支持对MySQLJSON类型处理需要另外处理

1.3.1 实体类

package com.test.entity;
import com.alibaba.fastjson.JSONObject;
@Data
public class User implements Serializable {
	private static final long serialVersionUID = 1L;
	private Long id;
	private String name;
	private JSONObject content;
}

1.3.2 BaseTypeHandler

此处可以选择实现TypeHandler接口或者继承BaseTypeHandler

其中的注解:@MappedTypes@MappedJdbcTypesMyBatis框架中的注解,用于指定Java类型JDBC类型之间的映射关系:

  • @MappedTypes:用于指定Java类型与数据库中的数据类型之间的映射关系。
  • @MappedJdbcTypes:用于指定JDBC类型与Java类型之间的映射关系
package com.test.handler;

import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

@MappedTypes(JSONObject.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MySqlJsonHandler extends BaseTypeHandler<JSONObject>{
    /**
     * 设置非空参数
     * @param ps
     * @param i
     * @param parameter
     * @param jdbcType
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i,String.valueOf(parameter.toJSONString()));
    }
    /**
     * 根据列名,获取可以为空的结果
     * @param rs
     * @param columnName
     * @return
     * @throws SQLException
     */
    @Override
    public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String sqlJson = rs.getString(columnName);
        if (null != sqlJson) {
            return JSONObject.parseObject(sqlJson);
        }
        return null;
    }
    /**
     * 根据列索引,获取可以为内控的接口
     * @param rs
     * @param columnIndex
     * @return
     * @throws SQLException
     */
    @Override
    public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String sqlJson = rs.getString(columnIndex);
        if (null != sqlJson) {
            return JSONObject.parseObject(sqlJson);
        }
        return null;
    }
    /**
     *
     * @param cs
     * @param columnIndex
     * @return
     * @throws SQLException
     */
    @Override
    public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String sqlJson = cs.getNString(columnIndex);
        if (null != sqlJson) {
            return JSONObject.parseObject(sqlJson);
        }
        return null;
    }
}

1.3.3 application.yml

application.yml 中增加对应配置,把定义的类型转换器注册到mybatis容器中
点击此处了解Mybatis之原理详解

mybatis:
  type-handlers-package: com.test.handler  #增加此项配置

mybatis.type-handlers-packageMyBatis配置文件中的一个属性,用于指定自定义类型处理器的包名。
通过配置mybatis.type-handlers-package属性,可以让MyBatis自动扫描指定包下的所有类型处理器,并将其注册到MyBatis中。这样,在进行数据库操作时,MyBatis就可以自动使用这些类型处理器进行类型转换,从而简化了开发人员的工作

1.3.4 修改SQL文件

<resultMap id="BaseResultMap" type="com.test.entity.User" >
    
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <!--将json类型的rules字段修改为如下形式-->
    <result column="content" property="content" typeHandler="com.test.handler.MySqlJsonHandler" />
  </resultMap>

在xml中写sql语句时,需要将使用到 JSON字段的地方配置,以下以插入为例

<insert id="insertTest" parameterType="com.test.entity.User" >
   
    insert into user (id, name, content)
    values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, 
    #{content,jdbcType=OTHER,typeHandler=com.test.handler.MySqlJsonHandler})
  </insert>

1.4 MybatisPlus

在实体类加上@TableName(autoResultMap = true)
JSON字段映射的属性加上@TableField(typeHandler = JacksonTypeHandler.class)

1.4.1 实体类

package com.test.entity;
import com.alibaba.fastjson.JSONObject;
@Data
@TableName(value = "user",autoResultMap = true)
public class User implements Serializable {
	private static final long serialVersionUID = 1L;
	private Long id;
	private String name;
	@TableField(value="content",typeHandler = JacksonTypeHandler.class)
	private JSONObject content;
}

另外,此处的JacksonTypeHandler也可以替换成像上面自定义的MySqlJsonHandler

1.4.2 application.yml

如果在实体类中 typeHandler 使用的是 Mybatis-Plus 提供的则不需要在注册到 mybatis-plus 容器中,如果像上面使用类似1.3.2自定义的typeHandler ,则要在配置文件中添加属性:mybatis-plus.type-handlers-package来指定自定义的 typeHandler 包的位置
点击此处了解Mybatis之原理详解

application.yml 中增加对应配置

mybatis-plus:
  type-handlers-package: com.test.handler  #增加此项配置

1.4.3 SQL文件

如果启动报错:No typehandler found for content....
那么在对应的mapper文件里面对应的JSON字段 添加typeHandler

<resultMap id="BaseResultMap" type="com.test.entity.User">
        <id column="id" property="id" />
        <result column="name" property="name" />
        <result column="content" property="content" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
    </resultMap>

xml中写sql语句时,需要将使用到 JSON字段的地方配置,也要像Mybatis那样处理

<insert id="insertUser" parameterType="com.test.entity.User">
        insert into 
        	user 
        values(#{id},#{name},#{content,jdbcType=OTHER,typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler})
    </insert>

标签:JSONObject,param,json,SQLException,Plus,Mybatis,import,com
From: https://www.cnblogs.com/jingzh/p/17413963.html

相关文章

  • 聊聊Mybatis集成Spring的原理
    一般都是研究框架源码,我为什么要反过来研究集成原理呢?在我自己看来,集成虽然比较简单,但要求的细节比较多,需要掌握根本性的东西才能做到集成。Mybatis集成Spring用到了FactoryBean以及BeanDefinition注册的原理,从这两个维度来实现集成,而我们单独学习Spring时,一般会忽略这两点。My......
  • Element plus admin安装依赖
    一,首选确保已经安装了node,我安装的是当前最新版:18.16二,安装pnpm,在命令行中执行:npminstall-gpnpmpnpm官网:https://www.pnpm.cn三,打开Elementplusadmin工程,在里面双击i随后就开始安装各种依赖了! Elementplusadmin官网:https://github.com/kailong321200875/vue-elem......
  • 【cplusplus教程翻译】名字可见性(Name visibility)
    作用域(Scopes)命名实体,如变量、函数和复合类型,在C++中使用之前需要声明。程序中发生此声明的点会影响其可见性:在任何块外部声明的实体都具有全局作用域,这意味着其名称在代码中的任何位置都是有效的。而在块内声明的实体,如函数或选择性语句,具有块作用域,并且只能在声明它的特定块内......
  • 利用python解析log日志,json文件,配置文件。
    对于喜欢偷懒的我来说,重复同样的工作是很令人头疼的事情,总想找到一条捷径,最好是一劳永逸。本次跟大家分享的是对log日志,json文件以及配置文件的解析,读取。首先是log日志的读写:读取数据:f=open("spring05注意事项.txt",mode='r',encoding='utf-8')line=f.readline()whileline......
  • MybatisPlus中LamdaQueryWrapper 与 QueryWrapper的使用及区别
    一、QueryWrapper的使用;比如有一张表trolley_itme,需要通过device_id查询出符合条件的所有数据(返回List集合);1、QueryWrapper的最基础的使用方式是这样的:必须写清楚具体的字段名称(即有硬编码的嫌疑)//查询条件的构造器:QueryWrapper<TrolleyItme>queryWrapper=new QueryWra......
  • JSON
    我们为什么使用JSON代替XML来用于与服务端交换数据?JSON与XML的相同之处:JSON和XML数据都是"自我描述",都易于理解。JSON和XML数据都是有层次的结构JSON和XML数据可以被大多数编程语言使用JSON与XML的不同之处:JSON不需要结束标签JSON更加简短JSON读写......
  • SpringBoot02_Mybatis和配置文件
    关于本文的大体框架在上一篇博客一、SpringBoot整合Mybatis(一)配置文件​ 引入springboot与mybatis整合包以及java-connector<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><versi......
  • elementplus tag数组。并且表格不换行,宽度自定义
    修改bugbug那些tag要是没有内容的话全部加上<el-tagv-if="scope.row.label">{{scope.row.label}}</el-tag>以及兴趣栏目其实是tag数组。并且表格不换行,宽度自定义<el-tablestyle="width:100%"border><el-table-column:label="......
  • 图论 plus
    P5304「GXOI/GZOI2019」旅行者如果是无向边,那么以所有感兴趣的城市为起点跑一遍Dijkstra即可,遇到访问过的点就说明找到了最短路。但题目已经写清楚可能存在自环和重边,而起点和终点相同不算两两之间,所以还需要额外记录一下起点。变成有向边后,我们不能在任意一个点处合并最短......
  • MyBatis 学习(二)
    一、XML配置文件1、XML映射配置文件的结构configuration配置properties属性settings设置typeAliases类型别名typeHandlers类型处理器objectFactory对象工厂plugins插件environments环境environment环境变量......