标签归档

springboot+modelMapper+mybatis的枚举和JSON处理

一,依赖

<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"
                }
            },
   }
}