Java实现列表(一行数据)上移,下移操作
程序员文章站
2022-03-09 09:57:54
...
最近遇到这么一个功能需求,要求对列表中的(一行)数据可以进行上移、下移。
实现思路:
1.在数据库中对要进行排序那张表新增一个node_num字段用于排序。
2.每当新增一条记录时,node_num的值都会在上一条的记录上进行+1。即每次新增记录时,先查出已存在的node_num值最大的那条记录,然后新增记录的node_num值为该记录的node_num的值+1。
3.列表向上移动的时候查询出当前数据的上一条数据的node_num值,两者交换node_num值,同理向下移动的时候,查询出下一条数据的node_num值,两者交换。
(上移:取上一条记录排序号,将当前记录与上一条记录排序号调换位置)
(下移:取下一条记录排序号,将当前记录与下一条记录排序号调换位置)
springboot+mybatis代码实现:
1. controller 层
/**
* 更新排序
* ProcessNodeController/move
*/
@GetMapping("move")
@Log(description = "【流程管理-流程节点列表】审批工作流节点上下移动")
public Result<?> move(String nodeSort, Long nodeId) {
try {
if ("down".equals(nodeSort)) {
processNodeService.moveDown(nodeId);
} else if ("up".equals(nodeSort)) {
processNodeService.moveUp(nodeId);
}
return ResultUtil.success();
} catch (Exception e) {
return ResultUtil.fail();
}
}
2. service
/**
* @param nodeId
* 审批工作流节点下移
*/
void moveDown(Long nodeId);
/**
* @param nodeId
* 审批工作流节点上移
*/
void moveUp(Long nodeId);
@Override
public void moveDown(Long nodeId) {
//获取要下移的那条数据的信息
ProcessNode processNode = processNodeMapper.selectByPrimaryKey(nodeId);
//查询下一条记录
ProcessNode processNodeNext = processNodeMapper.moveDown(processNode.getNodeNum());
//最下面的记录不能下移
if (processNodeNext == null) {
return;
}
//交换两条记录的nodeNum值
Integer temp = processNode.getNodeNum();
processNode.setNodeNum(processNodeNext.getNodeNum());
processNodeNext.setNodeNum(temp);
//更新到数据库
processNodeMapper.updateByPrimaryKeySelective(processNode);
processNodeMapper.updateByPrimaryKeySelective(processNodeNext);
}
@Override
public void moveUp(Long nodeId) {
//获取要上移的那条数据的信息
ProcessNode processNode = processNodeMapper.selectByPrimaryKey(nodeId);
//查询上一条记录
ProcessNode processNodePrev = processNodeMapper.moveUp(processNode.getNodeNum());
//最上面的记录不能上移
if (processNodePrev == null) {
return ;
}
//交换两条记录的sort值
Integer temp = processNode.getNodeNum();
processNode.setNodeNum(processNodePrev.getNodeNum());
processNodePrev.setNodeNum(temp);
//更新到数据库
processNodeMapper.updateByPrimaryKeySelective(processNode);
processNodeMapper.updateByPrimaryKeySelective(processNodePrev);
}
3. dao
/**
* 审批工作流节点下移
* @param nodeNum
*/
ProcessNode moveDown(Integer nodeNum);
/**
* 审批工作流节点上移
* @param nodeNum
*/
ProcessNode moveUp(Integer nodeNum);
4. mapper
<sql id="Base_Column_List" >
node_id,
node_name,
node_flag,
node_num
</sql>
<select id="moveUp" resultMap="ResultMapWithBLOBs" parameterType="java.lang.Integer">
select
<include refid="Base_Column_List"/>
from process_node n
WHERE n.node_num < #{nodeNum} order by n.node_num desc limit 0,1
</select>
<select id="moveDown" resultMap="ResultMapWithBLOBs" parameterType="java.lang.Integer">
select
<include refid="Base_Column_List"/>
from process_node n
WHERE n.node_num > #{nodeNum} order by n.node_num asc limit 0,1
</select>
<resultMap id="ResultMapWithBLOBs"
type="org.hw.project.entity.ProcessNode">
<id column="node_id" property="nodeId" jdbcType="BIGINT" />
<result column="node_name" jdbcType="VARCHAR"
property="nodeName" />
<result column="node_num" jdbcType="INTEGER"
property="nodeNum" />
</resultMap>
这便是该功能的简单实现,我个人认识浅薄,有更好的方法还望各位大神指教。