私の連絡先情報
郵便メール:
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.JSONオブジェクト 。
@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;
}
この記事は完成しました!