Mybatis中使用Map接收了数据,如果需要做新增或修改时,如果不知道Map中的key的值,需要通过遍历Map的key来实现动态新增或修改。
1、新增时遍历map
/**
* 保存数据
*
* @param dbName 库名
* @param tableName 表名
* @param datas 待保存的数据
* @date 2022/6/10
* @since jdk11
*/
@Insert("<script><foreach collection=\"datas\" item=\"data\" separator=\";\" index=\"index\">" +
"INSERT INTO `${dbName}`.`${tableName}` " +
" <foreach collection=\"data.keys\" separator=\",\" item=\"key\" open=\"(\" close=\")\"> " +
" ${key} " +
" </foreach>" +
" VALUES " +
" <foreach collection=\"data.values\" separator=\",\" item=\"value\" open=\"(\" close=\")\"> " +
" #{value} " +
" </foreach>" +
"</foreach></script>")
void insert(@Param("dbName") String dbName, @Param("tableName") String tableName, @Param("datas") List<Map<String, Object>> datas);
如上,这里是一个批量新增操作,最外层的foreach遍历List集合,第二个foreach遍历了map的所有key,第三个foreach遍历了map的所有value.
2、修改时遍历map
/**
* 修改数据
*
* @param dbName 库名
* @param tableName 表名
* @param updateEntity 待修改的数据
* @date 2022/6/10
* @since jdk11
*/
@Insert("<script>" +
"UPDATE `${dbName}`.`${tableName}` " +
"<set>" +
" <foreach collection=\"updateEntity.data.keys\" separator=\",\" item=\"key\" open=\"\" close=\"\"> " +
" ${key} = #{updateEntity.data[${key}]} " +
" </foreach>" +
"</set>" +
"<where>" +
" <foreach collection=\"updateEntity.updateBy.keys\" separator=\" AND \" item=\"key\" open=\"\" close=\"\"> " +
" ${key} = #{updateEntity.updateBy[${key}]} " +
" </foreach>" +
"</where>" +
"</script>")
void update(@Param("dbName") String dbName, @Param("tableName") String tableName, @Param("updateEntity") UpdateEntity updateEntity);
如上,通过foreach遍历map的key,通过${key} = #{updateEntity.data[${key}]}
分别取得map对应的key和value。
注意的是无法在外层再套用foreach,因为#{updateEntity.data[${key}]}无法引用上层foreach的item,所以此种方式无法实现批量修改
UpdateEntity实体如下。
@Data
public class UpdateEntity {
/**
* 修改的数据
*/
private Map<String, Object> data = new LinkedHashMap<>();
/**
* 需要将值设置为空的数据
*/
private List<String> nullCols = new ArrayList<>();
/**
* 修改的依据列,比如 update test set c3 = 3 where c1 = 1 and c2 = 2 中的 c1和c2
*/
private Map<String, Object> updateBy = new LinkedHashMap<>();
public UpdateEntity combineDataAndNull() {
nullCols.forEach(col -> data.put(col, null));
return this;
}
}