mybatis 自定义转换规则_MyBatis-Plus使用自定义TypeHandler转换Json教程

0x0 背景

在项目开发中,我们有时会将一些属性作为json字符串保存到数据库,此时如何优雅的使用mybatis进行存储和查询就成为一个问题。

mybatis提供了TypeHandler接口可供用户进行自定义属性转换逻辑,本文基于mybatis-plus,写一个demo便于大家参考。

0x1 代码

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

public class JsonTypeHandler extends BaseTypeHandler {

private static ObjectMapper objectMapper = new ObjectMapper();

private Class type;

public JsonTypeHandler(Class 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 {

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;

}


版权声明:本文为weixin_36217058原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。