1. 程式人生 > >如何在Java MyBatis 插入資料庫返回主鍵?

如何在Java MyBatis 插入資料庫返回主鍵?

 

複製程式碼

User user = new User();  
user.setUserName("chenzhou");  
user.setPassword("xxxx");  
user.setComment("測試插入資料返回主鍵功能");  
  
System.out.println("插入前主鍵為:"+user.getUserId());  
userDao.insertAndGetId(user);//插入操作  
System.out.println("插入後主鍵為:"+user.getUserId());  

複製程式碼

解決方案:

由於鄙人當時的學習水平有限,未能很好處理這個問題,如今再來看這個問題,其實很簡單。

當時我的思維侷限於插入資料後不想再次呼叫查詢介面,就直接獲取這個插入的主鍵Id. 因此如果想達到這種效果,最優方案是下面解決方案的第二種方式

 但是其實我們完全可以在插入後再呼叫下其他查詢介面就可以了。

複製程式碼

User user = new User();  
user.setUserName("chenzhou");  
user.setPassword("xxxx");  
user.setComment("測試插入資料返回主鍵功能");  
  
System.out.println("插入前主鍵為:"+user.getUserId());  
userDao.insertAndGetId(user);//插入操作  

User myUser=userDao.findUserByName(user.getName());
System.out.println("插入後主鍵為:"+myUser.getUserId()); 

複製程式碼

不想再次呼叫查詢介面的解決方案

經過查詢網上資料,發現大致有兩種方式。

第一種方式:

在實體類的對映檔案 "*Mapper.xml" 這樣寫:

<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User">
    insert into user(userName,password,comment)
    values(#{userName},#{password},#{comment})
</insert>

Tips:

useGeneratedKeys="true" 表示給主鍵設定自增長
keyProperty="userId"  表示將自增長後的Id賦值給實體類中的userId欄位。
parameterType="com.chenzhou.mybatis.User" 這個屬性指向傳遞的引數實體類

這裡提醒下,<insert></insert> 中沒有resultType屬性,不要亂加。

實體類中uerId 要有getter() and setter(); 方法

由於我在MySQL資料庫中建表時候已經設定了欄位自增長,故最終我選擇了第二種方式。

第二種方式:

同樣在實體類的對映檔案 "*Mapper.xml" 但是要這樣寫:

複製程式碼

    <!-- 插入一個商品 -->
    <insert id="insertProduct" parameterType="domain.model.ProductBean" >
       <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="productId">
          SELECT LAST_INSERT_ID()
      </selectKey>
        INSERT INTO t_product(productName,productDesrcible,merchantId)values(#{productName},#{productDesrcible},#{merchantId});
    </insert>

複製程式碼

Tips: 

<insert></insert> 中沒有resultType屬性,但是<selectKey></selectKey> 標籤是有的。

order="AFTER" 表示先執行插入語句,之後再執行查詢語句。

可被設定為 BEFORE 或 AFTER。

如果設定為 BEFORE,那麼它會首先選擇主鍵,設定 keyProperty 然後執行插入語句。

如果設定為 AFTER,那麼先執行插入語句,然後是 selectKey 元素-這和如 Oracle 資料庫相似,可以在插入語句中嵌入序列呼叫
keyProperty="userId"  表示將自增長後的Id賦值給實體類中的userId欄位。
SELECT LAST_INSERT_ID() 表示MySQL語法中查詢出剛剛插入的記錄自增長Id.

實體類中uerId 要有getter() and setter(); 方法