mysql生成订单编号函数

DROP TABLE IF EXISTS `order_seq`;
CREATE TABLE `order_seq` (
`timestr` int(11) NOT NULL,
`order_sn` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

drop FUNCTION order_seq;

create function order_seq()
returns VARCHAR(50)
begin
declare v_cnt integer;
declare v_timestr integer;
declare v_value VARCHAR(50) ;
declare rowcount BIGINT;
set v_timestr =DATE_FORMAT(now(),'%Y%m%d');
set v_cnt = 1;
select order_sn + 1 INTO v_cnt from order_seq where timestr = v_timestr;
UPDATE order_seq set order_sn = v_cnt where timestr = v_timestr;
if ROW_COUNT() = 0 THEN
INSERT INTO order_seq values(v_timestr,v_cnt);
end if;
select CONCAT(v_timestr,LPAD(order_sn,7,0)) INTO v_value from order_seq where timestr = v_timestr;
return v_value;
end;
--运行结果
SELECT order_seq();

转载于:https://www.cnblogs.com/working/p/5624666.html

### Java 中实现唯一订单编号生成的最佳实践 #### 使用 MySQL 存储过程生成唯一订单号 一种优雅的方式是在 SQL 数据库中创建存储过程来生成具有特定规则的独特订单号。这种方式不仅能够确保订单号的唯一性,还允许开发者设定一定的逻辑或模式于订单号之中[^1]。 ```sql DELIMITER // CREATE PROCEDURE GenerateOrderNumber(OUT order_number VARCHAR(20)) BEGIN DECLARE done INT DEFAULT FALSE; DECLARE new_order_num BIGINT; -- 获取当前最大订单号码并加一 SELECT COALESCE(MAX(order_id), 0) + 1 INTO new_order_num FROM orders; SET order_number = CONCAT('ORD', DATE_FORMAT(NOW(), '%Y%m%d'), LPAD(new_order_num, 6, '0')); END// DELIMITER ; ``` 此段代码展示了如何利用 MySQL 的 `CONCAT` 函数组合日期与序列号形成具有一定规律性的订单编号,并通过 `LPAD` 来填充前置零以保持固定长度。 #### 基于 Snowflake 算法的分布式 ID 生产者 对于分布式的应用场景下,则可以考虑采用类似于 Twitter 开发出来的 Snowflake 算法来进行全局唯一的 Long 类型 ID 创建工作。该方案基于时间戳、机器节点以及序列号三部分构成最终返回的结果,在大多数情况下都能很好地满足需求[^3]。 ```java public class IdGenerator { private final long workerIdBits = 5L; private final long maxWorkerId = ~(-1L << workerIdBits); private final long sequenceBits = 12L; private final long workerIdShift = sequenceBits; private final long timestampLeftShift = sequenceBits + workerIdBits; private final long sequenceMask = ~(-1L << sequenceBits); private long workerId; private long lastTimestamp = -1L; private long sequence = 0L; public synchronized long nextId() throws Exception { long currentTimestamp = System.currentTimeMillis(); if (currentTimestamp < lastTimestamp) throw new Exception("Clock moved backwards"); if (lastTimestamp == currentTimestamp){ sequence = (sequence + 1) & sequenceMask; if(sequence == 0) while(currentTimestamp <= lastTimestamp) currentTimestamp = System.currentTimeMillis(); }else{ sequence = 0; } lastTimestamp = currentTimestamp; return ((currentTimestamp << timestampLeftShift)) | (workerId << workerIdShift) | sequence; } } ``` 上述示例实现了基本版的 Snowflake 算法,其中包含了必要的位运算操作用于拼接各个组成部分得到完整的 ID 数值。 #### 结合 Spring Framework 和 MyBatis 进行 DAO 层集成 当项目架构选择了 Spring 框架作为核心容器管理 Bean 生命周期时,可以通过如下方式获取到已经配置好的数据访问对象实例从而方便地调用其内部方法完成业务逻辑处理[^2]. ```java @Autowired private ICommonDao commonDao; // 或者使用静态工具类注入Spring上下文中的Bean commonDao = ApplicationContextUtil.getBean(ICommonDao.class); ``` 这里给出了两种不同的 DI 方式供开发人员选择适合自己的场景应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值