java DataFieldMaxValueIncrementer 生成序列号

 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");
    }

 

你可能感兴趣的:(spring,spring,boot,java,java,spring,boot)