1. 程式人生 > >mybatis的一個小技巧與坑

mybatis的一個小技巧與坑

今天在公司開發一個醫院系統時,遇到這樣兩個問題:

第一個問題:

我的一張表主鍵是自增長,主鍵欄位是病人id,還有一個欄位是門診號,門診號需要獲取主鍵的值,把值格式化成“00000000”這種八位數的格式。最開始想了一種方式:先把病人的其他資訊存入表中,然後再讀取id(此時通過比較,讀取最大的那個id,也就是最近插入的一個),通過id來格式化門診號,這樣做的弊端有兩個,一個是頻繁的讀取和插入,消耗資源,另一個是如果遇到併發的情況會出現bug(如果在相差很短的時間內生成兩個掛號信息,由於時間相差很短,在取id值的時候有可能兩次都取了同一個值,會導致一個門診號分配給多人)。

基於兩種情況的考慮,放棄了這種方式,後來又找到了另外一種簡單的 解決方法,如圖:

文件解釋如下:

useGeneratedKeys (insert and update only) This tells MyBatis to use the JDBC getGeneratedKeys method to retrieve keys generated internally by the database (e.g.auto increment fields in RDBMS like MySQL or SQL Server). Default: false 
(( 僅 對 insert 和update有 用 ) 這 會 告 訴 MyBatis 使 用 JDBC 的 getGeneratedKeys 方法來取出由資料(比如:像 MySQL 和 SQL Server 這樣的資料庫管理系統的自動遞增欄位)內部生成的主鍵。預設值:false。) 

也就是說寫了 useGeneratedKeys="true" 等於true即說明插入資料之後 可以立馬使用自增的主鍵

keyProperty="patientId"  這個屬性意思是把自增的主鍵賦值到patientId屬性上,patientId代表的是實體類的屬性,而不是資料庫欄位。

 

第二個問題:

我在資料庫表中有有一個category_state欄位用於判斷掛號的是門診還是住院,表中是int型別,由於這種基本的增刪查改程式碼都是直接生成的,在mapper層有這樣一個判斷

如果categoryState!='' ,這裡的categoryState是int型和空字元比較,我的狀態值,一個是1,一個是0,然後在mabatis中0代表空字元,所以當我從前臺傳0過來時,直接判斷這句話不參與新增到資料庫,導致資料庫中沒有值而出錯。

修改方案:1.把categoryState!=' '去掉

                2.狀態傳非0的數

               3.  資料庫中把欄位改為char,而不是用int

今天就寫到這裡,希望通過今天寫這個部落格,記錄自己的一些錯誤,以後不會繼續出現這樣的問題。