一、需求说明(本文着重讲述oracle自增主键的实现和插入获取)
插入数据希望能带出id
二、Mysql 自增主键 (自增功能MySQL自带,非自增自己外部设置主键没必要获取,数据库中构件可参考oracle)
<insert id="insertSelective" parameterType="com.netxxx.eoss.dto.AssessDirectReportTaskDto" useGeneratedKeys="true" keyProperty="assessDirectTaskId">
。。。
</insert>
- useGeneratedKeys=“true” 自增主键需要写true,默认false
- keyProperty=“assessDirectTaskId” assessDirectTaskId是对象的id,不是数据库字段
三、oracle 实现自增和带出id
1、自增实现(外部可使用雪花算法等)
- 创建序列
Oracle 序列(sequence)用于序号生成,每次取的时候它会自动按照步长值增加,sequence与表没有直接关系。
create sequence SEQ_ADTI_ID
minvalue 0
maxvalue 99999999999999999
/
- 插入数据
-- 示例
insert into xxxTableName (t_id,t_name) values (SEQ_ADTI_ID.NEXTVAL,'张三')
2、 返回id
<insert id="insertSelective" parameterType="com.netxxx.eoss.dto.AssessDirectReportTaskDto" useGeneratedKeys="false" keyProperty="assessDirectTaskId">
<selectKey resultType="java.math.BigDecimal" keyProperty="assessDirectTaskId" order="BEFORE" >
select SEQ_ADTI_ID.NEXTVAL as assessDirectTaskId from dual
</selectKey>
insert into ASSESS_DIRECT_REPORT_TASK
<trim prefix="(" suffix=")" suffixOverrides=",">
ASSESS_DIRECT_TASK_ID,
<if test="reportYear != null">
REPORT_YEAR,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
#{assessDirectTaskId},
<if test="reportYear != null">
#{reportYear,jdbcType=DECIMAL},
</if>
</trim>
</insert>
- useGeneratedKeys=“false” 设置为false,这个是针对自增主键的
- resultType=“java.math.BigDecimal” 返回主键的类型,对应对象中的属性
- order=“BEFORE” 写入之前查,这个尽量大写
- dual Oracle提供的最小的工作表,只有一行一列,具有某些特殊功用。
四、知识补充
- sequence
create sequence seq_test2
minvalue 1
maxvalue 21
start with 1
increment by 1
cache 20
cycle
order;
minValue: 指定序列最小值。 maxValue: 指定序列最大值。 increment by: 指定序列增长步长,可以为正(升序)、负整数(降序),但不能为0。 start with:指定序列起始数,默认为序列最小值。 noMaxValue:无最大值(实际为10^27或-1),默认。 noMinValue:无最小值(实际为1或-10^26),默认。 cycle:指定序列达到最大值或最小值后继续从头开始生成。 noCycle:不循环生成,默认。 cache:指定数据库内存中预分配的序列值个数,以便快速获取,最小cache值为2。如果系统关闭或者其它情况将会导致序列不连续,也可以设置为nocache。 noCache:不指定缓存数,默认缓存20。 order:指定order条件保证序列按请求顺序生成。 noOrder:不保证序列按请求顺序生成。
参考 传送门