1. 程式人生 > >mybatis的insert插入後獲取自增id詳解(從controller到mapper)

mybatis的insert插入後獲取自增id詳解(從controller到mapper)

需求說明:當執行插入操作的時候,其中資料包含兩個模組,分別存放在兩種資料庫表中,拿表A,表B來說。
表A為基本資訊表,其中插入時候有自增id,也就是每新增一條資料後下一個id都會自動加1。
表B為詳情表,其中有個欄位為A_id與A表中的id是一樣的,也就是他們的關聯欄位。

那麼問題就來了:如果你在新增資料的時候,你發現基本資訊和詳情的資料都是在一個頁面中,也是同時傳遞到後端介面中,那麼我們勢必會有個先後,必須要有A表中的id,那樣的話B表中的資料才能夠對應入庫,不然所屬關聯關係就會亂,這樣也會影響功能,廢話不多說,直接上程式碼。

Controller.java程式碼模組

(也可以寫在service,看個人習慣)

//資料新增
//先將基本資料入庫  
res = service.insertbase(po);
int id =po.getId();
newid = id;
//然後獲取id再將另一部分資料入另一張表

Mapper.xml程式碼模組

<insert id="insertbase" parameterType="alertmodelPo" useGeneratedKeys="true" keyProperty="po.id">
        insert into A(profile_name,use_flag, create_by, create_date, remark)
        values
(#{po.profile_name},'1', #{po.create_by}, now(), #{po.remark}) <selectKey order="AFTER" resultType="java.lang.Integer" keyProperty="po.id"> select last_value from A_id_seq </selectKey> </insert>

keyProperty:預設為unset,主要用於設定getGeneratedKeys方法或selectKey子元素返回值將賦值到領域模型的哪個屬性中。
useGeneratedKeys

:取值範圍true|false(預設值),設定是否使用JDBC的。

其中主要是先執行插入操作,然後再從表序列中查詢出最新的資料,也就是last_value,這個地方存在一個情況就是表的資料最好不要直接庫操作表插入,不然會影響這個表的序列,當然重置表序列等操作可以看我之前寫的部落格,裡面有詳細介紹。

操作過程可能遇到的問題:

Id值取不到之情況1:keyProperty的值直接寫id沒有寫po.id。
本質原因,因為keyProperty的值是物件的屬性值,不是資料表中的欄位名。
Id值取不到之情況2:在dao層的入參處沒有宣告@Param(“po”)從而導致po.id的值獲取不到,也就是說這個沒聲名的話mapper裡面就不知道你的po是什麼值,就會報錯no getter ‘po’……..。
本質原因,對@Param的理解不夠。
*

後話:

*之前網上很多都是沒有下面selectKey的標籤,我發現這個不寫的話會存在版本相容,報下面這個錯誤,所以沒有用網上的那些方法,上面的我寫的方法反正百試不爽。所以還是用我的方法吧。
Returning autogenerated keys is only supported for 8.2 and later servers.