問題:mybatis會自動生成一個insert方法如(用的是MySQL數據庫):
<insert id="insert" parameterType="cn.hnne.iclt.model.Task" >
<selectKey resultType="java.lang.Integer" keyProperty="ictl_otaid" order="BEFORE" >
SELECT LAST_INSERT_ID() AS ID
</selectKey>
insert into .....)
values (...)
</insert>
但是直接調用此方法,在記錄插入之後在去getTaskID(),得到的是null或者0。
在網上查了很多資料都沒有真正解決方案,沒有寫到實處的,現在寫下自己總結分享一下。
先分析原理再給出解決辦法
insert這幾個字段:resultType是查詢進行select映射的時候返回類型。其中配置文件中的parameterType是可以不配置的,mybatis會自動傳入的。這兩個不是重點。
selectKey是返回主鍵,在Action獲得主鍵就是通過get方法就可以拿到task.getTaskID(),但是有時自動生成的拿不到;
解決:1、裏面的keyProperty="otaid"的字段與實體(model)的屬性對應,這是mybatis的映射機制。
2、SELECT LAST_INSERT_ID() AS ID,不是數據庫的屬性字段名,同樣要給model中的實體屬性名。
3、 Order="BEFORE" 如果 是Before那個拿到的是插入前的主鍵,那麼就是初始值null或者是0。
那麼把它設置after,那就是拿到插入後自動增長的主鍵值。
下面是修改後的Mapper.xml的代碼。
<insert id="insert" parameterType="cn.hnne.iclt.model.Task" >
<selectKey resultType="int" keyProperty="otaid"order="AFTER" >
SELECT LAST_INSERT_ID() AS otaid
</selectKey>
insert into .....
</insert>