流水号在各种系统中随处可见,一般都是使用自增、年月日时分秒+自增、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>

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

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

  1. SSM 框架基于ORACLE集成TKMYBATIS 和GENERATOR自动生成代码(Github源码)

    基于前一个博客搭建的SSM框架 https://www.cnblogs.com/jiangyuqin/p/9870641.html 源码:https://github.com/JHeaven/ssm- ...

  2. Oracle中使用hash_hmac() 函数报错问题/以及Oracle遇到Oauth1.0授权和oauth_signature生成规则

    最近在Oracle上发现使用hash_hmac()报找不到此函数.为此特意查到oracle的文档.详细请看官网回答:https://cx.rightnow.com/app/answers/detail ...

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

    http://mp.weixin.qq.com/s/DkIPwbDKIjH2FMN13GkT4w 本次分享的内容是基于Oracle的SQL优化,以一条巨慢的SQL为例,从快速解读SQL执行计划.如何从 ...

  4. Oracle Sequence创建与使用

    一.Sequence简介 Sequence是数据库系统按照一定的规则自动增加的数字序列,主要用于生成数据库数据记录.这个序列一般作为代理主键(因为不会重复). Sequence是数据中一个特殊存放等差 ...

  5. 从一条巨慢SQL看基于Oracle的SQL优化(重磅彩蛋+PPT)

    本文根据DBAplus社群第110期线上分享整理而成,文末还有好书送哦~ 讲师介绍 丁俊 新炬网络首席性能优化专家 SQL审核产品经理 DBAplus社群联合发起人.<剑破冰山-Oracle开发 ...

  6. ORACLE Sequence 自增长

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

  7. SQLSERVER之高灵活的业务单据流水号生成

    SQLSERVER之高灵活的业务单据流水号生成 最近的工作中要用到流水号,而且业务单据流水号生成的规则分好几种,并非以前那种千篇一律的前缀+日期+流水号的简单形式,经过对业务的分析,以及参考网上程序员 ...

  8. 基于oracle的sql优化

    [基于oracle的sql优化] 基于oracle的sql优化 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 一.编写初衷描述 在应有系统开发初期,由于数据库 ...

  9. native生成策略:由Hibernate根据所使用的数据库支持能力从identity、sequence或者等生成策略中选择一种

    increment生成策略:当Hibernate准备在数据库表中插入一条新记录时,首先从数据库表中获取当前主键字段的最大值,然后在最大值基础上加1,作为当前持久化对象的标识符属性值.这种策略即incr ...

随机推荐

  1. js嵌套轮播图

    $(function(){ var navLi = $(".top_nav").find("li"), conDiv = $(".top_con&qu ...

  2. maven的install和deploy的区别

    转自:http://blog.csdn.net/u011305680/article/details/51699471 maven package:打包到本项目,一般是在项目target目录下.如果a ...

  3. flex弹性布局属性详解!

    详细看下flex弹性布局具体属性: flex容器属性详解:flex-direction:row/column:(横排/竖排) 决定元素的排列方向:flex-wrap:nowrap/wrap/wrap- ...

  4. jquery点击事件失效原因和解决办法

    在使用jQuery绑定点击事件的时候,有时候会遇到点击无效,这种情况大多出现在动态添加元素的时候 例如:给demo里添加li元素给li绑定点击事件 $("#demo").appen ...

  5. java 中关于System.out.println()的问题

    Java 的输出知识 1.System.out.println()不能直接写在类中,例如: 因为在 Class A{ //成员变量 //构造方法 //普通方法 //内部类 } 如果硬是想使用Syste ...

  6. MySQL逗号分割字段的列转行

    前言: 由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式.即同一个列中存储了多个属性值(具体结构见下表). 这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列转行的结果 ...

  7. MySQL 数据库的主从配置

    mysql主从配置.鄙人是在如下环境测试的: 主数据库所在的操作系统:win7 主数据库的版本:5.0 主数据库的ip地址:192.168.1.111 从数据库所在的操作系统:linux 从数据的版本 ...

  8. Feed系统架构资料收集(转)

    add by zhj:有些链接已经失效,后续会修改. 原文:http://blog.csdn.net/zhangzhaokun/article/details/7834797 完全用nosql轻松打造 ...

  9. Spring源码解析(四)Bean的实例化和依赖注入

    我们虽然获得了Bean的描述信息BeanDefinition,但是什么时候才会真正的实例化这些Bean呢.其实一共有两个触发点,但是最后实际上调用的是同一个方法. 第一个:在AbstractAppli ...

  10. 4.windows如何导入python包

    python链接:https://www.python.org/downloads/release/python-2715/ pip链接:https://pypi.org/project/pip/#f ...