一,依赖
<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" } }, } }