前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解决mybatis 无法映射 数据库 json字段的问题

解决mybatis 无法映射 数据库 json字段的问题

原创
作者头像
特特
发布2022-05-22 17:58:10
4.1K2
发布2022-05-22 17:58:10
举报
文章被收录于专栏:特特的专栏特特的专栏

1.前言

MySQL从5.7版本之后开始支持JSON数据类型,相比于JSON格式的字符串类型有如下优势:存储在JSON列中的JSON文档的会被自动验证。无效的文档会产生错误;最佳存储格式。存储在JSON列中的JSON文档会被转换为允许快速读取文档元素的内部格式。

2.背景

mybatis目前还不支持映射json的数据格式,需要我们自己进行增强

3.实现

对mybatis TypeHandler进行增强

3.1ListStringTypeHandler 核心代码

代码语言:java
复制
package com.xxx.xxx.pipeline.repository.typehandle;

import com.fasterxml.jackson.core.type.TypeReference;
import lombok.SneakyThrows;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.apache.ibatis.type.TypeHandler;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class ListStringTypeHandler implements TypeHandler<List<String>> {

	@Override
	public void setParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException {
		ps.setString(i, JsonUtils.objectToJson(parameter));
	}

	@SneakyThrows
	@Override
	public List getResult(ResultSet rs, String columnName) throws SQLException {
		return JsonUtils.jsonToObject(rs.getString(columnName), new TypeReference<List>() {
		});
	}

	@SneakyThrows
	@Override
	public List getResult(ResultSet rs, int columnIndex) throws SQLException {
		return JsonUtils.jsonToObject(rs.getString(columnIndex), new TypeReference<List>() {
		});
	}

	@SneakyThrows
	@Override
	public List getResult(CallableStatement cs, int columnIndex) throws SQLException {
		return JsonUtils.jsonToObject(cs.getString(columnIndex), new TypeReference<List>() {
		});
	}
}

3.2 PO代码

代码语言:java
复制
package com.xxx.xx.pipeline.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.SneakyThrows;
import lombok.experimental.SuperBuilder;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

@Data
@SuperBuilder
@AllArgsConstructor
@NoArgsConstructor
public class PluginConfigPO extends BasePO {
    private static final String DEFAULT_JSON_LIST = "[]";
    private String gitUrl;
    private String name;
    private String title;
    private String version;
    private String description;
    private String commitId;
    private List<String> osTypes;
    private List<String> categories;
    private List<String> contributors;
    private String releaseNote;
    private LocalDateTime publishedAt;

3.3 mapper代码

代码语言:java
复制
package com.xxx.xx.pipeline.repository;

import org.apache.ibatis.annotations.*;

import java.util.List;

public interface PluginConfigDAO {
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
    @Insert("insert into plugin_config(git_url,name,commit_id," +
            "os_types,categories," +
            "published_at,contributors,title," +
            "version,release_note,description,operator,status," +
            "create_time,update_time) " +
            "value (#{gitUrl},#{name},#{commitId}," +
            "#{osTypes,jdbcType=OTHER ,typeHandler=com.xxx.xx.pipeline.repository.typehandle.ListStringTypeHandler}," +
            "#{categories,jdbcType=OTHER ,typeHandler=com.xxx.xx.pipeline.repository.typehandle.ListStringTypeHandler}," +
            "#{publishedAt},#{contributors,jdbcType=OTHER ,typeHandler=com.xxx.xx.pipeline.repository.typehandle.ListStringTypeHandler},#{title}," +
            "#{version},#{releaseNote},#{description},#{operator},#{status}," +
            "now(),now())")
    int create(PluginConfigPO pluginConfig);

3.4 配置文件代码

代码语言:java
复制
mybatis:
  configuration:
    map-underscore-to-camel-case: true
  type-handlers-package: com.xxx.xx.pipeline.repository.typehandle

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.前言
  • 2.背景
  • 3.实现
    • 3.1ListStringTypeHandler 核心代码
      • 3.2 PO代码
        • 3.3 mapper代码
          • 3.4 配置文件代码
          相关产品与服务
          云数据库 MySQL
          腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档