基于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>
让自己业务中流水号具有辨识度,在关联查询时,一眼便可以看出数据源自何处。
基于Oracle Sequence的流水号生成规则的更多相关文章
- SSM 框架基于ORACLE集成TKMYBATIS 和GENERATOR自动生成代码(Github源码)
基于前一个博客搭建的SSM框架 https://www.cnblogs.com/jiangyuqin/p/9870641.html 源码:https://github.com/JHeaven/ssm- ...
- Oracle中使用hash_hmac() 函数报错问题/以及Oracle遇到Oauth1.0授权和oauth_signature生成规则
最近在Oracle上发现使用hash_hmac()报找不到此函数.为此特意查到oracle的文档.详细请看官网回答:https://cx.rightnow.com/app/answers/detail ...
- 转://从一条巨慢SQL看基于Oracle的SQL优化
http://mp.weixin.qq.com/s/DkIPwbDKIjH2FMN13GkT4w 本次分享的内容是基于Oracle的SQL优化,以一条巨慢的SQL为例,从快速解读SQL执行计划.如何从 ...
- Oracle Sequence创建与使用
一.Sequence简介 Sequence是数据库系统按照一定的规则自动增加的数字序列,主要用于生成数据库数据记录.这个序列一般作为代理主键(因为不会重复). Sequence是数据中一个特殊存放等差 ...
- 从一条巨慢SQL看基于Oracle的SQL优化(重磅彩蛋+PPT)
本文根据DBAplus社群第110期线上分享整理而成,文末还有好书送哦~ 讲师介绍 丁俊 新炬网络首席性能优化专家 SQL审核产品经理 DBAplus社群联合发起人.<剑破冰山-Oracle开发 ...
- ORACLE Sequence 自增长
Sequence是数据库系统按照一定规则自动增加的数字序列.这个序列一般作为代理主键(因为不会重复),没有其他任何意义. Sequence是数据库系统的特性,有的数据库有Sequence,有的没有.比 ...
- SQLSERVER之高灵活的业务单据流水号生成
SQLSERVER之高灵活的业务单据流水号生成 最近的工作中要用到流水号,而且业务单据流水号生成的规则分好几种,并非以前那种千篇一律的前缀+日期+流水号的简单形式,经过对业务的分析,以及参考网上程序员 ...
- 基于oracle的sql优化
[基于oracle的sql优化] 基于oracle的sql优化 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 一.编写初衷描述 在应有系统开发初期,由于数据库 ...
- native生成策略:由Hibernate根据所使用的数据库支持能力从identity、sequence或者等生成策略中选择一种
increment生成策略:当Hibernate准备在数据库表中插入一条新记录时,首先从数据库表中获取当前主键字段的最大值,然后在最大值基础上加1,作为当前持久化对象的标识符属性值.这种策略即incr ...
随机推荐
- with操作符损耗性能的原因
当函数运行是,创建一个[[scope]]指向的被称为作用域链的可变对象集合,作用域链的最前端是一个包含所有的局部变量.参数.this等的被称为“激活对象”的对象. 在标示符查找的过程中,从作用域的最前 ...
- install kubernetes dashboard 安装 kubernetes dashboard 详细
参考: http://www.bubuko.com/infodetail-2242562.html http://www.cnblogs.com/zhenyuyaodidiao/p/6500897.h ...
- Dell、IBM服务器配置远程管理卡
author: headsen chen date: 2018-10-09 14:12:32 1,IBM的服务器: 需要在bios里边进行配置,具体配置如下: , 开机画面过完之后,按F1进入bio ...
- 【BZOJ3470】Freda’s Walk 概率与期望
[BZOJ3470]Freda’s Walk Description 雨后的Poetic Island空气格外清新,于是Freda和Rainbow出来散步. Poetic Island的交通可以看作一 ...
- android去除Spinner的分割线
<style name="TestSpinnerStyle" parent="android:style/Widget.ListView.DropDown" ...
- 将web项目打成war包部署在tomcat步骤
将web项目打成war包部署在tomcat步骤 1.将自己的项目打成war包. 2.将打包好的war复制到${tomcat.home}/webapps项目下. 3.在${tomcat.hom}/con ...
- 基础概念 之 Hadoop Family
Hadoop家族的技术,网上资料多如牛毛,但是还是那句老话——好脑瓜不如烂笔头,看的再多也不如自己动手写一写. Hadoop是一个分布式系统,有两个关键组件——HDFS和MapReduce,HDFS负 ...
- html<input>输入框中各种正则表达式设置
<%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding ...
- 170605、防止sql注入(二)
java filter防止sql注入攻击 原理,过滤所有请求中含有非法的字符,例如:, & < select delete 等关键字,黑客可以利用这些字符进行注入攻击,原理是后台实现使 ...
- redis缓存数据架构实战
redis命令参考:http://redisdoc.com/ 与memcache对比 redis安装配置 yum安装 yum -y install redis 源码安装 PS:make报错**问题:* ...