mybatis+postgresql10插入返回主鍵ID


MyBatis如果使用useGeneratedKeys去生成自增列會造成不成功,因為官方提供只支持這些數據庫:mybatis generatedkeys,那么如果要用在oracle和postgresql上,就必須知道它們的自增列是通過序列進行完成的,所以根據這個思路可以在插入的時候調用序列獲取下一個值,然后再插入,序列的問題不會有並發問題,因為每次操作都必須在同一個session中,每個session調用序列都是隔離的。那么可以通過selectKey來調用序列。

第一種:

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>

第二種:

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類的字段。

其它方法:

1、通過select標簽+returning關鍵字來做插入

2、通過select標簽

但這些方式在返回值上都要對應,而不能放回影響行數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM