首頁 > 軟體

Mybatis 在 insert 插入操作後返回主鍵 id的操作方法

2022-12-17 14:01:13

Mybatis 在 insert 插入操作後返回主鍵 id

前提條件

假設我們這裡有一個 Student 表,結構如下

sidnameage
101Jone18
102Jack20
103Tom28

其中主鍵 sid 是自增的,那麼我們插入資料時就不用插入 sid,它會生成一個自增的 sid。

問題提出

這裡有一個問題,我們執行插入語句之後,並不能獲取到生成的 sid。

StudentDao 介面中的 insert 方法

boolean insertStudent(Student student);

StudentDao.xml 中的 insert 標籤

<insert id="insertStudent" parameterType="Student">
    insert into student(name, age)
    VALUES (#{name} , #{age})
</insert>

單元測試類中的方法

@Test
public void insertUser() {
    Student student = new Student(0,"xxx", 28);

    boolean flag = studentDao.insertStudent(student);
    System.out.println(flag);
    System.out.println(student);
}

執行後的結果

這裡並不能獲取到生成的 sid,如果要獲取這個 sid,還要根據 name 來查詢資料庫,而且 name 也需要是 unique 唯一性的。

那麼,有沒有辦法讓我們能夠執行插入語句後,直接獲取到生成的 sid 呢,當然是有的。

解決方法

方法一

修改 StudentDao.xml 中的 insert 標籤,設定 useGeneratedKeys 和 keyProperty

<insert id="insertStudent" parameterType="Student" useGeneratedKeys="true" keyProperty="sid">
    insert into student(name, age)
    VALUES (#{name} , #{age})
</insert>

說明:

1、useGeneratedKeys=“true” 表示給主鍵設定自增長。

2、keyProperty=“sid” 表示將自增長後的 Id 賦值給實體類中的 sid 欄位。

執行結果:成功返回了主鍵 sid

方法二(推薦)

修改 StudentDao.xml 中的 insert 標籤,在 insert 標籤中編寫 selectKey 標籤

<insert id="insertStudent" parameterType="Student" useGeneratedKeys="true" keyProperty="sid">
    insert into student(name, age)
    VALUES (#{name} , #{age})
</insert>

說明:

1、< insert> 標籤中沒有 resultType 屬性,但是 < selectKey> 標籤是有的。
2、order=“AFTER” 表示先執行插入語句,之後再執行查詢語句。
3、keyProperty=“sid” 表示將自增長後的 Id 賦值給實體類中的 sid 欄位。
4、SELECT LAST_INSERT_ID() 表示 MySQL 語法中查詢出剛剛插入的記錄自增長 Id。

執行結果:成功返回了主鍵 sid

方法三

這種方法需要在一定條件下才能使用,就是 name 需要是 unique,不可重複的。

這樣才能在插入後,根據 name 來查詢出主鍵 sid。

同樣是修改 StudentDao.xml 中的 insert 標籤,在 insert 標籤中編寫 selectKey 標籤

<insert id="insertStudent" parameterType="Student">
    insert into student(name, age)
    VALUES (#{name} , #{age})

    <selectKey keyProperty="sid" order="AFTER" resultType="int">
        select sid from student where name = #{name}
    </selectKey>
</insert>

原理上面也講了,就是在執行插入語句之後,再執行查詢語句,將 sid 查出來。

不過我這裡 name 並未設定 unique,所以不在這裡進行測試,有興趣可以自行測試。

補充知識點:

mybatis中Insert語句如何返回插入的主鍵

方法一:

mapper.java

    /**
     * 新增部門
     * @param department
     * @return
     */
    Integer insertDep(Department department);

xml

    <insert id="insertDep" parameterType="com.example.pojo.entity.Department">
        <selectKey keyProperty="departmentId" order="AFTER" resultType="java.lang.Integer ">
            select LAST_INSERT_ID()
        </selectKey>
        insert into sys_department(name,parentId,enabled,isParent)
        VALUES(#{name},#{parentId},1,0)
    </insert>

其中:

selectKey標籤:將插入到資料庫的某條記錄的主鍵,返回到指定物件(user)對應屬性中。
keyProperty:  指定返回的主鍵,儲存在物件中(user)的哪個屬性
order:相對於insert語句,selectKey標籤中的sql的執行順序。由於mysql的自增原理,執行完insert語句之後才將主鍵生成,所以這裡selectKey的執行順序為after。
resultType:  返回的主鍵對應的JAVA型別
LAST_INSERT_ID():  是mysql的函數,返回auto_increment自增列新記錄id值。

 方法二

使用:

useGeneratedKeys="true" keyProperty="departmentId"
    <insert id="insertDep" parameterType="com.example.pojo.entity.Department" useGeneratedKeys="true" keyProperty="departmentId">
        insert into sys_department(departmentId,name,parentId,enabled,isParent)
        VALUES(uuid(),#{name},#{parentId},1,0)
    </insert>

到此這篇關於mybatis中Insert語句如何返回插入的主鍵的文章就介紹到這了,更多相關mybatis Insert返回插入的主鍵內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com