प्रौद्योगिकी साझेदारी

[PostgreSQL] वसन्त-बूट् Mybatis-plus PostgreSQL json प्रकारस्य स्थितिः नियन्त्रयति

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

I. परिचयः

Springboot परियोजनाविकासे सामान्यतया दत्तांशसङ्ग्रहार्थं मुख्यदत्तांशकोशरूपेण सम्बन्धात्मकदत्तांशकोशस्य उपयोगः भवति कदाचित् व्यावसायिकपरिदृश्येषु विद्यमानसारणीसंरचनायाः कस्टमव्यापारसूचनायाः विस्तारस्य आवश्यकता भवति । अस्मिन् परिदृश्ये सामान्यतया json प्रकारस्य भण्डारणस्य उपयोगः भवति । अयं लेखः Mybatis-plus इत्यस्य साहाय्येन Springboot परियोजनायां json इत्यस्य संचालनस्य व्यावहारिकसमाधानस्य सारांशं ददाति ।

2. प्रौद्योगिकी ढेर

Spring boot + Mybatis-plus + PostgreSQL, PostgreSQL आँकडाकोषे एकं निश्चितं क्षेत्रं json प्रकारस्य भवति ।

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

3. पृष्ठभूमिविश्लेषणम्

MyBatis इत्यस्मिन् type handler (TypeHandler) JavaType तथा JdbcType इत्येतयोः मध्ये सेतुस्य भूमिकां निर्वहति । तेषां उपयोगः SQL स्टेट्मेण्ट् निष्पादयति समये जावा ऑब्जेक्ट् इत्यस्य मूल्यं PreparedStatement इत्यत्र सेट् कर्तुं, अथवा ResultSet अथवा CallableStatement इत्यस्मात् मूल्यं पुनः प्राप्तुं भवति ।

MyBatis-Plus भवन्तं केचन अन्तर्निर्मितप्रकारस्य प्रोसेसराः प्रदाति, ये भवितुम् अर्हन्ति TableField एनोटेशन्स् शीघ्रं MyBatis पात्रे प्रविष्टाः भवन्ति, येन विकासप्रक्रिया सरलं भवति । MyBatis-Plus क्षेत्रप्रकारस्य प्रोसेसर आधिकारिकसन्दर्भदस्तावेजः:क्षेत्र प्रकार प्रोसेसर |.

JSON क्षेत्रप्रकारस्य संचालकः

MyBatis-Plus इत्यत्र विविधाः अन्तःनिर्मिताः JSON प्रकारस्य प्रोसेसरः सन्ति, यथा... AbstractJsonTypeHandler तस्य उपवर्गाः चFastjson2TypeHandlerFastjsonTypeHandlerGsonTypeHandlerJacksonTypeHandler प्रतीक्षतु। एते प्रोसेसराः JSON स्ट्रिंग् जावा ऑब्जेक्ट्स् मध्ये परिवर्तयितुं शक्नुवन्ति ।

4. कार्यक्रमविश्लेषणम्

4.1 PostgreSQL दत्तांशकोशे json ऑब्जेक्ट्स् प्रत्यक्षतया संग्रहयन्तु

PostgreSQL आँकडाधारक्षेत्राणि उपरि चित्रे दर्शितानि सन्ति: param_config json प्रकारस्य क्षेत्रम् अस्ति ।

Step 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

चरण 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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

दत्तांशकोशे रक्षितानि परिणामानि पश्यन्तु, यथा अधः दर्शितम् अस्ति:

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

4.2 PostgreSQL आँकडाकोषे json स्ट्रिंग् इत्यस्य संग्रहणम्

प्रथमं PostgreSQL database URL इत्यस्य अनन्तरं योजयन्तु &stringtype=अनिर्दिष्टम्, ध्यानं कुर्वन्तु यत् यदि एतत् विन्यासः प्रत्यक्षतया दत्तांशकोशनाम्नः पूर्वं भवति तर्हि भवद्भिः आवश्यकम् & प्रतिस्थापनं कृत्वा?

Step 1: DO entity class इति लेखनम्

@TableField(value = "param_config", typeHandler = JacksonTypeHandler.class)
private String paramConfig;
  • 1
  • 2

चरण 2: XML विन्यास तत्सम्बद्ध लेखनविधिः

<!-- 单个字段的类型处理器配置 -->
<result column="param_config" jdbcType="VARCHAR" property="paramConfig" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
  • 1
  • 2

दत्तांशकोशे रक्षितानि परिणामानि पश्यन्तु, यथा अधः दर्शितम् अस्ति:

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

5. कस्टम प्रकार प्रोसेसर

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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

५.२ कस्टम् टाइप प्रोसेसर इत्यस्य उपयोगः

सत्तावर्गे उत्तीर्णः 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

मैपर सञ्चिकां परिवर्तयन्तु

<?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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

व्यावसायिक कोड

    /**
     * 新增数据
     */
    @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;
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

अयं लेखः समाप्तः!