From c3b18774e06560a459b95e58dcc07cb912ca5cc7 Mon Sep 17 00:00:00 2001 From: ziin Date: Mon, 29 Dec 2025 15:00:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(themes):=20=E6=B7=BB=E5=8A=A0=20JsonbTypeH?= =?UTF-8?q?andler=20=E6=94=AF=E6=8C=81=20themeTag=20=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 PostgreSQL JSONB 类型处理器,使 themeTag 字段可直接映射到数据库 JSONB 列。 --- .../dataobject/themes/KeyboardThemesDO.java | 4 +- .../mybatis/core/type/JsonbTypeHandler.java | 56 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 yolo-framework/yolo-spring-boot-starter-mybatis/src/main/java/com/yolo/keyboard/framework/mybatis/core/type/JsonbTypeHandler.java diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/themes/KeyboardThemesDO.java b/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/themes/KeyboardThemesDO.java index c1be87a..2aa2ecb 100644 --- a/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/themes/KeyboardThemesDO.java +++ b/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/themes/KeyboardThemesDO.java @@ -7,6 +7,7 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.*; +import com.yolo.keyboard.framework.mybatis.core.type.JsonbTypeHandler; import com.yolo.keyboard.framework.mybatis.core.dataobject.BaseDO; /** @@ -14,7 +15,7 @@ import com.yolo.keyboard.framework.mybatis.core.dataobject.BaseDO; * * @author ziin */ -@TableName("keyboard_themes") +@TableName(value = "keyboard_themes", autoResultMap = true) @KeySequence("keyboard_themes_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @Data @ToString(callSuper = true) @@ -40,6 +41,7 @@ public class KeyboardThemesDO { /** * 主题标签 */ + @TableField(typeHandler = JsonbTypeHandler.class) private Object themeTag; /** * 主题下载次数 diff --git a/yolo-framework/yolo-spring-boot-starter-mybatis/src/main/java/com/yolo/keyboard/framework/mybatis/core/type/JsonbTypeHandler.java b/yolo-framework/yolo-spring-boot-starter-mybatis/src/main/java/com/yolo/keyboard/framework/mybatis/core/type/JsonbTypeHandler.java new file mode 100644 index 0000000..04f70c2 --- /dev/null +++ b/yolo-framework/yolo-spring-boot-starter-mybatis/src/main/java/com/yolo/keyboard/framework/mybatis/core/type/JsonbTypeHandler.java @@ -0,0 +1,56 @@ +package com.yolo.keyboard.framework.mybatis.core.type; + +import cn.hutool.json.JSONUtil; +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; + +/** + * PostgreSQL jsonb 类型处理器 + * + * @author ziin + */ +@MappedTypes(Object.class) +public class JsonbTypeHandler extends BaseTypeHandler { + + private static final String JSONB_TYPE = "jsonb"; + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { + PGobject pgObject = new PGobject(); + pgObject.setType(JSONB_TYPE); + pgObject.setValue(JSONUtil.toJsonStr(parameter)); + ps.setObject(i, pgObject); + } + + @Override + public Object getNullableResult(ResultSet rs, String columnName) throws SQLException { + String value = rs.getString(columnName); + return parseJson(value); + } + + @Override + public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + String value = rs.getString(columnIndex); + return parseJson(value); + } + + @Override + public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + String value = cs.getString(columnIndex); + return parseJson(value); + } + + private Object parseJson(String value) { + if (value == null || value.isEmpty()) { + return null; + } + return JSONUtil.parse(value); + } +}