素材网站无水印,做网页和做网站,北京做网站公司的排名,自己做公司网站【BUG 记录】MyBatis-Plus 处理枚举字段和JSON字段 一、枚举字段#xff08;mysql环境已测、postgresql环境已测#xff09;1.1 场景1.2 定义枚举常量1.3 配置枚举处理器1.4 测试 二、JSON字段#xff08;mysql环境已测#xff09;2.1 导包2.2 使用对象接受2.3 测试 三、JS… 【BUG 记录】MyBatis-Plus 处理枚举字段和JSON字段 一、枚举字段mysql环境已测、postgresql环境已测1.1 场景1.2 定义枚举常量1.3 配置枚举处理器1.4 测试 二、JSON字段mysql环境已测2.1 导包2.2 使用对象接受2.3 测试 三、JSON 字段 postgresql环境 已测3.1 postgresql 数据库中的字段类型设置为 jsonb3.2 创建实体类3.3 创建 jsonb 类型处理器3.3.1 方式一3.3.2 方式二 3.4 测试 一、枚举字段mysql环境已测、postgresql环境已测
1.1 场景 在 User 实体类中有一个枚举字段GenderEnum
Data
TableName(test_user)
public class UserEntity {TableId(value id, type IdType.AUTO)private Integer id;private String name;private Integer age;private GenderEnum gender;private String address;private String phone;
} 像这种字段我们一般会定义一个枚举做业务判断的时候就可以直接基于枚举做比较。但是我们数据库采用的是 int 类型对应的 PO 也是Integer。因此业务操作时必须手动把枚举与 Integer 转换非常麻烦。因此Mybatis Plus提供了一个处理枚举的类型转换器可以帮我们把枚举类型与数据库类型自动转换。
1.2 定义枚举常量 首先我们为用户表中的这个状态字段定义一个枚举常量
Getter
public enum GenderEnum{WOMAN(0,女),MAN(1, 男);EnumValueprivate final Integer code;JsonValueprivate final String desc;GenderEnum(Integer code,String desc){this.code code;this.desc desc;}
}要让 Mybatis Plus处理枚举与数据库类型自动转换我们必须告诉 Mybatis Plus枚举中的哪个字段的值作为数据库值。Mybatis Plus 提供了 EnumValue 注解来标记枚举属性 并且在GenderEnum枚举中通过JsonValue注解标记 JSON 序列化时展示的字段是 desc 1.3 配置枚举处理器 在application.yml 文件中添加以下配置以开启枚举处理器的功能
mybatis-plus:configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler # 枚举处理器1.4 测试 例如根据id查询某个用户 此时查询出的User类的 status 字段会是枚举类型。
二、JSON字段mysql环境已测
2.1 导包 dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.79/version
/dependency2.2 使用对象接受 Data
TableName(value test_user ,autoResultMap true)
public class UserEntity {TableId(value id, type IdType.AUTO)private Integer id;private String name;private Integer age;private GenderEnum gender;TableField(typeHandler FastjsonTypeHandler.class)private JSONObject address;private String phone;
}注意
添加 autoResultMap true开启自动映射添加 TableField(typeHandler FastjsonTypeHandler.class)JSON处理器字段类型修改为 JSONObject
2.3 测试 三、JSON 字段 postgresql环境 已测
3.1 postgresql 数据库中的字段类型设置为 jsonb 3.2 创建实体类 在实体类上加上 TableName(value 表名, autoResultMap true)在jsonb属性上加上 TableField(value 字段, typeHandler JsonbTypeHandler.class) JsonbTypeHandler 这个类在下面创建 Data
TableName(value test_user ,autoResultMap true)
public class UserEntity {TableId(value id, type IdType.AUTO)private Integer id;private String name;private Integer age;private GenderEnum gender;TableField(value address, typeHandler JsonbTypeHandler.class)private Object address;private String phone;
}
3.3 创建 jsonb 类型处理器
3.3.1 方式一 import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
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;
import java.util.Objects;MappedTypes({Object.class})
MappedJdbcTypes({JdbcType.VARCHAR})
public class JsonbTypeHandler extends AbstractJsonTypeHandlerObject {private static final PGobject jsonObject new PGobject();private final Class? type;public JsonbTypeHandler(Class? type) {this.type type;}/*** 重写设置参数* param ps* param i* param parameter* param jdbcType* throws SQLException*/Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {if (ps ! null) {jsonObject.setType(jsonb);jsonObject.setValue(JSON.toJSONString(parameter));ps.setObject(i, jsonObject);}}/*** 根据列名获取可以为空的结果* param rs* param columnName* return* throws SQLException*/Overridepublic Object getNullableResult(ResultSet rs, String columnName) throws SQLException {Object v rs.getObject(columnName);return toFill(v);}/*** 根据列索引获取可以为空的结果* param rs* param columnIndex* return* throws SQLException*/Overridepublic Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {Object v rs.getObject(columnIndex);return toFill(v);}Overridepublic Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {Object v cs.getObject(columnIndex);return toFill(v);}Overrideprotected Object parse(String json) {return JSON.parseObject(json, this.type);}/*** 必须将 v 转成 PGObject 处理* param v* return*/private Object toFill(Object v) {if (v ! null v instanceof PGobject) {PGobject p (PGobject) v;String pv p.getValue();if (Objects.nonNull(pv) (jsonb.equals(p.getType()) || json.equals(p.getType()))) {return parse(p.getValue());}}return v;}Overrideprotected String toJson(Object obj) {return JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty);}
}
3.3.2 方式二 package com.xawl.webenum.handler;import com.alibaba.fastjson.JSON;
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;MappedTypes({Object.class})
public class JsonbDataTypeHandler extends BaseTypeHandlerObject {private static final PGobject jsonObject new PGobject();Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException {if (preparedStatement ! null) {jsonObject.setType(jsonb);jsonObject.setValue(JSON.toJSONString(o));preparedStatement.setObject(i, jsonObject);}}Overridepublic Object getNullableResult(ResultSet resultSet, String s) throws SQLException {return JSON.parse(resultSet.getString(s));}Overridepublic Object getNullableResult(ResultSet resultSet, int i) throws SQLException {return JSON.parse(resultSet.getString(i));}Overridepublic Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {return JSON.parse(callableStatement.getString(i));}
}
3.4 测试 测试 save 插入成功
测试 get