最近做了一个用户收藏的分组功能,和QQ好友分组非常类似,在移动分组的时候,刚开始准备用fromOrder,groupId,toOrder,三个参数处理,我准备让他们移动一次分组,调用一次更新分组序号的接口,然后他们每调用一次,我们给toOrder之后的序号+1,但是由于没考虑到移动端移动一次之后第二次移动时用的是本地数据,所以导致我们后台数据已经修改了,但是移动端第二次移动时,数据还是之前的,经过讨论之后用了分组的批量更新,并且我们重新设计了接口,使用了groupIdList(当前用户的所有分组id,他们移动端拿到所有分组之后每次按移动后的顺序将IDList传给我们后端),然后利用了批量更新,将集合的下标存到数据库作为分组排序的序号.
移动批量更新的SQL语句,
以下是转载的批量插入和更新,
采用mybatis的批量插入方法
其实也是根据一个list 拼接成一个sql
示例xml
<insert id="batchInsertList">
insert into test_user(u_name,create_date)
values
<foreach item="item" index="index" collection="userList" separator=",">
(#{item.userName},SYSDATE())
</foreach>
</insert>
示例代码
List<User> userList = new ArrayList<User>();
for (int i = 1; i <= num; i++) {
User user = new User();
user.setUserName("a" + i);
user.setCreateDate(new Date());
userList.add(user);
}
userDao.batchInsertList(userList);
mybatis 批量更新
其实是利用了mysql的批量更新的语法
示例xml
<update id="batchUpdateList">
update test_user
<trim prefix="set" suffixOverrides=",">
<trim prefix="u_name =case" suffix="end,">
<foreach item="item" collection="userList">
when test_user.u_name = (#{item.userName})
then #{item.updateUserName}
</foreach>
</trim>
</trim>
where
<foreach item="item" collection="userList" separator="or">
(test_user.u_name = (#{item.userName}))
</foreach>
</update>
示例代码
for (int i = 1; i <= num; i++) {
User user = new User();
user.setUserName("a" + i);
user.setUpdateUserName("b" + i);
userList.add(user);
}
userDao.batchUpdateList(userList);
最后附上自己的批量更新
<update id="updateGroupOrderByGroupIds" parameterType="java.util.Map">
update sv_ship_group
<trim prefix="set" suffixOverrides=",">
<trim prefix="group_order =case" suffix="end,">
<foreach collection="groupIdList" item="item" index="index">
when id = #{item} then #{index}
</foreach>
</trim>
</trim>
where user_id = #{userId}
and id in
<foreach collection="groupIdList" item="item" index="index"
separator="," open="(" close=")">
#{item}
</foreach>
</update>
public RestResponse moveGroup(UcUserInfo curUser,@RequestBody Map<String,Object> params){
params.put("groupIdList",params.get("groupIdList"));
params.put("userId",curUser.getId());
boolean result = shipGroupService.updateGroupOrderByGroupIds(params);
if(!result){
return RestResponse.response(ResponseCode.NOTIFICATION.getCode(),"移动分组失败!");
}
return RestResponse.success();
}