160613、MyBatis insert操作返回主键
在使用MyBatis做持久層時,insert語句默認是不返回記錄的主鍵值,而是返回插入的記錄條數(shù);如果業(yè)務層需要得到記錄的主鍵時,可以通過配置的方式來完成這個功能,針對Sequence主鍵而言,在執(zhí)行insert sql前必須指定一個主鍵值給要插入的記錄,如Oracle、DB2,可以采用如下配置方式:
<insert id="add" parameterType="vo.Category">
<selectKey resultType="Java.lang.Short" order="BEFORE" keyProperty="id">
SELECT SEQ_TEST.NEXTVAL?FROM DUAL
</selectKey>
insert into category (name_zh, parent_id,
show_order, delete_status, description
)
values (#{nameZh,jdbcType=VARCHAR},
#{parentId,jdbcType=SMALLINT},
#{showOrder,jdbcType=SMALLINT},
#{deleteStatus,jdbcType=BIT},
#{description,jdbcType=VARCHAR}
)
</insert>
?針對自增主鍵的表,在插入時不需要主鍵,而是在插入過程自動獲取一個自增的主鍵,比如MySQL,可以采用如下兩種配置方式:
<insert id="add" parameterType="vo.Category" useGeneratedKeys="true" keyProperty="id">
insert into category (name_zh, parent_id,
show_order, delete_status, description
)
values (#{nameZh,jdbcType=VARCHAR},
#{parentId,jdbcType=SMALLINT},
#{showOrder,jdbcType=SMALLINT},
#{deleteStatus,jdbcType=BIT},
#{description,jdbcType=VARCHAR}
)
</insert>
?
或
?
<insert id="add" parameterType="vo.Category">
<selectKey resultType="java.lang.Short" order="AFTER" keyProperty="id">
SELECT LAST_INSERT_ID() AS id
</selectKey>
insert into category (name_zh, parent_id,
show_order, delete_status, description
)
values (#{nameZh,jdbcType=VARCHAR},
#{parentId,jdbcType=SMALLINT},
#{showOrder,jdbcType=SMALLINT},
#{deleteStatus,jdbcType=BIT},
#{description,jdbcType=VARCHAR}
)
</insert>
?
在插入操作完成之后,參數(shù)category的id屬性就已經(jīng)被賦值了
?
如果數(shù)據(jù)庫表的主鍵不是自增的類型,那么就需要應用層生成主鍵的方式··········這個就不多說了,需要的朋友,可以留言交流··
?
-----------------------------------------
?
?
下面是針對Oracle的寫法,Oracle沒有autoincrement,而是用觸發(fā)器實現(xiàn)的 CURRVAL是在觸發(fā)器中定義的.
<insert id="insert" parameterClass="ProFeeKindObject">
????? <![CDATA[
???????? INSERT INTO t_pro_feeKind (KINDID,kindName,kindType,enable)
???????? VALUES (seq_t_pro_feekind_id.nextval,#kindName#,#kindType#,#enable#)
??????? ]]>
??????? <selectKey resultClass="java.lang.Integer" keyProperty="kindId" >
??????? SELECT seq_t_pro_feekind_id.CURRVAL AS kindId FROM DUAL
??????? </selectKey>????
</insert>
<!-- 下面是針對MySQL的寫法 -->
<!--
?? <selectKey resultClass="int" keyProperty="id" >
?? SELECT @@IDENTITY AS id
?? </selectKey>
-->
其他參考代碼:
持久化某個實體對象(如保存一個對象)時,如果我們不用selectKey,那么我們不會立刻得到實體對象的Id屬性的,也就是數(shù)據(jù)表主鍵
Java代碼
Permission permission = new Permission();?
permission.set...?
permmisonDao.createPermission(permission);?
assertNull(permission);?
Permission permission = new Permission();
permission.set...
permmisonDao.createPermission(permission);
assertNull(permission);
selectKey元素與其在父元素中的位置有關
<insert id="addPermission" parameterClass="Permission">????
???? <selectKey resultClass="int" keyProperty="permissionId">????
???????? SELECT SEQ_P_PERMISSION.NEXTVAL FROM DUAL?????
???? </selectKey>????
???? INSERT INTO P_PERMISSION (?
???????? PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL?
???? ) VALUES (?
???????? #permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#?
???? )?????
</insert>
<insert id="addPermission" parameterClass="Permission">?
<selectKey resultClass="int" keyProperty="permissionId">?
SELECT SEQ_P_PERMISSION.NEXTVAL FROM DUAL???
</selectKey>?
INSERT INTO P_PERMISSION (
PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL
) VALUES (
#permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#
)???
</insert>
Mysql、SQLServer在后
Xml代碼
<insert id="addPermission" parameterClass="Permission">??????
INSERT INTO P_PERMISSION (?
???? PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL?
) VALUES (?
???? #permissionId#, #permissionInfo#, #permissionName#, #permiss
ionEnName#, #url#?
)?
<selectKey resultClass="int" keyProperty="permissionId">????
???? SELECT LAST_INSERT_ID()?????
</selectKey>?
</insert>
<insert id="addPermission" parameterClass="Permission">????
INSERT INTO P_PERMISSION (
PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL
) VALUES (
#permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#
)
<selectKey resultClass="int" keyProperty="permissionId">?
SELECT LAST_INSERT_ID()???
</selectKey>
</insert>
像上面這樣書寫,與selectKey的位置聯(lián)系得太緊密了,iBatis的sqlMap配置文件的selectKey元素有個type屬性,可以指定pre或者post表示前生成還是后生成。
對于Oracle,表示為
Xml代碼
<insert id="addPermission" parameterClass="Permission">????
??? <selectKey resultClass="int" keyProperty="permissionId" type="pre">????
??????? SELECT SEQ_P_PERMISSION.NEXTVAL FROM DUAL?????
??? </selectKey>????
??? INSERT INTO P_PERMISSION (?
??????? PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL?
??? ) VALUES (?
??????? #permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#?
??? )?????
</insert>???
<insert id="addPermission" parameterClass="Permission">?
<selectKey resultClass="int" keyProperty="permissionId" type="pre">?
SELECT SEQ_P_PERMISSION.NEXTVAL FROM DUAL???
</selectKey>?
INSERT INTO P_PERMISSION (
PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL
) VALUES (
#permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#
)???
</insert>
Mysql、SQLServer等表示為:
Xml代碼
<insert id="addPermission" parameterClass="Permission">????
???? <selectKey resultClass="int" keyProperty="permissionId" type="post">????
???????? SELECT LAST_INSERT_ID()?
???? </selectKey>????
???? INSERT INTO P_PERMISSION (?
???????? PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL?
???? ) VALUES (?
???????? #permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#?
???? )?????
</insert>
轉(zhuǎn)載于:https://www.cnblogs.com/zrbfree/p/5571137.html
總結(jié)
以上是生活随笔為你收集整理的160613、MyBatis insert操作返回主键的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。