моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
При разработке проекта Springboot реляционная база данных обычно используется в качестве основной базы данных для хранения данных. Иногда бизнес-сценарии требуют расширения пользовательской бизнес-информации в существующей структуре таблицы. В этом сценарии обычно используется хранилище типа JSON. В этой статье обобщается практическое решение по работе с json в проекте Springboot с помощью Mybatis-plus.
Spring boot + Mybatis-plus + PostgreSQL, определенное поле в базе данных PostgreSQL имеет тип json.
В MyBatis обработчик типа (TypeHandler) играет роль моста между JavaType и JdbcType. Они используются для установки значения объекта Java в ReadedStatement при выполнении инструкции SQL или для получения значения из ResultSet или CallableStatement.
MyBatis-Plus предоставляет вам несколько процессоров встроенного типа, которые можно TableField
Аннотации быстро вводятся в контейнер MyBatis, упрощая процесс разработки. Официальный справочный документ процессора полевого типа MyBatis-Plus:Процессор полевого типа | MyBatis-Plus (baomidou.com)
Обработчик типа поля JSON
MyBatis-Plus имеет множество встроенных процессоров типа JSON, в том числе AbstractJsonTypeHandler
и его подкатегорииFastjson2TypeHandler
、FastjsonTypeHandler
、GsonTypeHandler
、JacksonTypeHandler
ждать. Эти процессоры могут преобразовывать строки JSON в объекты Java и обратно.
Поля базы данных PostgreSQL показаны на рисунке выше: param_config — поле типа json.
Шаг 1. Написание объектов DO
Тип данных поля: com.alibaba.fastjson2.JSONObject 。
@Data
@Accessors(chain = true)
@TableName(autoResultMap = true)
public class User {
private Long id;
...
/**
* 关键代码!!!
* 必须开启映射注解
*
* @TableName(autoResultMap = true)
*
* 选择对应的 JSON 处理器,并确保存在对应的 JSON 解析依赖包
*/
@TableField(value = "param_config", typeHandler = JacksonTypeHandler.class)
// 或者使用 FastjsonTypeHandler
// @TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject paramConfig;
}
Шаг 2: Конфигурация XML, соответствующий метод записи
<!-- 关键代码!!!!!!! -->
<!-- 单个字段的类型处理器配置 -->
<result column="param_config" jdbcType="VARCHAR" property="paramConfig" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
<!-- 多个字段中某个字段的类型处理器配置 -->
<resultMap id="departmentResultMap" type="com.baomidou...DepartmentVO">
<result property="director" column="director" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
</resultMap>
<select id="selectPageVO" resultMap="departmentResultMap">
select id,name,director from department ...
</select>
Просмотрите результаты, сохраненные в базе данных, как показано ниже:
Сначала добавьте после URL-адреса базы данных PostgreSQL. &stringtype=не указано, обратите внимание: если этой конфигурации непосредственно предшествует имя базы данных, вам необходимо & Заменить? 。
Шаг 1. Написание класса сущности DO
@TableField(value = "param_config", typeHandler = JacksonTypeHandler.class)
private String paramConfig;
Шаг 2: Конфигурация XML, соответствующий метод записи
<!-- 单个字段的类型处理器配置 -->
<result column="param_config" jdbcType="VARCHAR" property="paramConfig" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
Просмотрите результаты, сохраненные в базе данных, как показано ниже:
В MyBatis-Plus помимо использования встроенного текстового процессора разработчики также могут настраивать текстовые процессоры по мере необходимости.
Например, при использовании базы данных PostgreSQL вы можете столкнуться с полями типа JSON. В этом случае вы можете создать процессор специального типа для обработки данных JSON.
Ниже приведен пример пользовательского процессора типа JSON:
package com.ruoyi.common.utils.pg;
import com.ruoyi.common.utils.StringUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGobject;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @ClassName: JsonTypeHandlerPg
* @Description: json对象处理
* @Author: hjm
* @Date: 2024-07-11 10:34
*/
@MappedTypes(String.class)
public class JsonTypeHandlerPg extends BaseTypeHandler<String> {
/**
* 引入PGSQL提供的工具类PGobject
*/
private static final PGobject JSON_OBJECT = new PGobject();
public static final String JSON_TYPE = "json";
/**
* 关键位置!!!
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String param, JdbcType jdbcType) throws SQLException {
JSON_OBJECT.setType(JSON_TYPE);
JSON_OBJECT.setValue(param);
ps.setObject(i, JSON_OBJECT);
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
String sqlJson = rs.getString(columnName);
if (StringUtils.isNotBlank(sqlJson)) {
return sqlJson;
}
return null;
}
// 根据列索引,获取可以为空的结果
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String sqlJson = rs.getString(columnIndex);
if (StringUtils.isNotBlank(sqlJson)) {
return sqlJson;
}
return null;
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String sqlJson = cs.getString(columnIndex);
if (StringUtils.isNotBlank(sqlJson)) {
return sqlJson;
}
return null;
}
}
В классе сущности передайте TableField
Аннотации определяют обработчики пользовательских типов:
/**
* 测试对象
*
* @author hjm
* @date 2024-07-11
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("data_test")
public class DataTest extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id")
private Long id;
/**
* 关键位置!!!
*/
@TableField(typeHandler = JsonTypeHandlerPg.class)
private String jsonData;
}
Изменить файл сопоставления
<?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.ruoyi.dt.mapper.DataTestMapper">
<resultMap type="com.ruoyi.dt.domain.DataTest" id="DataTestResult">
<result property="id" column="id"/>
<!-- 关键位置!!! -->
<result property="jsonData" column="json_data" typeHandler="com.ruoyi.common.utils.pg.JsonTypeHandlerPg"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</resultMap>
</mapper>
Бизнес-код
/**
* 新增数据
*/
@Override
public Boolean insertByAo(DataTestAo ao) {
DataTest add = BeanUtil.toBean(ao, DataTest.class);
// 关键位置!!!
add.setJsonData(JSONUtil.toJsonStr(ao));
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
ao.setId(add.getId());
}
return flag;
}
Эта статья закончена!