新增时自动生成流水号ID

在项目中,新增某条记录的时候,为了定义某个不可重复的值,会采用自动生成流水号的方式来定义这个值。根据需要,定义的方法也多种多样,比如日期加3位流水号(例:20180115001)。因此了解到两种生成流水号的方法:

一、Java生成流水号

生成流水号格式为yyyyMMddXXXX

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class PrimaryGenerater {

	private static final String SERIAL_NUMBER = "XXXX"; // 流水号格式
	private static PrimaryGenerater primaryGenerater = null;

	private PrimaryGenerater() {
	}

	/**
	 * 取得PrimaryGenerater的单例实现
	 *
	 * @return
	 */
	public static PrimaryGenerater getInstance() {
		if (primaryGenerater == null) {
			synchronized (PrimaryGenerater.class) {
				if (primaryGenerater == null) {
					primaryGenerater = new PrimaryGenerater();
				}
			}
		}
		return primaryGenerater;
	}

	/**
	 * 生成下一个编号
	 */
	public synchronized String generaterNextNumber(String sno) {
		String id = null;
		Date date = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
		if (sno == null) {
			id = formatter.format(date) + "0001";
		} else {
			int count = SERIAL_NUMBER.length();
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < count; i++) {
				sb.append("0");
			}
			DecimalFormat df = new DecimalFormat("0000");
			id = formatter.format(date)
					+ df.format(1 + Integer.parseInt(sno.substring(8, 12)));
		}
		return id;
	}
}

  

二、SQL生成流水号

同样以生成流水号格式为yyyyMMddXXXX为例

SELECT

IF (
    max(a.st_no) IS NULL,
    CONCAT(
        date_format(now(),‘%Y%m%d‘),
        LPAD(‘1‘, ‘11‘ - LENGTH(date_format(now(),‘%Y%m%d‘), ‘0‘)
    ),
    CONCAT(
        LEFT (max(a.st_no), 8),
        LPAD(
            CONVERT (
                SUBSTRING(max(a.st_no), 9),
                SIGNED
            ) + 1,
            LENGTH(max(a.st_no)) - 8,
            ‘0‘
        )
    )
) AS st_no
FROM
    Student a
WHERE
    a.st_no LIKE concat(
        date_format(now(),‘%Y%m%d‘),‘%‘) AND LENGTH(a.st_no) = ‘11‘

注意:

①示例中date_format(now(),‘%Y%m%d‘)可以在后台业务逻辑层获取当前时间作为参数传入

②concat函数,拼接括号里的字符串   【例:调用concat("abc", "d", "ef", "g")函数返回abcdefg】

③lpad函数,用第三个参数填充到第一个参数的左边直到参数总长度达到第二个数值   【例:调用 lpad(‘sd‘,5,‘*‘) 函数返回***sd】

④substring有三种用法【substring(‘abcdefg’,3)--->defg  //   substring(‘abcdefg‘,2,3) --->bcd    //    ‘abcdefg‘.substring(2,4) --->cd】

⑤此方法仅用于后三位小于等于999的数据,有一定的局限性

原文地址:https://www.cnblogs.com/smileToSunshine/p/8288417.html

时间: 2024-08-01 13:20:03

新增时自动生成流水号ID的相关文章

nodejs+mysql 插入一条记录时获取自动生成的id

最近在写学生申报项目的后端接口时发现需要获取数据库自动生成的主键,因为要先将项目信息插入到project表,得到生成的项目ID,再将项目ID和指导老师ID插入到project_member表 一开始想在插入项目之后,用SELECT LAST_INSERT_ID() 获取生成的ID,后来发现,在插入操作完成后的返回结果里就带有自动生成的ID.可用rows.insertId获取 代码: //利用事务对project表和project_member表进行插入 conn.beginTransaction

select @@identity得到上一次插入记录时自动产生的ID

select @@identity的用法 2008-10-25 11:25:39|  分类: JSP Dev|举报|字号 订阅 用select @@identity得到上一次插入记录时自动产生的ID 如果你使用存储过程的话,将非常简单,代码如下:SET @[email protected]@IDENTITY 说明: 在一条 INSERT.SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值.若此语句没有影响任何有标识列的表,则 @@IDENTITY

上传文件时自动生成文件夹

#region 返回当前日期的文件夹 /// <summary>        ///上传文件时自动生成文件夹        /// </summary>        /// <param name="path">要保存的路径</param>        /// <returns>返回生成的文件夹</returns>        public static string CreateDis(string pa

sublime打开文件时自动生成并打开.dump文件

GBK Encoding Support 没有安装前打开ASNI格式编码文件会乱码,安装成功重启则可以打开正常 关于.dump文件生成的解释: 当打开一个非utf-8格式且包含汉字的文件时,sublime text 2会自动生成一个dump文件,文件修改过程中,不会修改原文件,只有按"保存"了才会将dump的数据更新到原文件里,关闭当前编辑的dump文件则会自动删除dump文件. 但是有时候 GBK Encoding Support 插件也会出些bug,就想这样,生成.dump文件后自

android R文件不在自动生成资源id

关于android R文件不在自动生成资源id的问题解决: 1.设置eclipse->project->build automatically 2.上述没有解决的话 project->clear

Intellij idea用快捷键自动生成序列化id

ntellij idea用快捷键自动生成序列化id 类继承了Serializable接口之后,使用alt+enter快捷键自动创建序列化id 进入setting→inspections→serialization issues→选择 serializable class without 'serialVersionUID' 原文地址:https://www.cnblogs.com/alan319/p/8820250.html

webstorm创建js文件时自动生成js注释

设置webstorm创建js文件时自动生成js注释 settings--Editor--File and Code Temlates 黑色框框里的内容自己填写上去,以下是参考的代码块: /** * @author ${USER} * @date ${DATE} ${TIME} */ 或者 /** * @author 张三 * @date ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE} */ 变量解释: ${USER}:当前系统登录的用户名 ${DATE}:当前

mybatis新增对象自动生成uuid方案

mybatis新增对象时, 使用拦截器自动生成uuid方案有了它不再去xml中手动添加selectKey了, 生成id方案实现类自行实现, 实现IdGenerator接口便可, 主要代码由公司同事编写, 我进行改造 使用时可以在id字段上添加@Id注解, 也可以在getId方法上添加或者不添加, 但是主键名字必须是id, 类型必须是String @Target({ METHOD, FIELD }) @Retention(RUNTIME) public @interface Id { Class<

mybatis中返回自动生成的id

当有时我们插入一条数据时,由于id很可能是自动生成的,如果我们想要返回这条刚插入的id怎么办呢. 在mysql数据中我们可以在insert下添加一个selectKey用以指定返回的类型和值: 方法一: <insert id="addUser" parameterType="com.zhl.pojo.User"> <selectKey resultType="java.lang.Integer" order="AFTER