mp也就是mybatis-plus,是一款java操作持久层的框架,也是mybatis的增强版。mp对于操作mysql中json类型的字段也有处理方式。
只需要以下两步即可:
- 在MySQL表中创建一个json类型的字段,通过mp的代码生成器生成对应的实体类:
实体类属性上的注解是swagger2的,在这里没有什么太大意义,可忽略。很明显可以看出代码生成器生成后,json类型的字段,映射成了String类型的属性。
2.给实体类加上注解:
value是这个表的表名,重要的在于设置后面的autoResultMap = true
注意,对于该mp的注解@TableName
,在较低版本是没有autoResultMap
属性的,(至少我之前用的3.0.5版本没有)所以我在此处引用了目前最新的mp3.4.3.1版本,mp的高版本之后是把代码生成器这一模块分开了的,还有扩展模块也是分开了的。所以在pom.xml引入依赖应该是如下:
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.1</version>
</dependency>
<!--mp高版本将generator extension 模块分别引入-->
<!--mybatis-generator-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
<!--mybatis-extension-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.4.3.1</version>
</dependency>
<!--mybatis-plus 模板引擎-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
需要使用generator模块建议不要引入版本太低或者太高,因为会出现一些兼容和属性,方法的问题:
比如在最新版本的mp中id注解策略就有所改变,低版本的是Id.Type.ID_WORKER_STR
而现在的是IdType.ASSIGN_ID
,两个都是表示使用雪花算法来做主键id。
对于分页插件与逻辑删除插件(v3.4.3.1):
package com.sixteen.im.common.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan(basePackages = "com.sixteen.im.mapper")
public class Config {
@Bean//最新版分页插件,最新版mp自带逻辑删除插件
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//根据数据库类型填写
return interceptor;
}
}
这个新版的分页插件就在mybatis-plus-extension
依赖中,为什么说新版的自带逻辑删除插件呢?可以看以下一段源码:
所以无需在配置类中添加逻辑删除插件。而且官方还提供了一次性设置需要逻辑删除的属性:
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
步骤2就是在实体类逻辑删除属性加@TableLogic
注解,对于一些其他的东西官方文档也有,这边就不多说了。
言归正传,给实体类加上@TableName(value = "im_member",autoResultMap = true)
后,在json字段映射出来的属性做一些处理:
@ApiModelProperty(value = "扩展信息")
@TableField(typeHandler = FastjsonTypeHandler.class)
private Map<String,Object> exInfo;
注意,typeHandler,FastjsonTypeHandler.class
都是新版mp才有的,低版本实在要用的话可以使用el表达式吧,此处就不做介绍了。
以上,就可以解决json字段在返回数据出去是不是String的类型,而是转换好的Json对象。新版mp对我的感受就是变化很大,不过还好现在能使用了,建议不要一直使用一个版本的东西进行开发(此处指的是我自己开发捣鼓)。ps:当然这样完成json字段的解析,好像用处也不是很大