首先应该创建一个自增号码的表,建表数据如下:
CREATE TABLE `sequence` (
`name` varchar(20) NOT NULL,
`value` int(10) unsigned NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=''自增编号生成本表'';
其中两个字段的含义: name:代表的自增的业务名称,需要生成编号的可能是 order_number(订单编号)或者是goods_number(产品编号); value:记录当前编号已经自增的值,从0开始,每次生成 +1。
表格详情如下:
namevalueorder_number0goods_number0
开始创建MySQL函数
BEGIN
DECLARE getval VARCHAR(24) DEFAULT '''';
UPDATE sequence SET value= last_insert_id(value+1) WHERE name=seq_name;
SET getval = (SELECT CONCAT(IFNULL(DATE_FORMAT(NOW(), time_type),''''), LPAD((last_insert_id()+""), seq_length, ''0'')));
RETURN getval;
END
这是一个获取名称为getval()的MySQL函数,执行时首先修改sequence表中为‘seq_name’的value值,然后执行查询获取最终的编号。其中包括三个参数需要传入: seq_name:这个参数对应的就是sequence表中的name字段,表示要获取哪个业务对应的编号,可以传入例如 ‘order_number’; time_type:这个参数表示的是对应生成的时间格式,可以传入‘yyyy-MM-dd’; seq_length:这个参数指的是在时间后还有几位,比如可以传入4,那么时间后就会生成‘0001’四位,按介绍参数传入参数执行函数,那么最后生成的编号为【202001140001】
项目中应该如何使用该函数(以Mybatis为例)
//Mybatis对应Mapper的Java代码写下方法:
String getWorksheetId(@Param("name") String name, @Param("sqlLength") Integer sqlLength, @Param("typeTime") String typeTime);
SELECT getWorksheetId(#{name}, #{sqlLength}, #{typeTime}) FROM dual
dual:指的是MySQL的虚拟表,没有什么特殊意义,具体解释可以百度搜下,这里就不详细介绍了。
最后在Java代码中调用该方法就可以实现了:
String orderNumber = SequenceMapper.getWorksheetId("order_number", 4, "yyyy-MM");
最终返回的结果为(时间为文章创建日期,不必纠结):“202001140001”。
|