τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
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 σε μια PreparedStatement κατά την εκτέλεση μιας πρότασης 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;
}
Τροποποίηση αρχείου mapper
<?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;
}
Αυτό το άρθρο τελείωσε!