网站会员功能介绍厦门网络营销推广
Mybatis以及Mybatis-Plus中实体类使用Map类型时如何处理
发现问题
以前在项目中存json数据, 一般都是前端把json类型转为string类型, 然后后端直接用一个string类型的字段来存取, 这次想直接用后端直接转化不再需要前端转为string, 一直保持字段为Map, 存到数据库位varchar或者text类型
这就需要持久层能在存入和查出的数据的时候, 自动转化其类型 !
解决问题
1. Mybatis-Plus解决方式
以如下代码为例, 解决持久层自动转化问题
@Data
@TableName(value = "service_config", autoResultMap = true)
public class ServiceConfig extends BaseEntity {@ApiModelProperty("服务名称")private String name;@ApiModelProperty("HTTP检测URL")private String url;@ApiModelProperty("HTTP请求方法")private HttpType method;@ApiModelProperty("HTTP请求体")private String requestBody;@ApiModelProperty("HTTP请求头")@TableField(value = "headers", typeHandler = JacksonTypeHandler.class)private Map<String, String> headers;}
-
首先
@TableName
注解需要加autoResultMap = true
参数autoResultMap = true 的主要作用是:自动生成并注册一个 ResultMap,用于处理带有类型处理器(如 JacksonTypeHandler)的字段。
- 具体功能解析
-
自动创建 ResultMap:
当设置为 true 时,MyBatis-Plus 会为这个实体类自动生成一个 ResultMap
这个 ResultMap 会包含所有字段的映射关系,特别是那些使用了 @TableField(typeHandler = xxx) 的字段 -
启用类型处理器:
对于使用 typeHandler 的字段(如你的 Map<String, Object> 字段)
自动生成的 ResultMap 会正确配置这些字段的类型处理器
确保查询时能正确进行类型转换 -
解决查询时类型处理器不生效的问题:
没有这个配置时,简单的查询可能不会应用类型处理器
特别是当使用 selectById() 等便捷方法时
-
-
在Map字段上添加
@TableField(value = "headers", typeHandler = JacksonTypeHandler.class)
说明该字段需要进行json转化, mybatis-plus使用的是Jackson吗这也是springboot默认的json转化工具
-
数据库使用
varchar
或者text
类型, 如使用varchar
类型, 设置的长度要大一点, 不然还可能出现空间太小导致报错
2. Mybatis解决方式
需要在mapper.xml文件中配置
在你的Map字段的result标签
加上如下配置
typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler
<resultMap id="your_table_name" type="YourEntity"><id property="id" column="id" jdbcType="BIGINT"/><result property="headers" column="headers" jdbcType="VARCHAR" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
</resultMap>
注意: 因为自动转换json功能, mybatis接mybatis-plus默认使用的是jackjson, 请务必保证项目中有jackjson的依赖
依赖坐标如下, 版本根据spring版本选择合适的版本:
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>