基于Oracle Sequence的流水号生成规则

流水号在各种系统中随处可见,一般都是使用自增、年月日时分秒+自增、UUID等,要么纯数字,要么纯字母,这种流水号缺乏一定的辨识度。

下面为大家介绍一种具有辨识度的流水号的生成方式:领域或者应用的标识 + 表名的英文缩写(单词的第一个字母) + 年月日(或者年月日时分秒) + Oracle Sequence自增。

代码示例:

package com.pab.bloan.order.service;

/**
 * Created by
 */
public interface SequenceGeneratorService {
    /**
     * 根据SequenceName获取流水号
     * @param prefix
     * @param seqName
     * @return
     */
    String getSerialNo(String prefix, String seqName);

    /**
     * 根据指定的流水号的前缀、长度、SequenceName获取流水号
     * @param prefix
     * @param idLength
     * @param seqName
     * @return
     */
    String getSerialNo(String prefix, Integer idLength, String seqName);
}
package com.pab.bloan.order.service.impl;

import java.util.Date;
import lombok.extern.slf4j.Slf4j;
import com.pab.bloan.order.utils.DateUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import com.pab.bloan.order.dao.bloanb.SequencePojoMapper;
import com.pab.bloan.order.service.SequenceGeneratorService;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * 获取流水号服务
 * Created by
 */
@Slf4j
@Service
public class SequenceGeneratorServiceImpl implements SequenceGeneratorService {
    @Autowired
    private SequencePojoMapper sequencePojoMapper;

    /**
     * {@inheritDoc}
     * @param seqName
     * @return
     */
    @Override
    public String getSerialNo(String prefix, String seqName) {
        return getSerialNo(prefix, 0, seqName);
    }

    /**
     * {@inheritDoc}
     * @param prefix
     * @param idLength
     * @param seqName
     * @return
     */
    @Override
    public String getSerialNo(String prefix, Integer idLength, String seqName) {
        try {
            if (StringUtils.isEmpty(seqName)) {
                return "";
            }
            if (idLength < 8){
                idLength = 8;
            } else if (idLength > 12){
                idLength = 12;
            }

            String dateString = DateUtils.formatDate(new Date(),"yyyy/MM/dd");
            dateString = dateString.replace("/", "");

            StringBuilder sequenceSqlBuilder = new StringBuilder();
            sequenceSqlBuilder.append(" select ");
            sequenceSqlBuilder.append(seqName + ".NEXTVAL");
            sequenceSqlBuilder.append(" FROM DUAL ");

            Long sequenceId = sequencePojoMapper.getSequenceBySequenceName(sequenceSqlBuilder.toString());
            String seqIdString = String.format("%0" + idLength + "d", sequenceId);

            String serialNo;
            if (seqIdString.length() > idLength) {
                serialNo = String.format("%s%s%s", prefix, dateString, seqIdString.substring(seqIdString.length() - idLength, seqIdString.length()));
            } else {
                serialNo = String.format("%s%s%s", prefix, dateString, seqIdString);
            }
            return serialNo;
        } catch (Exception e) {
            log.error("SequenceGeneratorService.getSerialNo", e);
        }
        return "";
    }
}

Mybatis Mapper.xml文件(不能使用缓存,因为在打开缓存的情况下,连续获取Sequence,会得到重复的值)

<?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.pab.bloan.order.dao.bloanb.SequencePojoMapper">

    <select id="getSequenceBySequenceName" resultType="java.lang.Long"
            useCache="false" flushCache="true">
        ${sql}
    </select>
</mapper>

让自己业务中流水号具有辨识度,在关联查询时,一眼便可以看出数据源自何处。

原文地址:https://www.cnblogs.com/dushenzi/p/10669818.html

时间: 2024-10-12 07:21:55

基于Oracle Sequence的流水号生成规则的相关文章

基于oracle SQL Developer Data Modeler建模工具,解析xml,生成etljet代码

今天准备在 @zhangkai05 写的小工具model_sql基础上,进一步完善功能,使其更加自动化.方便建模人员开发etl任务. 源代码更改后 ,会发布到 git(url地址)上,逐步完善. 描述现状及问题 团队 数据仓库建模在2013年下开始使用 oracle sql developser datamodeler建模工具,之前一直用 powerdesigner,但由于后者是商业收费软件,公司又不打算购买.故经过调研,转向oracle建模工具.虽然其 易用性与 power designer

ORACLE Sequence 自增长

Sequence是数据库系统按照一定规则自动增加的数字序列.这个序列一般作为代理主键(因为不会重复),没有其他任何意义. Sequence是数据库系统的特性,有的数据库有Sequence,有的没有.比如Oracle.DB2.PostgreSQL数据库有Sequence,MySQL.SQL Server.Sybase等数据库没有Sequence. 根据我个人理解,Sequence是数据中一个特殊存放等差数列的表,该表受数据库系统控制,任何时候数据库系统都可以根据当前记录数大小加上步长来获取到该表下

Oracle Sequence创建与使用

一.Sequence简介 Sequence是数据库系统按照一定的规则自动增加的数字序列,主要用于生成数据库数据记录.这个序列一般作为代理主键(因为不会重复). Sequence是数据中一个特殊存放等差数列的表,该表受数据库系统控制,任何时候数据库系统都可以根据当前记录数大小加上步长来获取到该表下一条记录应该是多少,这个表没有实际意义,常常用来做主键用.Sequence是数据库系统的特性,有的数据库有Sequence,有的没有.比如Oracle.DB2.PostgreSQL数据库有Sequence

转://从一条巨慢SQL看基于Oracle的SQL优化

http://mp.weixin.qq.com/s/DkIPwbDKIjH2FMN13GkT4w 本次分享的内容是基于Oracle的SQL优化,以一条巨慢的SQL为例,从快速解读SQL执行计划.如何从执行计划中找到SQL执行慢的Root Cause.统计信息与cardinality问题.探索性能杀手Filter操作.如何进行逻辑重写让SQL起飞等多个维度进行解析,最终优化巨慢SQL语句,希望能够抛砖引玉,和大家一起探讨SQL优化方法. 另外,还简单介绍了两种解决疑难SQL优化问题的工具:1005

订单号生成规则

前阵子,公司有个电子商务项目,需要生成订单号.当时的考虑很简单,取系统时间加上随机数,或者使用 uniqid() 方法.我们都知道,订单号最基本的要求就是唯一,这个条件必须满足.仔细考虑下上述方法,在顾客购买量少的情况下,订单重复的可能性为零,但是在购买高蜂期生成的订单号重复是很有可能发生的.所以上述方法不可靠,有待强化.在网上找了一番,发现这位同学的想法挺不错的,redtamo,具体的请稳步过去看看,我作简要概述,该方法用上了英文字母.年月日.Unix 时间戳和微秒数.随机数,重复的可能性大大

LoadRunner之Paramater在负载测试中的数据生成规则

LoadRunner之Paramater在负载测试中的数据生成规则 前段时间在做性能测试的时候,基于业务的需求,使用到了Unique Number的参数类型. 脚本的业务是注册以alien开头,后面接数字的用户帐号,填写相关帐号信息.提交企业信息进行审核. 其中用户帐号是alien开头拼接一个唯一数字的参数,如图: 下面对Unique Number进行相关解释,先引用官方资料:(相信大家也理解这段话的意思) Unique Number: Assigns a range of numbers to

Oracle SEQUENCE 详细说明

ORACLE  SEQUENCE ORACLE没有自增数据类型,如需生成业务无关的主键列或惟一约束列,可以用sequence序列实现. CREATE SEQUENCE语句及参数介绍: 创建序列:需要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限, CREATE SEQUENCE [ schema. ]sequence [ { INCREMENT BY | START WITH } integer | { MAXVALUE integer | NOMAXVALUE

ORACLE SEQUENCE 详解

1.    About Sequences(关于序列) 序列是数据库对象一种.多个用户可以通过序列生成连续的数字以此来实现主键字段的自动.唯一增长,并且一个序列可为多列.多表同时使用. 序列消除了串行化并且提高了应用程序一致性.(想象一下没有序列的日子怎么办?) 2.   Creating Sequences(创建序列) 前提:Prerequisites To create a sequence inyour own schema, you must have the CREATE SEQUEN

Oracle SEQUENCE 具体说明

ORACLE  SEQUENCE ORACLE没有自增数据类型,如需生成业务无关的主键列或惟一约束列,能够用sequence序列实现. CREATE SEQUENCE语句及參数介绍: 创建序列:须要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限, CREATE SEQUENCE [ schema. ]sequence [ { INCREMENT BY | START WITH } integer | { MAXVALUE integer | NOMAXVALUE