1.先建立并初始化序列表:
CREATE TABLE `wjj-pay`.`sequence_no` (
`sequence_id` bigint(19) unsigned NOT NULL AUTO_INCREMENT COMMENT '序列',
PRIMARY KEY (`sequence_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 COMMENT='序列生成表';
INSERT INTO `wjj-pay`.`sequence_no` (`sequence_id`) VALUES ('1');
2.配置bean
package com.wjj.application.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;
import org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer;
import javax.sql.DataSource;
/**
* @author hank
*/
@Configuration
public class MyBeanConfig{
@Autowired
private DataSource dataSource;
@Bean
public DataFieldMaxValueIncrementer orderNoIncrementer() {
MySQLMaxValueIncrementer incrementer = new MySQLMaxValueIncrementer(dataSource, "sequence_no", "sequence_id");
//incrementer.setCacheSize(1);
return incrementer;
}
}
3.编写公共方法
/**
* 生成对应的序列号 - hank
* @param sequence DataFieldMaxValueIncrementer对象
* @param left 最左边拼接的串
* @param size 总长度
* @param character 数据库生成随机数字时补充字符 补充在中间
**/
public static String generateUniqueNo(DataFieldMaxValueIncrementer sequence, String left, int size, String character){
long sequenceL = sequence.nextLongValue();
if(sequenceL < 0){
sequenceL = -sequenceL;
}
String nowSequence = String.valueOf(sequenceL);
int characterLen = size - (left.length() + nowSequence.length());
String uniqueNo = left;
if(characterLen > 0) {
// 少了填充
uniqueNo = StringUtils.rightPad(uniqueNo, characterLen+left.length(), character);
}else if(characterLen < 0){
// 多出来裁剪 取后后面的来填充
nowSequence = nowSequence.substring(-characterLen, nowSequence.length());
}
uniqueNo = uniqueNo + nowSequence;
return uniqueNo;
}
4.使用工具创建单号
@Autowired
private DataFieldMaxValueIncrementer sequence;
/**
* 创建单号
*
* @return 单号
*/
@Override
public String createPlatformTradeNo() {
// 规则:"A" + 日期(yyyyMMddHHmmss)+ 8位流水号
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
return CommonUtils.generateUniqueNo(sequence, "PTN"+sdf.format(new Date()), 25, "0");
}