一,依赖
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.48</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>3.2.0</version>
二,枚举使用
(1)定义枚举
public enum StoreTypeEnum {
OSS(0,"阿里OSS服务"),
S3(1,"亚马逊S3服务");
StoreTypeEnum( int code, String des ){
this.code = code;
this.des = des;
}
@EnumValue
private final int code;
private final String des; //有jsonvalue注释,转换值为des,否则为枚举名
}
(2)接收参数中使用和验证枚举
@Data
public class StoreConfigParam {
@NotEmpty(message = "键名不能为空")
private String storeKey;
@NotEmpty(message = "描述不能为空")
private String des;
@NotNull(message = "配置的类型不能为空")
private StoreTypeEnum storeType;
private JSONObject storeMeta;
}
(3)数据库实体类中定义枚举
@TableName(autoResultMap = true)
@Data
public class StoreConfig {
@TableId
private String storeKey;
private String des;
private StoreTypeEnum storeType;
@TableField( typeHandler = Fastjson2TypeHandler.class)
private JSONObject storeMeta;
}
(4)使用枚举
public class StoreConfigHttp {
@Autowired
private StoreConfigMapper storeConfigMapper;
@Autowired
private ModelMapper modelMapper;
@PostMapping("/store-config/add")
public ResultRes add(@Validated @RequestBody StoreConfigParam param){
StoreConfig storeConfig = modelMapper.map( param, StoreConfig.class );
storeConfigMapper.insert( storeConfig );
return ResultRes.success();
}
@PostMapping("/store-config/update")
public ResultRes update(@Validated @RequestBody StoreConfigParam param){
StoreConfig storeConfig = modelMapper.map( param, StoreConfig.class );
storeConfig.setStoreType(StoreTypeEnum.S3); //这里故意多写一行演示设置枚举值,实际上 modelMapper可以自动帮我买转换
storeConfigMapper.updateById( storeConfig);
return ResultRes.success();
}
}
使用modelMapper讲param转换成endity时,会自动转换枚举值,非常方便。查询时,也会将数据库中存的code(整型)自动转为枚举名(字符串类型)。避免接收或返回给前端无意义的状态数字
三,JSON使用
(1)关于Mysql的JSON字段说明
https://www.cnblogs.com/ivictor/p/16221712.html
(2)使用modelMapper自动转换模型
modelMapper不能默认自动转换json高级类型,但它提供自定义converter方法。我们只需要在配置中加入以下代码。这里有2种方法,JSONObject转string,存数据库也行,JSONObject转JSONObject也行(听起来很奇怪,但即使完全相同的类型,modelMapper确实不能识别),Mybatis可以完成JSONObject的存储
@Configuration
public class ModelMapperConfig {
@Bean
public ModelMapper modelMapper(){
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setFullTypeMatchingRequired(true);
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
//从JSONObject类型转为 entidy 的JSONObject类型
Converter< JSONObject, JSONObject > converter = new Converter<JSONObject, JSONObject>() {
@Override
public JSONObject convert(MappingContext<JSONObject, JSONObject> mappingContext) {
return mappingContext.getSource();
}
};
modelMapper.addConverter(converter);
return modelMapper;
}
}
(3)mybatis的自适应
entidy模型,必须开启注释@TableName(autoResultMap = true),并在json字段注释@tableField,指定使用typeHandler为json。mybatis默认提供了fastjson\fastjson2\jackson等的typehandler,也可以利用typehandler机制自己实现
@TableName(autoResultMap = true) //必须加这个选项
@Data
public class StoreConfig {
@TableId
private String storeKey;
private String des;
private StoreTypeEnum storeType;
@TableField( typeHandler = Fastjson2TypeHandler.class) //mybatis 自带的TypeHandler可以处理json
private JSONObject storeMeta;
}
完毕后,即可以使用JSONObject插入、更新字段,查询出内容后也会自动转换成JSON格式输出
{
"code": 0,
"message": null,
"data": {
"records": [
{
"storeKey": "tes2",
"des": "这是一个测试配置da",
"storeType": "S3",
"storeMeta": {
"key": "wawa444"
}
},
}
}