【BUG 记录】MyBatis-Plus 处理枚举字段和 JSON 字段
json
适用于现代 C++ 的 JSON。
项目地址:https://gitcode.com/gh_mirrors/js/json
免费下载资源
·
【BUG 记录】MyBatis-Plus 处理枚举字段和JSON字段
一、枚举字段(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, "男");
@EnumValue
private final Integer code;
@JsonValue
private 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 导包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
2.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 AbstractJsonTypeHandler<Object> {
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
*/
@Override
public 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
*/
@Override
public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
Object v = rs.getObject(columnName);
return toFill(v);
}
/**
* 根据列索引,获取可以为空的结果
* @param rs
* @param columnIndex
* @return
* @throws SQLException
*/
@Override
public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
Object v = rs.getObject(columnIndex);
return toFill(v);
}
@Override
public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
Object v = cs.getObject(columnIndex);
return toFill(v);
}
@Override
protected 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;
}
@Override
protected 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 BaseTypeHandler<Object> {
private static final PGobject jsonObject = new PGobject();
@Override
public 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);
}
}
@Override
public Object getNullableResult(ResultSet resultSet, String s) throws SQLException {
return JSON.parse(resultSet.getString(s));
}
@Override
public Object getNullableResult(ResultSet resultSet, int i) throws SQLException {
return JSON.parse(resultSet.getString(i));
}
@Override
public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return JSON.parse(callableStatement.getString(i));
}
}
3.4 测试
- 测试 save
插入成功
- 测试 get
GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e
4 个月前
8c391e04
7 个月前
更多推荐
已为社区贡献3条内容
所有评论(0)