springboot&mybatis中数组和字符串数据类型的转换

需求

前端(VUE)页面上有一个可多选的select控件,前端以数组形式存储被选中的数据,但是数据库中不想新建表来存储,希望在主表中用以逗号为分隔符的字符串来存。

于是在存储和读取数据的时候就涉及到数据类型转换的问题:

  1. 存储时前端的数组需要转换成以逗号分隔的字符串给数据库;
  2. 读取时从数据库中读取的字符串数据需要转成数组给前端

针对1,可以在前端调用存储接口之前,就先转换成字符串,再作为参数传给存储接口;

针对2,可以在后端从数据库中读出来之后,转换成字符串,再返回给前端。

但是这样做的弊端,主要是1,前端每次调用后端接口的时候,都需要自行拼接一下字符串作为参数,我觉得不太方便,也不便于后期维护。

关于数据类型转换的思考:

  1. 前端的所有数据,其实都是字符串,大多数时候使用json格式传送。但是传给后台接口的时候,我们是在controller中用一个java对象来接收的;
是的,存储JSON数组可以使用Mybatis-Plus提供的类型处理器(TypeHandler)来实现。下面是具体的步骤: 1. 首先在你的实体类中定义一个字段来存储JSON数组,如下所示: ``` public class MyEntity { // 其他字段... private JSONArray jsonArray; // 其他方法... } ``` 2. 接下来我们需要自定义一个类型处理器来将JSONArray类型的数据转换字符串类型进行存储。在Mybatis-Plus中,我们可以通过实现BaseTypeHandler<T>接口来自定义类型处理器。具体实现代码如下: ``` public class JSONArrayTypeHandler extends BaseTypeHandler<JSONArray> { @Override public void setNonNullParameter(PreparedStatement ps, int i, JSONArray parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, parameter.toJSONString()); } @Override public JSONArray getNullableResult(ResultSet rs, String columnName) throws SQLException { String str = rs.getString(columnName); if (rs.wasNull() || StringUtils.isBlank(str)) { return null; } return JSONArray.parseArray(str); } @Override public JSONArray getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String str = rs.getString(columnIndex); if (rs.wasNull() || StringUtils.isBlank(str)) { return null; } return JSONArray.parseArray(str); } @Override public JSONArray getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String str = cs.getString(columnIndex); if (cs.wasNull() || StringUtils.isBlank(str)) { return null; } return JSONArray.parseArray(str); } } ``` 3. 在使用Mybatis-Plus时,我们需要在Mapper中为JSONArray类型的字段指定上面自定义的类型处理器。如下所示: ``` public interface MyEntityMapper extends BaseMapper<MyEntity> { @Insert("INSERT INTO my_table(json_array_col) VALUES(#{jsonArray, typeHandler=com.example.JSONArrayTypeHandler})") void insert(MyEntity entity); } ``` 4. 最后,在使用Mybatis-Plus时,我们可以直接将JSONArray类型的数据设置到实体类中的对应字段中,Mybatis-Plus会自动将其转换字符串类型进行存储。如下所示: ``` MyEntity entity = new MyEntity(); entity.setJsonArray(JSONArray.parseArray("[{\"name\":\"张三\", \"age\":18}, {\"name\":\"李四\", \"age\":20}]")); myEntityMapper.insert(entity); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值