mybatis的使用及源码分析(十六) Mybatis使用foreach遍历Map

20 篇文章 0 订阅

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;
    }

}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值