1. 程式人生 > >(六)Mybatis插入資料返回主鍵id

(六)Mybatis插入資料返回主鍵id

整個demo放在Github上,地址:【https://github.com/Damaer/Mybatis-Learning】,專案是mybatis-05-CRUD,下載下來只需要maven環境以及mysql環境就可以跑起來,所以不貼全部程式碼。

我們知道很多時候我們有一個需求,我們需要把插入資料後的id返回來,以便我們下一次操作。
其實一開始的思路是我插入之後,再執行一次select,根據一個唯一的下欄位來select,但是Student這個類如果插入後再根據名字或者年齡查出來,這根本就是不可行的!!!重名與同年齡的人一定不少。
我們的測試方法如下,我們可以看到插入前是沒有值的,插入後就有了值:

/**
 * 測試插入後獲取id
 */
@Test
public void testinsertStudentCacheId(){
    Student student=new Student("helloworld",17,85);
    System.out.println("插入前:student="+student);
    dao.insertStudentCacheId(student);
    System.out.println("插入後:student="+student);
}

解決方案1:

    <insert id="insertStudentCacheId"
useGeneratedKeys="true" keyProperty="id" parameterType="Student"> insert into student(name,age,score) values(#{name},#{age},#{score}) </insert>

需要注意的點:

1.useGeneratedKeys=”true”表示設定主鍵自增
2.keyProperty=”id”設定主鍵的欄位
3.parameterType=”Student”設定傳入的型別
4.注意:雖然有返回型別,但是我們不需要手動設定返回的型別,這個是由框架幫我們實現的,所以對應的介面方法也是沒有返回值的。

public void insertStudentCacheId(Student student);

5.實體類中id屬性欄位一定需要set以及get方法

另一種方式(資料庫中實現了自增)

    <insert id="insertStudentCacheId" parameterType="Student">
        insert into student(name,age,score) values(#{name},#{age},#{score})
        <!-- 指定結果型別resultType,keyProperty是屬性,自動返回到屬性id中,order是次序,after是指獲取id是在於插入後 -->
        <selectKey resultType="int" keyProperty="id" order="AFTER">
            select @@identity
        </selectKey>
    </insert>

或者寫成:

    <insert id="insertStudentCacheId" parameterType="Student">
        insert into student(name,age,score) values(#{name},#{age},#{score})
        <!-- 指定結果型別resultType,keyProperty是屬性,自動返回到屬性id中,order是次序,after是指獲取id是在於插入後 -->
        <selectKey resultType="int" keyProperty="id" order="AFTER">
            select LAST_INSERT_ID()
        </selectKey>
    </insert>

兩種方式的結果:

注意要點:

1.最外層的沒有返回屬性(resultType),但是裡面的是有返回值型別的。
2.order=”AFTER”表示先執行插入,之後才執行selectkey語句的。
3.select @@identity和select LAST_INSERT_ID()都表示選出剛剛插入的最後一條資料的id。
4.實體類中id屬性欄位一定需要set以及get方法
5.此時,介面中仍不需要有返回值,框架會自動將值注入到我們insert的那個物件中,我們可以直接使用就可以了。

其實,我們的介面中可以有返回值,但是這個返回值不是id,而是表示插入後影響的行數,此時sql中仍和上面一樣,不需要寫返回值。

<insert id="insertStudentCacheIdNoReturn" parameterType="Student">
        insert into student(name,age,score) values(#{name},#{age},#{score})
        <!-- 指定結果型別resultType,keyProperty是屬性,自動返回到屬性id中,order是次序,after是指獲取id是在於插入後 -->
        <selectKey resultType="int" keyProperty="id" order="AFTER">
            select LAST_INSERT_ID()
        </selectKey>
    </insert>

介面中:

// 增加新學生並返回id返回result
public int insertStudentCacheId(Student student);

介面的實現類:

public int  insertStudentCacheId(Student student) {
        int result;
        try {
            sqlSession = MyBatisUtils.getSqlSession();
            result =sqlSession.insert("insertStudentCacheId", student);
            sqlSession.commit();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
        return result;
    }

Test中:

public void testinsertStudentCacheId(){
        Student student=new Student("helloworld",17,101);
        System.out.println("插入前:student="+student);
        int result = dao.insertStudentCacheId(student);
        System.out.println(result);
        System.out.println("插入後:student="+student);
    }

結果證明:result的值為1,表示插入了一行,檢視資料庫,確實插入了資料。