Oralce的自增主键创建
oracle没有mysql那样可以有自增主键,需要自己通过创建序列才能实现自增。
1.使用序列实现主键自增
/*创建自增序列*/
CREATE SEQUENCE CRAFT_SEQ_ID
MINVALUE 1 --最小值
NOMAXVALUE --不设置最大值
START WITH 1 --从1开始计数
INCREMENT BY 1 --每次加1
NOCYCLE --一直累加,不循环
NOCACHE; --不建缓冲区
CRAFT_SEQ_ID:创建序列名称
插入时,直接使用CRAFT_SEQ_ID.nextval作为主键即可。
例:
insert into CRAFT(id,CRAFT_NAME) values(CRAFT_SEQ_ID.nextval,'test');
2.通过序列+触发器实现自增序列
首先还是创建序列
/*创建自增序列*/
CREATE SEQUENCE CRAFT_SEQ_ID
MINVALUE 1 --最小值
NOMAXVALUE --不设置最大值
START WITH 1 --从1开始计数
INCREMENT BY 1 --每次加1
NOCYCLE --一直累加,不循环
NOCACHE; --不建缓冲区
其次,给表添加触发器。
create trigger CRAFT_TRIGGER
before insert
on CRAFT
for each row
begin
select CRAFT_SEQ_ID.nextval into :new.CRAFT_ID from dual;
end;
CRAFT_TRIGGER:触发器名称
CRAFT:表名称
CRAFT_SEQ_ID:序列名称
CRAFT_ID :表主键
序列+触发器插入时,直接给定插入即可。
例:
insert into CRAFT(CRAFT_NAME) values('test');
Mybatis中插入数据,并获取自增主键值
Mysql
Mysql中,在主键列上设置AUTO_INCREMENT即可实现主键自增长。
在Mapper文件中设置useGeneratedKeys和keyProperty两个属性,其中keyProperty值为JAVA对象的属性名。
例:
<insert id="saveCraft" parameterType="Craft" useGeneratedKeys="true" keyProperty="craftId">
insert into CRAFT (CRAFT_ID, CRAFT_NAME) values(#{craftId}, #{craftName})
</insert>
Service中,获取插入的实体类的id就是生成的主键值。
例:
public Integer addCraft(Craft craft) {
Integer row = craftMapper.saveCraft(craft);
return craft.getCraftId();
}
row :保存数据影响的行数
craft.getCraftId():保存数据生成的自增主键值
Oracle
Oracle相比较Mysql,需创建序列,通过使用序列来完成自增主键,在Mapper中需要使用序列来获取生成的主键。
mapper:
<insert id="saveCraft" parameterType="Craft">
<selectKey keyProperty="craftId" resultType="Integer" order="BEFORE">
select CRAFT_SEQ_ID.nextval from dual
</selectKey>
insert into CRAFT (CRAFT_ID, CRAFT_NAME) values(#{craftId}, #{craftName})
</insert>
keyProperty:对应实体类主键
CRAFT_SEQ_ID:之前建立的序列id
service:
public Integer addCraft(Craft craft) {
Integer row = craftMapper.saveCraft(craft);
return craft.getCraftId();
}