• MyBatis-Plus自定义TypeHandler转换Json


    原文链接:https://www.jianshu.com/p/57c01e1b3c63

    0x0 背景

    在项目开发中,我们有时会将一些属性作为json字符串保存到数据库,此时如何优雅的使用mybatis进行存储和查询就成为一个问题。
    mybatis提供了TypeHandler接口可供用户进行自定义属性转换逻辑,本文基于mybatis-plus,写一个demo便于大家参考。

    0x1 代码

    首先是我们的主角:JsonTypeHandler,该类作为父类使用(因为不知道具体的反序列化类是什么)

    public class JsonTypeHandler<T> extends BaseTypeHandler<T> {
    
        private static ObjectMapper objectMapper = new ObjectMapper();
        private Class<T> type;
    
        public JsonTypeHandler(Class<T> type) {
            if (type == null) {
                throw new NullPointerException("Type argument cannot be null");
            }
            this.type = type;
        }
    
        @Override
        public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
            ps.setString(i, toJsonString(parameter));
        }
    
        @Override
        public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
            return parse(rs.getString(columnName));
        }
    
    
        @Override
        public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
            return parse(rs.getString(columnIndex));
        }
    
        @Override
        public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
            return parse(cs.getString(columnIndex));
        }
    
    
    
        private String toJsonString(Object parameter) {
            try {
                return objectMapper.writeValueAsString(parameter);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    
        private T parse(String json) {
            try {
                return objectMapper.readValue(json, type);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    }
    

    然后我们针对具体的类,继承一个实际处理类,如下(我们的实体类名为User):

    public class UserTypeHandler extends JsonTypeHandler<User> {
        public UserTypeHandler() {
            super(User.class);
        }
    }
    

    接下来在我们的实体类中,对应的字段上加注解:

    @Data
    @Accessors(chain = true)
    //注意这里,要加autoResultMap = true
    @TableName(value = "tb_department", autoResultMap = true)
    public class DataSourceInfo {
    
        @TableId(type = IdType.AUTO)
        private Long id;
    
        private String type;
    
        //指定具体的处理器
        @TableField(typeHandler = UserTypeHandler.class)
        private User user;
    
        private LocalDateTime createTime;
    
        private LocalDateTime updateTime;
    }
  • 相关阅读:
    Spring MVC系列之Hello World(SpringBoot)(六)
    SpringBoot系列之注解@Autowired VS @Qualifier VS @Primary(五)
    SpringBoot系列之注解@Component VS @Bean(四)
    SpringBoot系列之@PropertySource和@Value注解(二)
    SpringBoot系列之入门篇(一)
    不要叫我,我会叫你(控制反转原理)
    EntityFramework Core 3多次Include导致查询性能低之解决方案
    EntityFramework Core 3.0查询
    Java入门系列之集合HashMap源码分析(十四)
    浅析性能测试策略及适用场景
  • 原文地址:https://www.cnblogs.com/fswhq/p/13691094.html
Copyright © 2020-2023  润新知