Mysql表单自增id自定义规则,用LPAD/RPAD就够了
今天總結下我們業務經常會用到的一種情況:有時業務的表單單號都需要用唯一值來存儲和展示數據,一般我們可能會想到生成當前系統時間戳作為單號內容,每行數據的insert的時間都是不一樣的,都需要排隊一條條執行,所以可以用System類的currentTimeMillis方法獲取時間戳,這種取時間戳的方式效率最高;而當前業務需求是想制定比較簡單的單號格式,因為時間戳是一個數字串,對業務來說有點亂,而且過長,不方便閱讀,所以就定制了一種,以固定字符開頭+自增數字,例如:pro1,這里為了考慮問題單數量,這個數字我們應該要往左邊補0,多補幾位,如pro0000001,那么這種情況下,就可以用到LPAD函數了。注意這里的前綴pro,我們就需要在java接口中用拼接方法進行處理
?一、LPAD函數介紹
LPAD(str,len,padstr)函數將字符串padstr填充到str的左側,使字符串的長度達到len,然后返回字符串str.如果字符串str的長度大于len,則返回值被縮短至len字符長度。而還有一種是在右側填充,RPAD()函數,用法同理。
例如:
-
select LPAD(10,7,0);? ?//?0000010? ?
-
select LPAD("pro",7,0);? ?//?0000pro
-
select RPAD("pro",7,0);? ?//?pro0000
-
select RPAD(10,7,0);? ?//?1000000? ?
二、業務實現
1.dao層xml中進行自增ID獲取并設置固定位數
了解完函數的運用情況,接著我們再看看如何落地該需求功能。這里的單號可以拆分為兩部分,一部分是前綴,假設為字符串 pro,后綴則是固定位數的數值,自增+1,假設為 7位數,則第一個insert數據則為 0000001,第二個則為0000003(自增長度具體看數據庫設置,有些是自增步長為2),那我們的項目是自增步長為2。那這里有涉及到一個知識點,獲取自增ID,這里有一篇我之前寫的文章,通過自定義序列表與函數,進行調用函數取自增ID,我們通過該方案來獲取自增ID,然后再結合LAPD()函數,將自增ID的位數保持為固定位數,代碼如下:
dao.xml
<select id="getId" resultType="java.lang.String" useCache="false" flushCache="true"SELECT LPAD(SCHEMA.NEXTVAL(),7,0); </select>?mapper.java
@Repository public interface IGetIdDao{public String getId(); }?xml中通過調用數據庫中的NEXTVAL()自增ID函數,得到當前最新的ID值,再進行函數左補齊匹配。接下來就是在service層中調用dao層該接口進行前綴的拼接處理。有一點需要注意,一般springboot項目中都要開啟使用事務,而自增函數調用時,因為事務為提交,無法取到最新ID值,所以需要設置兩個Cache緩存參數進行清除,這樣就可在事務中取到最新ID需要設置兩個Cache緩存參數進行清除,這樣就可在事務中取到最新IDhttps://blog.csdn.net/studyday1/article/details/126470805?spm=1001.2014.3001.5502這里文章中也有說明,可訪問了解該機制。
2.service層調用接口得到后綴的固定位數的自增ID值,進行拼接
@Autowired private IGetIdDao iGetIdDao;public String getId(){return "pro"+iGetIdDao.getId(); //通過拼接得出最終業務表單所需樣式的單號數據 }?總結:功能基本上涉及到 自增ID、LPAD函數的運用,以及事務導致的自增ID無法取到最新值需要設置清除緩存。
總結
以上是生活随笔為你收集整理的Mysql表单自增id自定义规则,用LPAD/RPAD就够了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php sftp文件上传 文件上传
- 下一篇: linux cmake编译源码,linu