写mybatisplus修改数组对象[{key:value}]为[{key:‘‘,value:‘‘}]的代码
时间: 2024-05-16 22:14:37 浏览: 163
MybatisPlus中插入数据后获取该对象主键值的实现
5星 · 资源好评率100%
假设你要修改的实体类为 `User`,其中有一个属性为 `info`,类型为 `List<Map<String, Object>>`,其中每个 Map 对象都有一个 key 为 `key`,value 为 `value`。
你可以通过自定义 Mybatis-Plus 的类型处理器来实现这个功能。具体实现步骤如下:
1. 定义一个 `MapTypeHandler` 类,继承自 `BaseTypeHandler<List<Map<String, Object>>>`,并实现该类的两个抽象方法。
```java
public class MapTypeHandler extends BaseTypeHandler<List<Map<String, Object>>> {
private static final ObjectMapper MAPPER = new ObjectMapper();
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<Map<String, Object>> parameter, JdbcType jdbcType) throws SQLException {
try {
// 将 List<Map<String, Object>> 转换为 JSON 字符串
String json = MAPPER.writeValueAsString(parameter);
// 设置 PreparedStatement 的参数
ps.setString(i, json);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
@Override
public List<Map<String, Object>> getNullableResult(ResultSet rs, String columnName) throws SQLException {
try {
// 从 ResultSet 中获取 JSON 字符串
String json = rs.getString(columnName);
// 将 JSON 字符串转换为 List<Map<String, Object>>
return MAPPER.readValue(json, new TypeReference<List<Map<String, Object>>>() {});
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public List<Map<String, Object>> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
try {
// 从 ResultSet 中获取 JSON 字符串
String json = rs.getString(columnIndex);
// 将 JSON 字符串转换为 List<Map<String, Object>>
return MAPPER.readValue(json, new TypeReference<List<Map<String, Object>>>() {});
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public List<Map<String, Object>> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
try {
// 从 CallableStatement 中获取 JSON 字符串
String json = cs.getString(columnIndex);
// 将 JSON 字符串转换为 List<Map<String, Object>>
return MAPPER.readValue(json, new TypeReference<List<Map<String, Object>>>() {});
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
```
2. 在 Mybatis 的配置文件中注册该类型处理器。
```xml
<typeHandlers>
<typeHandler handler="com.example.MapTypeHandler"/>
</typeHandlers>
```
3. 在实体类 `User` 中,为属性 `info` 添加 `@TableField` 注解,并指定 `typeHandler` 为刚才定义的 `MapTypeHandler`。
```java
public class User {
private Long id;
@TableField(typeHandler = MapTypeHandler.class)
private List<Map<String, Object>> info;
// 省略 getter 和 setter 方法
}
```
4. 使用 Mybatis-Plus 提供的 `UpdateWrapper` 类来更新实体类,将数组对象 `{key:value}` 修改为 `{key:'',value:''}`。
```java
List<Map<String, Object>> info = new ArrayList<>();
Map<String, Object> map = new HashMap<>();
map.put("key", "foo");
map.put("value", "bar");
info.add(map);
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("info", "JSON_REPLACE(JSON_REPLACE(info, '$[0].key', '$[0].key', '', '$[0].value', '$[0].value', ''))");
updateWrapper.eq("id", 1L);
userMapper.update(null, updateWrapper);
```
其中,`JSON_REPLACE` 函数用于替换 JSON 对象中指定 key 的值。下面是函数的语法:
```
JSON_REPLACE(json_object, path, val1, ..., valN)
```
- `json_object`:要替换的 JSON 对象;
- `path`:要替换的 key 的路径;
- `val1`、`val2`、...、`valN`:要替换的 key 的新值。
在上面的代码中,`JSON_REPLACE(JSON_REPLACE(info, '$[0].key', '$[0].key', '', '$[0].value', '$[0].value', ''))` 的作用是先将 `info` 中第一个元素的 `key` 和 `value` 所对应的值替换为原来的值,然后再将其替换为空字符串,最终实现了将数组对象 `{key:value}` 修改为 `{key:'',value:''}` 的目的。
阅读全文