내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Springboot 프로젝트 개발에서 관계형 데이터베이스는 일반적으로 데이터를 저장하는 기본 데이터베이스로 사용됩니다. 때로는 비즈니스 시나리오에서 기존 테이블 구조에 대한 사용자 정의 비즈니스 정보를 확장해야 합니다. 이 시나리오에서는 일반적으로 json 유형 저장소가 사용됩니다. 이 기사에서는 Mybatis-plus의 도움으로 Springboot 프로젝트에서 json을 운영하기 위한 실용적인 솔루션을 요약합니다.
Spring boot + Mybatis-plus + PostgreSQL, PostgreSQL 데이터베이스의 특정 필드는 json 유형입니다.
MyBatis에서는 타입 핸들러(TypeHandler)가 JavaType과 JdbcType 사이를 연결하는 역할을 합니다. 이는 SQL 문을 실행할 때 Java 객체의 값을 preparedStatement로 설정하거나 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>
아래와 같이 데이터베이스에 저장된 결과를 봅니다.
먼저 PostgreSQL 데이터베이스 URL 뒤에 추가하세요. &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;
}
이 글이 끝났습니다!