informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Dalam pengembangan proyek Springboot, database relasional umumnya digunakan sebagai database utama untuk menyimpan data. Terkadang skenario bisnis memerlukan perluasan informasi bisnis khusus pada struktur tabel yang ada. Dalam skenario ini, penyimpanan tipe json umumnya digunakan. Artikel ini merangkum solusi praktis untuk mengoperasikan json di proyek Springboot dengan bantuan Mybatis-plus.
Spring boot + Mybatis-plus + PostgreSQL, bidang tertentu dalam database PostgreSQL bertipe json.
Di MyBatis, pengendali tipe (TypeHandler) berperan sebagai jembatan antara JavaType dan JdbcType. Mereka digunakan untuk mengatur nilai objek Java ke PreparedStatement saat menjalankan pernyataan SQL, atau untuk mengambil nilai dari ResultSet atau CallableStatement.
MyBatis-Plus memberi Anda beberapa jenis prosesor bawaan, yang bisa saja TableField
Anotasi dengan cepat dimasukkan ke dalam wadah MyBatis, menyederhanakan proses pengembangan. Dokumen referensi resmi prosesor tipe lapangan MyBatis-Plus:Prosesor tipe bidang |. MyBatis-Plus (baomidou.com)
Penangan tipe bidang JSON
MyBatis-Plus memiliki beragam prosesor tipe JSON bawaan, termasuk AbstractJsonTypeHandler
dan subkategorinyaFastjson2TypeHandler
、FastjsonTypeHandler
、GsonTypeHandler
、JacksonTypeHandler
Tunggu. Prosesor ini dapat mengonversi string JSON ke dan dari objek Java.
Bidang database PostgreSQL ditunjukkan pada gambar di atas: param_config adalah bidang tipe json.
Langkah 1: Menulis entitas DO
Tipe data bidangnya adalah 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;
}
Langkah 2: Konfigurasi XML metode penulisan yang sesuai
<!-- 关键代码!!!!!!! -->
<!-- 单个字段的类型处理器配置 -->
<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>
Lihat hasil yang disimpan dalam database, seperti gambar di bawah ini:
Tambahkan pertama setelah URL database PostgreSQL &stringtype=tidak ditentukan, perhatikan bahwa jika konfigurasi ini diawali langsung dengan nama database, Anda perlu melakukannya & Ubah dengan? 。
Langkah 1: Menulis kelas entitas DO
@TableField(value = "param_config", typeHandler = JacksonTypeHandler.class)
private String paramConfig;
Langkah 2: Konfigurasi XML metode penulisan yang sesuai
<!-- 单个字段的类型处理器配置 -->
<result column="param_config" jdbcType="VARCHAR" property="paramConfig" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
Lihat hasil yang disimpan dalam database, seperti gambar di bawah ini:
Di MyBatis-Plus, selain menggunakan tipe prosesor bawaan, pengembang juga dapat menyesuaikan tipe prosesor sesuai kebutuhan.
Misalnya, saat menggunakan database PostgreSQL, Anda mungkin menemukan bidang bertipe JSON. Dalam hal ini, Anda dapat membuat prosesor tipe khusus untuk memproses data JSON.
Berikut ini adalah contoh prosesor jenis JSON khusus:
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;
}
}
Di kelas entitas, lulus TableField
Anotasi menentukan penangan tipe khusus:
/**
* 测试对象
*
* @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;
}
Ubah file pembuat peta
<?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>
Kode bisnis
/**
* 新增数据
*/
@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;
}
Artikel ini selesai!