有時(shí)候新增一條數(shù)據(jù)炫惩,知道新增成功即可,但是有時(shí)候阿浓,需要這條新增數(shù)據(jù)的主鍵他嚷,以便邏輯使用,再將其查詢出來明顯不符合要求芭毙,效率也變低了筋蓖。這時(shí)候,通過一些設(shè)置退敦,mybatis可以將insert的數(shù)據(jù)的主鍵返回粘咖,直接拿到新增數(shù)據(jù)的主鍵,以便后續(xù)使用侈百。
這里有兩個(gè)簡單的示例:
<!-- 插入雇員 -->
<insert id="insertEmp" parameterType="com.howick.pojo.Emp" >
insert into emp (empno,ename,job) values(seq_emp.nextval,#{ename},#{job})
<!--
order="AFTER"表示在序列獲取到nextval之后瓮下,將當(dāng)前的序列值保存到Emp對象的empno屬性中
-->
<selectKey keyProperty="empno" order="AFTER" resultType="int">
select seq_emp.currval from dual
</selectKey>
</insert>
在上面的示例中,selectKey 元素將會首先運(yùn)行钝域,Author 的 id 會被設(shè)置讽坏,然后插入語句會被調(diào)用。這給你了一個(gè)和數(shù)據(jù)庫中來處理自動(dòng)生成的主鍵類似的行為例证,避免了使 Java 代碼變得復(fù)雜路呜。
<mapper namespace="com.dao.EmployeeDao">
<insert id="insert">
<selectKey order="BEFORE" keyColumn="employeeId,employeeGender" keyProperty="employeeId,employeeGender" resultType="com.entity.Employee">
select employee_id employeeId,employee_gender employeeGender from employee where employee_id=13
</selectKey>
insert into subtable(employee_id,employee_name,employee_gender) values (#{employeeId},"mdzz",#{employeeGender})
</insert>
</mapper>
keyColumn是要和select語句中的表名相對應(yīng)的實(shí)體類的字段對應(yīng)的,但同時(shí)他也要和select語句中的列名對應(yīng)织咧,因此要取別名一致胀葱。
keyProperty是和insert語句中的values內(nèi)的參數(shù)一致,也就是和insert語句中的表的對應(yīng)實(shí)體類的字段一致笙蒙,才可以通過反射完成
屬性 | 描述 |
---|---|
keyProperty | selectKey 語句結(jié)果應(yīng)該被設(shè)置的目標(biāo)屬性巡社。 如果希望得到多個(gè)生成的列,也可以是逗號分隔的屬性名稱列表手趣。 |
keyColumn | 匹配屬性的返回結(jié)果集中的列名稱晌该。 如果希望得到多個(gè)生成的列,也可以是逗號分隔的屬性名稱列表绿渣。 |
resultType | 結(jié)果的類型朝群。MyBatis 通常可以推算出來中符,但是為了更加確定寫上也不會有什么問題姜胖。 MyBatis 允許任何簡單類型用作主鍵的類型,包括字符串淀散。 如果希望作用于多個(gè)生成的列右莱,則可以使用一個(gè)包含期望屬性的 Object 或一個(gè) Map蚜锨。 |
order | 這可以被設(shè)置為 BEFORE 或 AFTER。 如果設(shè)置為 BEFORE慢蜓,那么它會首先選擇主鍵亚再,設(shè)置 keyProperty 然后執(zhí)行插入語句。 如果設(shè)置為 AFTER晨抡,那么先執(zhí)行插入語句氛悬,然后是 selectKey 元素 - 這和像 Oracle 的數(shù)據(jù)庫相似,在插入語句內(nèi)部可能有嵌入索引調(diào)用耘柱。 |
statementType | 與前面相同如捅,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 語句的映射類型调煎,分別代表 PreparedStatement 和 CallableStatement 類型镜遣。 |