IBatis添加信息返當前添加對象ID


 
在Ibatis中,insert()的返回值為一個Object的主鍵,其實這個Object的主鍵是這樣的來的:如果在bean的xml文件中設置了插入的keyProperty,則insert()方法返回的就是這個主鍵的值。
例如,所以我們想要在插入時想要插入一個sequence值到數據庫的某個字段(當然,這個字段的類型為Number的),我們可以在xml文件中做如下配置(以下為在DB服務器是Oracle的前提下):
 
<insert id="insertUser" parameterClass="po.User">
     <selectKey resultClass="int" keyProperty="userId" >
         SELECT user_account_s.nextval AS userid FROM dual
     </selectKey>
  insert into user_account(userid, username, password, groupname)
          values(#userId#, #userName#, #password#, #groupName#)
 </insert>
 
此時插入到數據庫中的某表userid字段的值即使sequence的值。但要注意的是,配置中出現的紅色加粗字體一定要對應到bean中的屬性字段,也即要與bean中的屬性字段名稱相同,否則則會拋出異常。
如果是SQL SERVER數據庫,則進行如下配置:
<insert id="insertUser" parameterClass="po.User">
    insert into user_account(userid, username, password, groupname)
          values(#userId#, #userName#, #password#, #groupName#)
     <selectKey resultClass="int" keyProperty="userId" >
         SELECT @@IDENTITY as userid
     </selectKey>
 </insert>
 
如果是MYSQL 數據庫,則進行如下配置:

<insert id="MS-SYS-SEQ-INSERT">

     <![CDATA[
         insert into sys_seq(name) values (#name#)
     ]]>
     <selectKey resultClass="long" keyProperty="id">
         <![CDATA[SELECT LAST_INSERT_ID() AS ID ]]>
     </selectKey>
    </insert>
 
上述是從其它地方copy過來的,這幾天被ibatis的插入數據的一些問題困擾了許久,現在總算是對ibatis此方面有所了解掌握了。自己能力還是太差了,學習進度太慢。我用的是ibatis,oracle10數據庫。
映射xml 文件中配置為:

<insert id="addStudent" parameterClass="Student">
<selectKey resultClass="int" keyProperty="id">
select seq_student.
nextval as value from dual
<!-- 這里需要說明一下不同的數據庫主鍵的生成,對各自的數據庫有不同的方式: -->
<!-- mysql:SELECT LAST_INSERT_ID() AS VALUE -->
<!-- mssql:select @@IDENTITY as value -->
<!-- oracle:SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL -->
<!-- 還有一點需要注意的是不同的數據庫生產商生成主鍵的方式不一樣,有些是預先生成 (pre-generate)主鍵的,如Oracle和PostgreSQL。
有些是事后生成(post-generate)主鍵的,如MySQL和SQL Server 所以如果是Oracle數據庫,則需要將selectKey寫在insert之前 -->
</selectKey>
insert into tbl_student(id,name,birth,score) values (#id#,#name#,#birth#,#score#)
</insert>

selectKey元素部分其實既可以放在insert語句之前也是可以放在其后的,放在之前的話就用nextval,放在之后的話就用currval。如果放在之前用currval就會報錯提示要先進行nextval操作再currval。
由於我已經在創建數據表時新建了sequences,當我將selectKey放在insert語句之前時,發現每次執行插入數據操作,主鍵id都會自增兩次,而increment by也必須為1以上。所以有點納悶,放在之前豈不是沒什么用,為什么大家都還放在之前?原來我用powerdesigner建表及序列時憶自動地新建了一個觸發器,在每次執行插入操作之前都會自動將序列值加1……我只能將其放在之后使用currval,這樣就保證了主鍵每次自動增1,並且可以正常地返回插入數據記錄的主鍵值。
我的映射文件最后配置如下:

<insert id="addStudent" parameterClass="Student">
insert into tbl_student(id,name,birth,score) values (#id#,#name#,#birth#,#score#)
<selectKey resultClass="int" keyProperty="id">
select seq_student.currval as value from dual
</selectKey>

</insert>

 

轉自 http://bujingyun23.blog.163.com/blog/static/18131024320137240417135/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM