mybatis批量更新

1,087 阅读3分钟

引言:更多相关请看 Java其它

JSON请求案例

[
		{"id":1,"sort":11},
		{"id":2,"sort":6},
		{"id":3,"sort":4},
		{"id":4,"sort":7},
		{"id":5,"sort":6},
		{"id":6,"sort":4},
		{"id":7,"sort":9}
]

Controller类

public Result updateBatch(@RequestBody List<CNoticeParam> list) {
        log.info("传入:{}", list);
        if (list == null || list.size() == 0) {
            return Result.error("必须传入值List");
        }
        for (CNoticeParam param : list) {
            if (param == null || param.getId() == null || param.getSort() == null) {
                return Result.error("公告id或排序值不能为空");
            }
            if (param.getSort() <= 0) {
                return Result.error("排序值不能<=0");
            }
        }
        boolean b = this.cNoticeService.updateBatch(list);
        if (!b) {
            return Result.error("增删改操作失败");
        }
        return Result.ok();
    }

service类

    /**
     * 批量更新
     *
     * @param list
     * @return
     */
    boolean updateBatch(List<CNoticeParam> list);

service实现类

    @Override
    public boolean updateBatch(List<CNoticeParam> list) {
        return this.cNoticeMapper.updateBatch(list);
    }

Mapper类

/**
     * 批量更新
     *
     * @param list
     * @return
     */
    boolean updateBatch(List<CNoticeParam> list);

mapper.xml

    <!-- 批量更新 -->
    <update id="updateBatch" parameterType="java.util.List">
        UPDATE c_notice
        SET sort = CASE id
        <foreach collection="list" item="item" index="index" open="" separator="" close="">
            WHEN #{item.id} THEN #{item.sort}
        </foreach>
        END
        WHERE
        id in
        <foreach collection="list" item="item" index="index" open="(" separator="," close=")">
            #{item.id}
        </foreach>
    </update>

Param类

/**
 * <p>
 * 公告信息表
 * </p>
 *
 * @author sire
 * @since 2020-04-27
 */
@Data
public class CNoticeParam extends BaseParam implements Serializable, BaseValidatingParam {

    private static final long serialVersionUID = 1L;

    /**
     * 公告id
     */
    private Integer id;

    /**
     * 中文标题,如果是普通公告此字段才有值
     */
    private String zhtitle;

    /**
     * 英文标题,如果是普通公告此字段才有值
     */
    private String entitle;

    /**
     * 印尼文标题,如果是普通公告此字段才有值
     */
    private String idtitle;

    /**
     * 中文公告URL
     */
    private String zhurl;

    /**
     * 英文公告URL
     */
    private String enurl;

    /**
     * 印尼文公告URL
     */
    private String idurl;

    /**
     * 是否为Banner,0不是banner,1是banner记录
     */
    private Integer isbanner;

    /**
     * 排序
     */
    private Integer sort;

    /**
     * 是否开启,0关闭,1开启
     */
    private Integer isstart;

    /**
     * 开启时间,必须大于开启时间才能展示
     */
    private Long starttime;

    /**
     * 备注
     */
    private String remark;

    /**
     * 更新者
     */
    private String updateby;

    /**
     * 更新时间
     */
    private Long updatetime;

    /**
     * 创建者
     */
    private String createby;

    /**
     * 创建时间
     */
    private Long createtime;

    @Override
    public String checkParam() {
        return null;
    }

}

数据库建表语句

CREATE TABLE `c_notice` (
  `ID` int(50) NOT NULL AUTO_INCREMENT COMMENT '公告id',
  `ZHTITLE` varchar(120) DEFAULT NULL COMMENT '中文标题',
  `ENTITLE` varchar(120) DEFAULT NULL COMMENT '英文标题',
  `IDTITLE` varchar(120) DEFAULT NULL COMMENT '印尼文标题',
  `ZHURL` varchar(600) DEFAULT NULL COMMENT '中文公告URL',
  `ENURL` varchar(600) DEFAULT NULL COMMENT '英文公告URL',
  `IDURL` varchar(600) DEFAULT NULL COMMENT '印尼文公告URL',
  `ISBANNER` tinyint(2) DEFAULT NULL COMMENT '是否为Banner,0不是banner,1是banner记录',
  `SORT` int(50) DEFAULT NULL COMMENT '排序',
  `ISSTART` tinyint(2) DEFAULT NULL COMMENT '是否开启,0关闭,1开启',
  `STARTTIME` bigint(20) DEFAULT NULL COMMENT '开启时间,必须大于开启时间才能展示',
  `REMARK` varchar(200) DEFAULT NULL COMMENT '备注',
  `UPDATEBY` varchar(20) DEFAULT NULL COMMENT '更新者',
  `UPDATETIME` bigint(20) NOT NULL COMMENT '更新时间',
  `CREATEBY` varchar(20) DEFAULT NULL COMMENT '创建者',
  `CREATETIME` bigint(20) NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='公告信息表';

运行控制台打印SQL语句日志

==>  Preparing: UPDATE c_notice SET sort = CASE id WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? END WHERE id in ( ? , ? , ? , ? , ? , ? , ? ) 
==> Parameters: 1(Integer), 1(Integer), 2(Integer), 6(Integer), 3(Integer), 4(Integer), 4(Integer), 7(Integer), 5(Integer), 6(Integer), 6(Integer), 4(Integer), 7(Integer), 9(Integer), 1(Integer), 2(Integer), 3(Integer), 4(Integer), 5(Integer), 6(Integer), 7(Integer)
<==    Updates: 7