1.需求:第一次生成的订单号为:D0000001,以后的每个新订单编号都累加1;
2.实现思路
当初我也是碰到一个需求里面要用到编号生成,百度看了一下别人的例子,好多都不符合我的需求,于是自己写了俩demo;同时也就发了出来,跟着思路随手写的当然里面还有很多需要优化的地方。
1.直接在数据库写一个自定义函数; 以后要是如果有订单编号取值规则变动的话直接维护函数即可;这种方式对程序的兼容性和扩展性比较好;
-- 创建自定义函数
create function testNum() returns varchar(50)
begin
-- 声明一个变量用来存放输出值
declare outNumStr varchar(50);
-- 查询逻辑体
select concat(left('D0000000',length('D0000000') - length(cast(substr(signNum,2,length(signNum)) as unsigned)+1)),
cast(substr(signNum,2,length(signNum)) as unsigned)+1) as signNum
FROM 你的订单表名 order by createTime desc limit 1 into outNumStr ;
-- 返回值
return outNumStr;
end;
/
-- 删除函数
drop function testNum
/
-- 查询函数
select testNum()
2.第二种相对于第一种来讲比较繁琐一点,利用Java代码进行处理;先利用sql查询出来最大的编号,然后再进入工具类里面进行格式化处理;具体方法如下:
service调用的sql:
/**
* 编号+1
* 第一次从D0000001开始;满十向左进位;编号超过7位溢出后异常;
* 暂未作超出7位处理
**/
public static synchronized String signNum(){
String num = subscribeService.getMaxElecSignNum();
String signNum = null;
String numStr = "D0000000";//初始化计数字符串
if(num == null ||"".equals(num)){
signNum = "D0000001";
}else{
Integer maxSignNum = Integer.parseInt(num);
maxSignNum = maxSignNum+1;
signNum = numStr.substring(0, numStr.length()-maxSignNum.toString().length()).concat(maxSignNum.toString());
}
return signNum;
}