springboot+mybatis+mysql 存储单字段为数组格式的解决方案

您所在的位置:网站首页 mysql存字符串数组 springboot+mybatis+mysql 存储单字段为数组格式的解决方案

springboot+mybatis+mysql 存储单字段为数组格式的解决方案

2024-07-04 20:02| 来源: 网络整理| 查看: 265

1.使用场景

需求为:前端传的某个字段为数组类型,但mysql中不支持直接存储数组,只能转为字符串存储,取出时又得转回数组,这样无论是在前端转换还是后端转换都是费时费力的。

这样,我们可以利用mybatis的BaseTypeHandler类帮我们完成自动转换。

第一步:

将对象里的字段改为JSONArray类型。

第二步:继承BaseTypeHandler并重写里面的某些方法。

import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedJdbcTypes; import org.apache.ibatis.type.MappedTypes; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * @author wusong * * @description 用以mysql中varchar格式的字段,进行转换的自定义转换器,转换为实体类的JSONArray属性 */ @MappedTypes(JSONArray.class) @MappedJdbcTypes(JdbcType.VARCHAR) public class JsonTypeHandler extends BaseTypeHandler { /** * 重写设置参数 * @param ps * @param i * @param parameter * @param jdbcType * @throws SQLException */ @Override public void setNonNullParameter(PreparedStatement ps, int i, JSONArray parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, String.valueOf(parameter.toJSONString())); } /** * 根据列名,获取可以为空的结果 * @param rs * @param columnName * @return * @throws SQLException */ @Override public JSONArray getNullableResult(ResultSet rs, String columnName) throws SQLException { String sqlJson = rs.getString(columnName); if (null != sqlJson){ return JSONObject.parseArray(sqlJson); } return null; } /** * 根据列索引,获取可以为空的结果 * @param rs * @param columnIndex * @return * @throws SQLException */ @Override public JSONArray getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String sqlJson = rs.getString(columnIndex); if (null != sqlJson){ return JSONObject.parseArray(sqlJson); } return null; } @Override public JSONArray getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String sqlJson = cs.getString(columnIndex); if (null != sqlJson){ return JSONObject.parseArray(sqlJson); } return null; } }

第三步:mabatis的resultMap里面映射的字段需要加上typeHandler="刚刚重写的文件路径"

第四步:insert和update语句里面也需要加上typeHandler

 

这样,前端用数组传和接收,后端用字符串存储,互不干扰,又可以愉快的玩耍啦!!!

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3