背景
项目中使用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());
}
网友评论