前端传json对象,后端如何将json对象转为字符串入库,查询时将数据库中Json字符串转为对象回传前端。
数据库:
其中rest_date_ranges字段:
[{"month":"2021-02","weekdays":"1","custom":["1","2","3"]}]
register_source字段:
{"type":1,"quantity":1,"weekdays":2,"weekends":2,"customData":[{"date":"2021-11-17","count":"4"}]}
后端实体类对象:
其中JacksonTypeHandler是MybatisPlus包下自带的处理类,而IntegerListToCharTypeHandler是自己实现的,将用List对象接收前端传的字段,入库时转换为字符串,如前端[1,2,3,4] 那么入库后就是1,2,3,4
同理JacksonTypeHandler作用类似
IntegerListToCharTypeHandler
@MappedTypes({List.class})
@MappedJdbcTypes({JdbcType.CHAR})
public class IntegerListToCharTypeHandler implements TypeHandler<List<Integer>> {
private List<Integer> stringToList(String str) {
if (StringUtil.isEmpty(str)) {
return new ArrayList<>();
}
return Arrays.stream(str.split(",")).filter(NumberUtils::canParseInt).map(Integer::parseInt).collect(Collectors.toList());
}
@Override
public void setParameter(PreparedStatement ps, int i, List<Integer> parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, Joiner.on(",").join(parameter));
}
@Override
public List<Integer> getResult(ResultSet rs, String columnName) throws SQLException {
return stringToList(rs.getString(columnName));
}
@Override
public List<Integer> getResult(ResultSet rs, int columnIndex) throws SQLException {
return stringToList(rs.getString(columnIndex));
}
@Override
public List<Integer> getResult(CallableStatement cs, int columnIndex) throws SQLException {
return stringToList(cs.getString(columnIndex));
}
}
mappr文件中
<result property="restDateRanges" column="rest_date_ranges" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
<result property="restWeekdays" column="rest_weekdays" typeHandler="com.guokang.ms.common.typehandler.IntegerListToCharTypeHandler"/>
<result property="registerSource" column="register_source" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
想要Json字符串入库后,下次查询返回时还是Json对象,需要在实体类中加一个注解参数:autoResultMap = true