欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java实现列表(一行数据)上移,下移操作

程序员文章站 2022-03-09 09:57:54
...

最近遇到这么一个功能需求,要求对列表中的(一行)数据可以进行上移、下移。

Java实现列表(一行数据)上移,下移操作
实现思路:

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 &lt; #{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 &gt; #{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>

这便是该功能的简单实现,我个人认识浅薄,有更好的方法还望各位大神指教。