当前位置: 首页 > news >正文

建筑公司网站大全红网

建筑公司网站大全,红网,怎么在百度免费推广,在越南做网站需要什么【BUG 记录】MyBatis-Plus 处理枚举字段和JSON字段 一、枚举字段(mysql环境已测、postgresql环境已测)1.1 场景1.2 定义枚举常量1.3 配置枚举处理器1.4 测试 二、JSON字段(mysql环境已测)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 数据库中的字段类型设置为 jsonb
    • 3.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 字段会是枚举类型。
1703574125196.png

二、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;
}

注意:

  1. 添加 autoResultMap = true,开启自动映射
  2. 添加 @TableField(typeHandler = FastjsonTypeHandler.class),JSON处理器
  3. 字段类型修改为 JSONObject

2.3 测试


image.png

image.png

三、JSON 字段 (postgresql环境 已测)

3.1 postgresql 数据库中的字段类型设置为 jsonb


image.png

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*/@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 BaseTypeHandler<Object> {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 测试


  1. 测试 save

image.png 插入成功
image.png

  1. 测试 get

image.png

http://www.yayakq.cn/news/887210/

相关文章:

  • 山东省南水北调建设管理局网站东北大学秦皇岛吧
  • 当当网电子商务网站建设移动互联网网站建设
  • 做移动网站多少钱可商用的图片素材网站
  • 最佳建站模板旅游网站怎么制作
  • 官方网站页面尺寸电子商务网站推广怎么做
  • 高端网站建设个人苏州网站推广建设
  • 内蒙古建设安全监督站的网站网站建设要钱么
  • 网站用哪些系统做的企业网站的维护工作要怎么做
  • 西部数码网站管理助手 2008网站法人与负责人
  • wordpress建两个网站甘肃兰州
  • 网站制作进度表二合一收款码免费制作网站
  • 目前网站在初级建设阶段_需要大量数据丰富宁波做网站的专业公司
  • 建站是什么东西微信网站开发详解
  • 做网站的是怎么赚钱的核酸检测公司上市
  • 开化网站建设泰安建设企业网站
  • pc网站建设的三大条件如何做自己的网站
  • 营销型网站一个多少钱wordpress代码优化插件
  • 重庆市建设网站公司公司网站开通
  • 合肥企业网站建专门做灯具海报的网站
  • php用什么做网站服务器网页设计公司开设需要投资多少钱
  • 南昌企业建设网站开发台州企业网站搭建电话
  • 西安做网站哪家最便宜帝国网站7.2 pc wap 跳转
  • 网站模板如何编辑软件福州网站排名优化
  • 找网站公司做网站用了织梦可以吗wordpress上传字体
  • 常州市钟楼区建设局网站wordpress 页面缓存
  • 网站登录页面盗号怎么做公司网站能自己做吗
  • 2345网址导航手机杭州网站seo价格
  • 专门做活动的网站湛江网站建设招聘
  • 贵阳城乡和住房建设厅网站遵义网站建设公司
  • 做网贷中介网站赚钱吗厦门网站流量优化价格