美文网首页
MyBatis中调用Mysql存储过程实现序列码自增

MyBatis中调用Mysql存储过程实现序列码自增

作者: sdevil507 | 来源:发表于2021-06-08 21:11 被阅读0次

背景

项目中使用mysql作为数据库,针对项目中各种需要自增返回序列码值的场景(批次ID数据、自定义规则的序列码ID等)需要提供一个序列码池表进行维护。

实际使用中我们使用mysql的存储过程进行实现,同时示例如何使用mybatis进行调用。

通用序列码池表(common_sequence)

-- ----------------------------
-- Table structure for common_sequence
-- ----------------------------
DROP TABLE IF EXISTS `common_sequence`;
CREATE TABLE `common_sequence` (
  `keyname` varchar(20) NOT NULL COMMENT '序列key',
  `value` bigint(20) NOT NULL DEFAULT '0' COMMENT '序列value',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`keyname`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='通用序列码池表';

示例


1.png

存储过程(nextSeqNo)

-- -------------------------------------------------------------------
-- seqName  入参  对应序列码表中keyname  查询key
-- seqNo    出参  对应序列码表中value    返回value
-- -------------------------------------------------------------------
CREATE DEFINER = CURRENT_USER PROCEDURE `nextSeqNo`(IN seqName varchar(255), OUT seqNo bigint(20))
BEGIN
    UPDATE COMMON_SEQUENCE t, (SELECT @current_val := `value`FROM COMMON_SEQUENCE t2 WHERE t2.keyname =
    seqName)
    t3
    SET t.value = t.value + 1
    WHERE t.keyname = seqName AND @current_val = t.value;
    SELECT @current_val + 1 INTO seqNo;
END

封装存储过程中入参与出参的Java实体类

import lombok.Data;

/**
 * 获取序列参数对象
 *
 * @author sdevil507
 * created on 2021/4/6
 */
@Data
public class CommonSequenceParams {

    /**
     * [IN]序列码的key
     */
    private String seqName;

    /**
     * [OUT]序列码的值
     */
    private long seqNo;

}

mybatis dao示例

import org.apache.ibatis.annotations.Mapper;

/**
 * 序列码池Dao
 *
 * @author sdevil507
 * created on 2021/4/6
 */
@Mapper
public interface CommonSequenceDao {

    /**
     * 获取下一序列值
     *
     * @param params 入参([IN:string]key=seqName,[OUT:long]key=seqNo)
     */
    void getNextNo(CommonSequenceParams params);
}

mybatis xml中调用存储过程

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

<mapper namespace="com.yama.eraims.equities.helper.seq.CommonSequenceDao">

    <!--suppress SqlNoDataSourceInspection -->
    <!--注意此处 parameterType 参数是一个封装入参与出参的类 -->
    <select id="getNextNo" parameterType="com.xxx.xxx.CommonSequenceParams"
            statementType="CALLABLE">
        CALL nextSeqNo(#{seqName,mode=IN},#{seqNo,mode=OUT,jdbcType=BIGINT})
    </select>

</mapper>

方法中具体调用示例

   /**
     * 生成卡批次ID序列号
     * <p>
     * 规则:[pc+5位数字(00001开始,顺序递增)]
     *
     * @return 卡批次ID
     */
    public String generatePcId() {
        // 创建封装入参出参实体类实例
        CommonSequenceParams params = new CommonSequenceParams();
        // 设置查询key值
        params.setSeqName("pc");
        // 执行存储过程key对应value值+1
        commonSequenceDao.getNextNo(params);
        // 执行获取返回的序列码值
        return "pc" + String.format("%05d", params.getSeqNo());
    }

相关文章

网友评论

      本文标题:MyBatis中调用Mysql存储过程实现序列码自增

      本文链接:https://www.haomeiwen.com/subject/nqwjeltx.html