在數據庫操作中,當我們插入數據時往往需要當前插入數據的主鍵id,初學時比較笨,在插入之後再做一遍查詢來獲取id,這樣會出現很多的問題。其實java提供了useGeneratedKeys方法,可以直接返回id,直接上代碼:
正常插入語句是這樣的
<insert id="addTeacher" parameterType="com.kk.demo.bean.Teacher">
insert into teacher(tsex,tbirth) values(#{tsex},#{tbirth})
</insert>
使用MySql和SQL server,我們只需要返回id時只需要加入useGeneratedKeys 和keyProperty即可,因爲這兩個數據庫支持auto-generated key field(即自增主鍵)
<insert id="addTeacher" useGeneratedKeys="true" keyProperty="tid" parameterType="com.kk.demo.bean.Teacher">
insert into teacher(tsex,tbirth) values(#{tsex},#{tbirth})
</insert>
useGeneratedKeys:設置是否使用JDBC的getGenereatedKeys方法獲取主鍵並賦值到keyProperty設置的領域模型屬性中。MySql和SQLServer執行auto-generated key field,因此當數據庫設置好自增長主鍵後,可通過JDBC的getGeneratedKeys方法獲取。但像Oralce等不支持auto-generated key field的數據庫就不能用這種方法獲取主鍵了
keyProperty:用於設置getGeneratedKeys方法或selectKey子元素返回值將賦值到領域模型的哪個屬性中,tid 是表中的自增主鍵
問題:getId返回值爲空
問題代碼:
//DAO
long add(@Param("item") Item item);
//mapper.xml
<insert id="add" useGeneratedKeys="true" keyProperty="itemId">
insert into item(item_price,item_sales) VALUES (#{itemPrice},#{itemSales})
</insert>
使用useGeneratedKeys生成主鍵時,不能在DAO層使用@Param註解傳遞參數,否則無法獲取主鍵
注意:不使用@Param註解時,參數只能有一個,並且是Javabean。在SQL語句裏可以引用JavaBean的屬性,而且只能引用JavaBean的屬性。
正確代碼:
//DAO
long add(Item item);
//mapper.xml
<insert id="add" useGeneratedKeys="true" keyProperty="itemId" parameterType="com.kk.springboot.bean.Item">
insert into item(item_price,item_sales) VALUES (#{itemPrice},#{itemSales})
</insert>