赞
踩
在 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
提供了一个处理枚举的类型转换器,可以帮我们把枚举类型与数据库类型自动转换。
首先,我们为用户表中的这个状态字段定义一个枚举常量:
@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
在application.yml
文件中添加以下配置,以开启枚举处理器的功能:
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler # 枚举处理器
例如,根据id
查询某个用户:
此时,查询出的User
类的 status
字段会是枚举类型。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
@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
@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; }
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); } }
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)); } }
插入成功
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。