流水号在各种系统中随处可见,一般都是使用自增、年月日时分秒+自增、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 {@Autowiredprivate SequencePojoMapper sequencePojoMapper;/*** {@inheritDoc}* @param seqName* @return*/@Overridepublic String getSerialNo(String prefix, String seqName) {return getSerialNo(prefix, 0, seqName);}/*** {@inheritDoc}* @param prefix* @param idLength* @param seqName* @return*/@Overridepublic 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

基于Oracle Sequence的流水号生成规则相关推荐

  1. java流水号生成规则_流水号生成规则

    流水号生成规则,时间戳+手机号加密16位: 生成时间戳:Time.java import java.text.SimpleDateFormat; import java.util.Date; /** ...

  2. java 数字 字母 递增_JAVA流水号生成规则(按默认规则递增,数字不够添加字母递增,位数不够自动加1)...

    写道 在某些应用场景中,因业务需要,一般的流水号(前缀+日期或时间+流水号)规则无法满足业务需要,以下是因业务需要拓展出来的流水号生成规则 业务要求: 1.默认限定位数的数字递增 2.在限定位数数字达 ...

  3. java流水号生成规则(固定位数,先通过数字生成,数字用完字母生成)

    今天来分享一个比较有意思的递增规则,开始也研究了一会,把高中学的等比等差都用上了,小喝了一杯茶,游荡一圈回来恍然大悟,所以说劳逸结合还是蛮重要的.下面进入正题: 我的规则是第一位作为头,后面所为流水号 ...

  4. JAVA流水号生成规则,5位字符串,生成上千万uuid,使用0-9,A-Z36位来计算,按默认规则递增

    因业务需要,原始uuid为5位,最多只支持10万条uuid,因业务量剧增,在不影响存量数据的情况下,需要拓展uuid,故将5位0-9的十进制规则,转换为0-9,A-Z36进制规则. 常规原则0000Z ...

  5. linux创建特殊文件rules,RHEL5 Oracle Linux 5上生成正确的udev rule 规则文件

    RHEL5 Oracle Linux 5上生成正确的udev rule 规则文件 1.确认在所有RAC节点上已经安装了必要的UDEV包 [root@rh2 ~]# rpm -qa|grep udev ...

  6. Oracle Sequence

    Sequence是数据库系统按照一定规则自动增加的数字序列.这个序列一般作为代理主键(因为不会重复),没有其他任何意义. Sequence是数据库系统的特性,有的数据库有Sequence,有的没有.比 ...

  7. oracle apex 发布应用,基于Oracle APEX的快速Web应用开发

    随着软件技术的飞速发展和Oracle数据库的广泛应用,许多基于Oracle数据库的Web开发工具应运而生,这些工具给开发人员更加快速.高效.便捷地进行Web应用开发提供了莫大的帮助[1].其中,Ora ...

  8. 数据分片排序oracle,基于ORACLE数据库的海量数据脱敏方法与流程

    本发明涉及一种数据脱敏方法,尤其涉及一种基于oracle数据库的海量数据脱敏方法. 背景技术: oracle数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管 ...

  9. 商户流水号生成方法-带序列号

    ** 商户流水号和订单号生成方法-带序列号 每次在对接支付平台,第三方收单接口和小程序时,需要用到订单号或者商户流水号来检验唯一性,一般前缀+日期+随机数+后缀格式,自动生成:虽然能保证唯一性,但看上 ...

最新文章

  1. Java反射机制浅析
  2. canal原理的一些学习-1(canal的一些原理性介绍)
  3. iOS中AutoLayer自动布局流程及相关方法
  4. C和指针之字符串编程练习8实现char *my_strnchr(char const *str, int ch, int which)
  5. layui向body添加html_layui 各项配置
  6. 非模态对话框的销毁及消息的发送顺序
  7. java thread类_Java多线程原理及Thread类详解
  8. Angular企业级开发(3)-Angular MVC实现
  9. 微服务业务日志收集方案
  10. OpenModelica使用入门
  11. python爬取公众号推荐,用python爬取公众号的方法
  12. 大学毕业生推荐表的计算机水平,大学毕业生就业推荐表学校鉴定评语
  13. TEXT部分文字颜色的改变
  14. [irving] C# Windows Beep 调用声音文件
  15. 设置Android应用全屏显示(隐藏手机状态栏)
  16. AT89C51(Atmel)芯片制作简易的频率计
  17. 看不起java_程序员铁律,用Tab的瞧不起用Space键的,用C语言的瞧不起用Java的!...
  18. win10命令窗口在哪里
  19. 论文趋势分析——数据理解与分析
  20. 问题排查-Flink session窗口最后一个不过期问题

热门文章

  1. 解决修改JAVAHOME后java版本不改变问题
  2. Windows版kali主题包
  3. 【网络】连接服务器失败(错误原因:Connection refused)| error 111: (111) Connection refused 原因分析...
  4. 修改国家代码增强OpenWrt 5G wifi信号的强度
  5. 雷蛇Razer鼠标固件升级失败后的解决办法
  6. cin.ignore()详解
  7. DNS的正向解析,反向解析以及双向解析
  8. 【微电子】半导体器件物理:0-3器件技术发展走势
  9. 2022-2028全球及中国信号装置行业研究及十四五规划分析报告
  10. ARM汇编和C语言混合编程中数组的数组的操作