Java+Mysql存储过程生成订单序列号

Mysql存储过程生成唯一订单号

直接上代码!!

1.创建存储过程

CREATE DEFINER=`root`@`localhost` PROCEDURE `getOrderSerialNo`(# 前缀in orderPrefix varchar(64), # 返回结果out result int)
BEGIN# 当前流水号declare curOrderNo int;# 默认值为0declare errorResult int default 0;# 生成失败返回declare continue handler for sqlexception set errorResult = -1;#开启事务 start transaction;select cur_order_no into curOrderNo from t_order_serial_no where order_prefix = orderPrefix;# 如果该前缀是第一次生成 则插入1if curOrderNo is null theninsert into t_order_serial_no(order_prefix, cur_order_no) values (orderPrefix, 1);select 1 into result;else # 否则递增update t_order_serial_no set cur_order_no = cur_order_no + 1 where order_prefix = orderPrefix;select cur_order_no into result from t_order_serial_no where order_prefix = orderPrefix;end if;if errorResult = -1 then rollback;set result = -1;else commit;end if;select result;
END

2.创建数据表

CREATE TABLE `t_order_serial_no` (`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',`order_prefix` varchar(64) NOT NULL COMMENT '订单号前缀',`cur_order_no` int(10) NOT NULL COMMENT '当前流水号数值',PRIMARY KEY (`id`),UNIQUE KEY `order_prefix_unique_idx` (`order_prefix`) USING BTREE COMMENT '唯一键索引'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

3.代码

3.1 service层

@Service
public class OrderService {@Resourceprivate OrderDAO orderDAO;/*** 订单流水号生成规则:order+年月日+5位不重复递增流水号(00001开始)* @return*/public String getOrderSerialNumber() {String result;// 订单流水号前缀String orderPreFix = "ORDER" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")).replaceAll("-", "");// 请求参数Map<String, Object> requestMap = new HashMap<>();// 输入参数requestMap.put("orderPrefix", orderPreFix);// 输出参数requestMap.put("result", 0);Integer orderSerialNumber = orderDAO.getOrderSerialNumber(requestMap);if (Objects.isNull(orderSerialNumber) || -1 == orderSerialNumber) {throw new RuntimeException("生成失败!");}String serialNumberStr = getSerialNumber(orderSerialNumber, 5);result = orderPreFix + serialNumberStr;return result;}/*** 流水号位数* @param number 流水号数值* @param counts 位数* @return*/public static String getSerialNumber(int number, int counts) {String result = "";for(int i = (number+"").length() ; i < counts; i++){result += "0";}result += number;return result;}
}

3.2 OrderDAO

/*** 获取订单流水号数值* @param requestMap* @return*/Integer getOrderSerialNumber(Map<String, Object> requestMap);
 <select id="getOrderSerialNumber" parameterType="java.util.Map" statementType="CALLABLE" resultType="java.lang.Integer">{CALL getOrderSerialNo(#{orderPrefix, mode=IN,jdbcType=VARCHAR},#{result, mode=OUT,jdbcType=INTEGER})}</select>

3.3 controller 层

    @Autowiredprivate OrderService orderService;@RequestMapping("/getSerialNum")public String getSerialNum() {return orderService.getOrderSerialNumber();}

调用该接口进行完整订单流水号生成:
在这里插入图片描述

4.结果

以上示例演示的流水号生成规则是ORDER+年月日+五位数字(递增,不够0填充)在这里插入图片描述
注意: 在高并发情况下,只有数据库事务的隔离级别设置为REPEATABLE-READ及以上才可行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/619513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp小程序超出一行显示...并展示更多按钮

注意:全部标签需要浮动在父盒子右边哦 循环获取所有需要展示数据标签的高度 this.goods this.goods.map(item > ({...item,showBtn: false}));this.$nextTick(() > {uni.createSelectorQuery().in(this).selectAll(".cart-info").boundingClientRect((data)…

yolov7中断训练后继续训练

1、训练指令 &#xff08;1&#xff09;添加resume参数&#xff0c;参数值改为true &#xff08;2&#xff09;weights参数&#xff0c;参数值改为中断前上次训练权重 中断后继续训练命令&#xff1a; python.exe train.py --weights runs/train/exp9/weights/last.pt --re…

SpringBoot3 WebFlux 可观测最佳实践

前言 链路追踪是可观测性软件系统的一个非常好的工具。它使开发人员能够了解应用程序中和应用程序之间不同交互发生的时间、地点和方式。同时让观测复杂的软件系统变得更加容易。 从Spring Boot 3开始&#xff0c;Spring Boot 中用于链路追踪的旧 Spring Cloud Sleuth 解决方…

Unity2022.3打包Android后从AB包加载场景发现丢失大量脚本问题

问题 这两天遇到一个问题&#xff0c;在VR项目打包Android的时候&#xff0c;加载场景后&#xff0c;Timeline工作不正常&#xff0c;找不到原因。 现象 看到有很多警告&#xff0c;丢失脚本的Log。 因为场景本身也有一些丢失的脚本所以没在意&#xff0c;但是又不是所有脚本…

计算机毕业设计-----SpringBoot招聘网站项目

项目介绍 SpringBoot招聘网站项目。主要功能说明&#xff1a; 管理员登录,简历管理,问答管理,职位管理,用户管理,职位申请进度更新,查看简历等功能。 用户角色包含以下功能&#xff1a;用户首页,登录注册,职位查看,职位详情,投递简历,查看我的申请,管理个人简历,附件简历管理…

紫光展锐M6780丨画质增强——更炫的视觉体验

智能显示被认为是推动数字化转型和创新的重要技术之一。研究机构数据显示&#xff0c;预计到2035年底&#xff0c;全球智能显示市场规模将达到1368.6亿美元&#xff0c;2023-2035年符合年增长率为36.4%。 随着消费者对高品质视觉体验的需求不断增加&#xff0c;智能手机、平板…

如何用ChatGPT写教案设计?以“沁园春雪”为例

1. 引言 随着人工智能技术的飞速发展&#xff0c;ChatGPT已成为教育领域的一大创新工具。ChatGPT不仅能够模拟人类对话&#xff0c;还可以帮助设计互动丰富、内容丰富的教案。本文将探索如何利用ChatGPT进行教案教学设计&#xff0c;特别是通过“沁园春雪”这一案例&#xff0…

工作上被批评,学会这5个方法管理情绪,停止内耗分享

目录 前言 1、被领导批评了&#xff0c;产生情绪波动很正常 2、为什么会产生这些情绪 一、随时随地&#xff0c;做好挨批评的心里准备 二、每时每刻&#xff0c;学会从被批评的情绪中抽离出来 三、一心一意反省&#xff0c;被批评的自身问题 四、一笔一划记下&#xff0…

基于反卷积方法的重大突破:结构光系统中的测量误差降低3倍

作者&#xff1a;小柠檬 | 来源&#xff1a;3DCV 在公众号「3DCV」后台&#xff0c;回复「原论文」可获取论文pdf 结构光三维测量技术在工业自动化、逆向工程和图形学领域越来越受欢迎。然而&#xff0c;现有的测量系统在成像过程中存在不完美&#xff0c;会导致在不连续边缘周…

【学习心得】Git深入学习

一、深入学习Git必须熟悉两个概念 &#xff08;1&#xff09;【四个区】Git本地有三个区&#xff0c;远程仓库也可以看出成一个区域 工作区、暂存区、本地仓库、远程仓库。 通过四句话来充分理解这三个区 第一句话&#xff1a;你创建的一个文件夹&#xff0c;并且将它初始化…

基于Java SSM框架实现体育竞赛成绩管理系统项目【项目源码+论文说明】

基于java的SSM框架实现体育竞赛成绩管理系统演示 摘要 体育竞赛是各种体育体育项目比赛的总称。是在裁判员的主持下&#xff0c;按统一的规则要求&#xff0c;组织与实施的体育员个体或体育队之间的竞技较量&#xff0c;是竞技体育与社会发生关联&#xff0c;并作用于社会的媒…

基于OpenCV的谷物颗粒识别

基于OpenCV的谷物颗粒识别 一、程序整体功能介绍1.1 导入库与函数定义1.2 颜色分割与灰度处理1.3 二值化与轮廓检测1.4 绘制与计数1.5 主程序与结果展示 二、算法原理与实现流程2.1算法原理&#xff08;1&#xff09;颜色分割&#xff08;2&#xff09;灰度处理与二值化&#x…

前端 TS 语法 接口(2)

介绍 TypeScript的核心原则之一是对值所具有的shape进行类型检查。 它有时被称做“鸭式辨型法”或“结构性子类型化”。 在TypeScript里&#xff0c;接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。 只读属性 readonly 一些对象属性只能在对象刚刚创建的…

Java反转单链表

/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ //核心思想&#xff0c;利用cur和Curnex…

基础篇_数据持久化(实战-我的B站,MySQL数据库)

文章目录 一. 实战-我的B站1. 功能演示2. 设计数据类数据展示路径参数 3. 设计 Service 类静态资源映射读取文件的时机Stream API 改进 二. MySQL 数据库1. 数据库必要性2. MySQL 安装下载压缩包初始化数据库运行服务器运行客户端 3. 初步使用4. datagrip添加数据源导入数据用 …

Python 爬虫的基本原理(一)

饼干 与 会话&#xff08;狗头&#xff09; Python 爬虫的基本原理涉及以下几个关键步骤&#xff1a; HTTP 请求&#xff1a;爬虫首先发送一个 HTTP 请求到目标网站。这可以通过 Python 的库如 requests 实现。请求可以是 GET 或 POST 类型&#xff0c;用于获取网页内容或提交…

路由前置守卫router.beforeEach相关用法

router.beforeEach 是 Vue Router 提供的全局前置守卫&#xff0c;用于在路由切换之前执行一些逻辑。该守卫接收三个参数&#xff1a; to: 即将要进入的目标路由对象。from: 当前导航正要离开的路由。next: 一个函数&#xff0c;用于 resolve 钩子。调用 next 表示路由可以继续…

HBase 基础

HBase 基础 HBase1. HBase简介1.1 HBase定义1.2 HBase数据模型1.2.1 HBase逻辑结构1.2.2 HBase物理存储结构1.2.3 数据模型 1.3 HBase基本架构 2. HBase环境安装2.1 HBase 安装部署2.1.1 HBase 本地按照2.1.2 HBase 伪分布模式安装2.1.3 HBase 集群安装 2.2 HBase Shell操作2.2…

jar包部署到linux虚拟机的docker中之后连不上mysql

前言&#xff1a; 跟着黑马学习docker的时候&#xff0c;将java项目部署到了docker中&#xff0c;运行访问报错&#xff0c;反馈连不上mysql。 错误描述&#xff1a; 方法解决&#xff1a; 概述&#xff1a;在虚拟中中&#xff0c;我进入项目容器的内部&#xff0c;尝试ping…

分布式搜索引擎--认识

elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 。 elasticsearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack&#xff08;ELK&#xff09;。被广泛…