要求:项目中遇到前端页面读取完数据后,需要对排序进行上下移动
思路:让前端传入两个参数,一个是状态,0前进,1后退,再把当前的sort值发送到后台,后台根据当前的状态值,判断前进还是后退;根据传入的sort去查找当前这条记录,对sort进行+1或者-1的更新操作,再把数据通过 ORDER BY 函数进行排序发送给前端页面
实现:
据传入的sort去查找当前这条记录,对sort进行+1或者-1操作的Mybatis XML写法
这是上移更新操作:通过子查询的方法,通过sort_order字段找到当前数据,对数据的sort_order进行-1操作
<update id="sortUp" parameterType="java.util.HashMap">
UPDATE md_drainage_basin
SET sort_order = CASE sort_order
WHEN #{sortOrder} THEN
sort_order - 1
ELSE
sort_order + 1
END
WHERE
sort_order IN (
SELECT * FROM (
SELECT sort_order FROM md_drainage_basin t1 WHERE t1.sort_order = (
SELECT sort_order FROM md_drainage_basin
WHERE sort_order = #{sortOrder}
) - 1 OR t1.sort_order = #{sortOrder}
) ids
)
</update>
这是下移操作:
通过子查询的方法,通过sort_order字段找到当前数据,对数据的sort_order进行+1操作
<update id="sortDown" parameterType="java.util.HashMap">
UPDATE md_drainage_basin
SET sort_order = CASE sort_order
WHEN #{sortOrder} THEN
sort_order + 1
ELSE
sort_order - 1
END
WHERE sort_order IN (
SELECT * FROM (
SELECT sort_order FROM md_drainage_basin t1
WHERE t1.sort_order = (
SELECT sort_order FROM md_drainage_basin
WHERE sort_order = #{sortOrder} ) + 1
OR t1.sort_order = #{sortOrder}
) ids
)
</update>
而后将两个方法写入对应的Mapper接口中,再业务逻辑处理层进行操作,判断前端传入的状态码
public Result sortOrder(Integer page, Integer size, @RequestParam Integer sortOrder,@RequestParam Integer status) {
HashMap<String,Object> map = new HashMap<>();
map.put("sortOrder",sortOrder);
switch (status){
case 0:
if (sortOrder != 1){
mdWaterSystemMapper.sortUp(map);
}
break;
case 1:
List<MdWaterSystem> listSize = mdWaterSystemMapper.findBy();
if (sortOrder <= listSize.size()){
mdWaterSystemMapper.sortDown(map);
}
break;
}
PageHelper.startPage(page, size);
List<MdWaterSystem> list = mdWaterSystemMapper.findBy();
PageInfo pageInfo = new PageInfo(list);
return ResponseMsgUtil.success(pageInfo);
}
两个
case中都加了if判断,用意是:上移时,若序号等于1,是头一位了就不进行上移操作;下移时,查询出所有的条目数字,若到达最大值最后一个了,到底了就不进行下移操作,做完判断后,将进行排序过的ORDER BY查询所有的进行返回给前端
这里有一点要注意:看需求返回,若需要移动完直接返回所有的话,用以上这种方法
List<MdWaterSystem> list = mdWaterSystemMapper.findBy();
若条件查询后展示数据还是条件查询后的语句,则需要换一种思路:
分出两种查询结果,一种是返回所有,一种是返回条件查询结果,根据判断是否被查询过而来选择哪一种结果返回
同样的方法,不同的返回结果,所以要再设定一个接口方法,把sortOrder方法放进去,返回两种结果