工作中遇到這樣的問題,本來以為很難解決的事情,沒想到Mybatis中一個注解就解決了。再次記錄一下。
@Insert("insert into user(name,age) value(#{user.name},#{user.age})")
@SelectKey(statement = "select last_insert_id()", keyProperty = "user.id", before = false, resultType = int.class) int insert_selectKeyAnotation(@Param("user") User user);
關於@SelectKey
關於insert()有一種需求很常見:如何確定插入數據的主鍵。對於MySQL中的自增類型主鍵,無需提供主鍵可以直接插入。還是以insert()函數為例,這個SQL語句沒有提供主鍵,主鍵是自增類型可以自動生成。
@Insert("insert into user(name,age) value(#{name},#{age})")
int insert(@Param("name") String name, @Param("age") int age);
下面介紹一個重要注解
@SelctKey(statement="SQL語句",keyProperty="將SQL語句查詢結果存放到keyProperty中去",before="true表示先查詢再插入,false反之",resultType=int.class)
其中:
-
statement是要運行的SQL語句,它的返回值通過resultType來指定
-
before表示查詢語句statement運行的時機
-
keyProperty表示查詢結果賦值給代碼中的哪個對象,keyColumn表示將查詢結果賦值給數據庫表中哪一列
-
keyProperty和keyColumn都不是必需的,有沒有都可以
-
before=true,插入之前進行查詢,可以將查詢結果賦給keyProperty和keyColumn,賦給keyColumn相當於更改數據庫
-
befaore=false,先插入,再查詢,這時只能將結果賦給keyProperty
-
賦值給keyProperty用來“讀”數據庫,賦值給keyColumn用來寫數據庫
-
selectKey的兩大作用:1、生成主鍵;2、獲取剛剛插入數據的主鍵。
-
使用selectKey,並且使用MySQL的last_insert_id()函數時,before必為false,也就是說必須先插入然后執行last_insert_id()才能獲得剛剛插入數據的ID。
before=false的情況
注意keyProperty不能使基本類型,因為那樣賦值之后就找不到了(相當於傳值)
注解的方式