Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
En el desarrollo de proyectos Springboot, generalmente se utiliza una base de datos relacional como base de datos principal para almacenar datos. A veces, los escenarios comerciales requieren ampliar información comercial personalizada en la estructura de la tabla existente. En este escenario, generalmente se utiliza el almacenamiento de tipo json. Este artículo resume la solución práctica para operar json en el proyecto Springboot con la ayuda de Mybatis-plus.
Spring boot + Mybatis-plus + PostgreSQL, un determinado campo en la base de datos PostgreSQL es de tipo json.
En MyBatis, el controlador de tipos (TypeHandler) desempeña el papel de puente entre JavaType y JdbcType. Se utilizan para establecer el valor de un objeto Java en PreparedStatement al ejecutar una declaración SQL, o para recuperar un valor de ResultSet o CallableStatement.
MyBatis-Plus le proporciona algunos procesadores integrados, que pueden ser TableField
Las anotaciones se inyectan rápidamente en el contenedor MyBatis, simplificando el proceso de desarrollo. Documento de referencia oficial del procesador de tipo de campo MyBatis-Plus:Procesador de tipo campo | MyBatis-Plus (baomidou.com)
Controlador de tipo de campo JSON
MyBatis-Plus tiene una variedad de procesadores tipo JSON incorporados, que incluyen AbstractJsonTypeHandler
y sus subcategoríasFastjson2TypeHandler
、FastjsonTypeHandler
、GsonTypeHandler
、JacksonTypeHandler
esperar. Estos procesadores pueden convertir cadenas JSON hacia y desde objetos Java.
Los campos de la base de datos PostgreSQL se muestran en la figura anterior: param_config es un campo de tipo json.
Paso 1: escribir entidades DO
El tipo de datos del campo es com.alibaba.fastjson2.Objeto JSON 。
@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;
}
Paso 2: método de escritura correspondiente a la configuración 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>
Vea los resultados guardados en la base de datos, como se muestra a continuación:
Primero agregue después de la URL de la base de datos PostgreSQL &stringtype=no especificado, tenga en cuenta que si esta configuración está precedida directamente por el nombre de la base de datos, debe & Reemplazar con? 。
Paso 1: escribir la clase de entidad DO
@TableField(value = "param_config", typeHandler = JacksonTypeHandler.class)
private String paramConfig;
Paso 2: método de escritura correspondiente a la configuración XML
<!-- 单个字段的类型处理器配置 -->
<result column="param_config" jdbcType="VARCHAR" property="paramConfig" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
Vea los resultados guardados en la base de datos, como se muestra a continuación:
En MyBatis-Plus, además de utilizar el procesador de tipos integrado, los desarrolladores también pueden personalizar los procesadores de tipos según sea necesario.
Por ejemplo, cuando utiliza una base de datos PostgreSQL, puede encontrar campos de tipo JSON. En este caso, puede crear un procesador de tipo personalizado para procesar datos JSON.
El siguiente es un ejemplo de un procesador de tipo JSON personalizado:
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;
}
}
En la clase de entidad, pase TableField
Las anotaciones especifican controladores de tipos personalizados:
/**
* 测试对象
*
* @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;
}
Modificar archivo asignador
<?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>
código comercial
/**
* 新增数据
*/
@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;
}
¡Este artículo está terminado!