MyBatis若是使用useGeneratedKeys去生成自增列會形成不成功,由於官方提供只支持這些數據庫:mybatis generatedkeys,那麼若是要用在oracle和postgresql上,就必須知道它們的自增列是經過序列進行完成的,因此根據這個思路能夠在插入的時候調用序列獲取下一個值,而後再插入,序列的問題不會有併發問題,由於每次操做都必須在同一個session中,每一個session調用序列都是隔離的。那麼能夠經過selectKey來調用序列。html
第一種:java
long saveJob(ScheduleJobDto scheduleJob);
<insert id="saveJob" parameterType="com.common.model.schedule.ScheduleJobDto">
<selectKey resultType="java.lang.Long" order="BEFORE" keyProperty="id" >
select nextval('schedule_job_job_id_seq'::regclass) as id
</selectKey>
insert into schedule_job (id,job_group, bean_name, params, cron_expression, run_status, job_status, job_data, description, revision, create_by, create_time, update_by, update_time, remark, del_flag) values
(#{id}, #{jobGroup}, #{beanName}, #{params}, #{cronExpression}, #{runStatus}, #{jobStatus}, #{jobData}, #{description}, #{revision}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, #{remark}, #{delFlag})
</insert>
第二種:git
long saveJob(ScheduleJobDto scheduleJob); <insert id="saveJob" parameterType="com.common.model.schedule.ScheduleJobDto"> <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="id" > select currval('schedule_job_job_id_seq'::regclass) as id </selectKey> insert into schedule_job (job_group, bean_name, params, cron_expression, run_status, job_status, job_data, description, revision, create_by, create_time, update_by, update_time, remark, del_flag) values (#{jobGroup}, #{beanName}, #{params}, #{cronExpression}, #{runStatus}, #{jobStatus}, #{jobData}, #{description}, #{revision}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, #{remark}, #{delFlag}) </insert>
區別:第一種和第二種的區別在於AFTER和BEFORE,AFTER表示在執行完以後,獲取剛纔序列的值,BEFORE表示插入以前獲取序列的下一個值而後再進行插入,須要注意的是AFTER對應的是currval,BEFORE對應nextval。還有注意的是,在Java方法上不要使用@Param參數執行,只須要在Mapper中寫入parameterType指定列表便可,其實不難發現,selectKey的keyProperty對應的就是Java類的字段。github
其它方法:sql
一、經過select標籤+returning關鍵字來作插入數據庫
二、經過select標籤express
但這些方式在返回值上都要對應,而不能放回影響行數。session