2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Springboot-projektikehityksessä relaatiotietokantaa käytetään yleensä päätietokantana tietojen tallentamiseen. Joskus liiketoimintaskenaariot edellyttävät mukautettujen liiketoimintatietojen laajentamista olemassa olevaan taulukkorakenteeseen. Tässä skenaariossa käytetään yleensä json-tyyppistä tallennustilaa. Tämä artikkeli tiivistää käytännön ratkaisun jsonin käyttämiseen Springboot-projektissa Mybatis-plusin avulla.
Spring boot + Mybatis-plus + PostgreSQL, tietty kenttä PostgreSQL-tietokannassa on json-tyyppinen.
MyBatisissa tyyppikäsittelijä (TypeHandler) toimii sillana JavaTypen ja JdbcTypen välillä. Niitä käytetään Java-objektin arvon asettamiseen PreparedStatementiksi SQL-käskyä suoritettaessa tai arvon hakemiseen ResultSet- tai CallableStatement-lausekkeesta.
MyBatis-Plus tarjoaa joitain sisäänrakennettuja prosessoreita, jotka voivat olla TableField
Annotaatiot ruiskutetaan nopeasti MyBatis-säiliöön, mikä yksinkertaistaa kehitysprosessia. MyBatis-Plus kenttätyyppisen prosessorin virallinen viiteasiakirja:Kenttätyyppinen prosessori |. MyBatis-Plus (baomidou.com)
JSON-kenttätyypin käsittelijä
MyBatis-Plusissa on useita sisäänrakennettuja JSON-tyyppisiä prosessoreita, mukaan lukien AbstractJsonTypeHandler
ja sen alaluokatFastjson2TypeHandler
、FastjsonTypeHandler
、GsonTypeHandler
、JacksonTypeHandler
odota. Nämä prosessorit voivat muuntaa JSON-merkkijonoja Java-objekteiksi ja niistä.
PostgreSQL-tietokantakentät näkyvät yllä olevassa kuvassa: param_config on json-tyyppinen kenttä.
Vaihe 1: DO-kokonaisuuksien kirjoittaminen
Kentän tietotyyppi on 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;
}
Vaihe 2: XML-määritys vastaava kirjoitustapa
<!-- 关键代码!!!!!!! -->
<!-- 单个字段的类型处理器配置 -->
<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>
Tarkastele tietokantaan tallennettuja tuloksia alla olevan kuvan mukaisesti:
Lisää ensin PostgreSQL-tietokannan URL-osoitteen jälkeen &stringtype=määrittämätön, huomaa, että jos tätä kokoonpanoa edeltää suoraan tietokannan nimi, sinun on tehtävä tämä & Korvata? 。
Vaihe 1: DO-entiteettiluokan kirjoittaminen
@TableField(value = "param_config", typeHandler = JacksonTypeHandler.class)
private String paramConfig;
Vaihe 2: XML-määritys vastaava kirjoitustapa
<!-- 单个字段的类型处理器配置 -->
<result column="param_config" jdbcType="VARCHAR" property="paramConfig" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
Tarkastele tietokantaan tallennettuja tuloksia alla olevan kuvan mukaisesti:
MyBatis-Plusissa sisäänrakennetun tyyppiprosessorin käytön lisäksi kehittäjät voivat myös mukauttaa tyyppiprosessoreja tarpeen mukaan.
Esimerkiksi kun käytät PostgreSQL-tietokantaa, saatat kohdata JSON-tyyppisiä kenttiä. Tässä tapauksessa voit luoda mukautetun tyyppisen prosessorin käsittelemään JSON-tietoja.
Seuraavassa on esimerkki mukautetusta JSON-tyyppisestä prosessorista:
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;
}
}
Entiteettiluokassa läpäise TableField
Huomautukset määrittelevät mukautetun tyypin käsittelijät:
/**
* 测试对象
*
* @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;
}
Muokkaa kartoitustiedostoa
<?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>
Yrityskoodi
/**
* 新增数据
*/
@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;
}
Tämä artikkeli on valmis!