1. 程式人生 > >【MyBatis】——自增主鍵與非自增主鍵返回

【MyBatis】——自增主鍵與非自增主鍵返回

  mysql自增主鍵,執行insert提交之前自動生成一個自增主鍵。當時一直沒有想為什麼要返回主鍵,也就是返回就返回了吧,總是有用的,確實,返回來有可能會作為下一次查詢的依據,或者下一個插入的外來鍵的憑證,總之,先返回來再說……

實現思想是醬紫的:通過mysql函式獲取到剛插入記錄的自增主鍵:LAST_INSERT_ID(),但是是在insert之後呼叫此函式。

mybatis中,只有新增使用者會涉及到返回主鍵,這裡會有兩種主鍵,一種是int型在資料庫設定為自增,一種是uuid的形式。

  1. <insertid="insertUser"parameterType="cn.itcast.mybatis.po.User"
    >
  2.         <!-- 將插入資料的主鍵返回,返回到user物件中  
  3.             SELECT LAST_INSERT_ID():得到剛insert進去記錄的主鍵值,只適用於自增主鍵  
  4.             keyProperty:將查詢到主鍵值設定到parameterType指定的物件的那個 屬性 
  5.         orderselectKey的執行順序,是相對與insert語句來說,由於mysql的自增原理執行完insert語句之後才將主鍵生成,所以這裡selectKey的執行順序為after
  6.             resultType:指定SELECT LAST_INSERT_ID()的結果型別  
  7.          -->
  8.         <selectKeykeyProperty="id"order="AFTER"resultType="java.lang.Integer">
  9.             SELECT LAST_INSERT_ID()   
  10.         </selectKey>
  11.         insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address});  
  12.  </insert>

自增主鍵方式執行過程是首先將記錄插入資料庫,前提是資料庫已經設定了

id是自動遞增的,之後通過mysql函式得到剛insert進去記錄的主鍵。


而另外一種方式uuid的形式是與自增逐漸的執行過程是相反的,它的執行過程是:首先通過uuid()得到主鍵,然後將主鍵設定到user物件的id屬性中,之後在insert執行時,再從user物件中取出id屬性值。

  1. <insertid="insertUser"parameterType="cn.itcast.mybatis.po.User">
  2.          <!--   
  3.             使用mysql的uuid()生成主鍵  
  4.             執行過程:首先通過uuid()得到主鍵,將主鍵設定到user物件的id屬性中  
  5.             其次,在insert執行時,從user物件中取出id屬性值  
  6.          -->
  7.          <selectKeykeyProperty="id"order="AFTER"resultType="java.lang.String">
  8.             SELECT uuid()     
  9.         </selectKey>
  10. insert into user(id,username,birthday,sex,address)

           values(#{id},#{username},#{birthday},#{sex},#{address})  
  11. </insert>

這種方式就是所謂的非自增主鍵返回,需要修改表中id的欄位型別為string

二者除了執行過程相反之外,還有一點不同就是:自增主鍵中的insert sql語句主鍵自動生成,在insert語句中不需要寫id欄位,在非自增主鍵時,insert語句需要寫id欄位。

mysql中是這樣實現的,那麼在oracle中使用不同的函式和order標識,如下:

  1. <insertid="insertUser"parameterType="cn.itcast.mybatis.po.User">
  2. <selectKeykeyProperty="id"order="BEFORE"resultType="java.lang.String">
  3.         SELECT 序列名.nextval()  
  4. </selectKey>
  5. insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address})  
  6. </insert>