一、实现主键自增
在oracle数据库中,主键并没有办法自动增长,无法使用insert对应的useGeneratedKeys和keyProperty属性自动返回增加的主键。
要实现自增需要修改 ID列为number类型,一下类型作为参考
oracle实现主键方式:原文链接:https://www.cnblogs.com/uzxin/p/11930347.html
一、使用selectKey标签
<insert id="addLoginLog" parameterType="map" >
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select nvl(max(id),0)+1 from ap_loginlog
</selectKey>
insert into ap_loginlog(ID,MEMBER_ID) values(#{id},#{memberId})
</insert>
keyProperty是指vo类中的主键属性名称,resultType是指vo类中的主键属性类型,order有两个属性,一个是AFTER是指限制性插入语句,一个是BEFORE是指先执行selectKey标签内的语句:select nvl(max(主键名),0)+1 from 表名
二、使用序列
首先创建序列
CREATE SEQUENCE loginlog_squence //序列名
INCREMENT BY 1 //每次增长多少
NOMAXVALUE //MAXVALUE:最大值;NOMAXVALUE:没有最大值
NOCYCLE //序列达到最大值后是否循环;CYCLE:循环;NOCYCLE:不循环
CACHE 10; //CACHE/NOCACHE:是否需要缓存;缓存生成多少个序列值
查看创建的序列
然后再sql语句中插入
<insert id="addLoginLog" parameterType="map" >
insert into ap_loginlog(ID,MEMBER_ID) values(loginlog_squence.nextval,#{memberId})
</insert>
三、使用序列加触发器
create or replace trigger loginlog_trigger
before insert on ap_loginlog
for each row
begin
select loginlog_sequence.nextval into :new.id from dual;
end loginlog_trigger;
然后再sql语句中插入
<insert id="addLoginLog" parameterType="map" >
insert into ap_loginlog(MEMBER_ID) values(#{memberId})
</insert>
以上就是实现主键自增,下面说一下插入数据并返回主键 ,我踩坑的原因是mapper层使用了@Param() 导致实体对象一直拿不到生成的主键
0、实体类
import lombok.Data;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@Data
@TableName("你对应的表名")
public class TLampMateriel {
@TableField(exist = false)
private String sysTableName = "T_TABLENAME"; //表名
/**
* 主键id
*/
@TableId(value = "ID", type = IdType.AUTO) //AUTO主键自增,UUID随机,UUID要使用string类型
private Integer id;
/**
* 分类名称
*/
@TableField("NAME")
private String name;
}
1、service层代码
@Override
public Boolean insert() {
TLampMateriel tLampMateriel = new TLampMateriel(); //实体对象,一般
tLampMateriel.setName("张三");
int i = this.baseMapper.insertMateriel(tLampMateriel);
System.out.println(tLampMateriel.getId());
return i > 0 ;
}
2、mapper层代码
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fsgis.common.base.mapper.BaseMapper;
import com.fsgis.one.map.lamp.model.entity.TLampMateriel;
import com.fsgis.one.map.lamp.model.vo.TLampMaterielVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface TLampMaterielMapper extends BaseMapper<TLampMateriel> {
//添加数据,我就是在这里被坑的,我是用了@Param("")传递参数,导致我后面跟着百度的方法怎么都拿不到id
int insertMateriel(@Param("tLampMateriel") TLampMateriel tLampMateriel);
}
3、mapper.xml
踩坑之前在数据库建序列 SEQ_USER_ID
踩坑的代码:
<insert id="insertMateriel" parameterType="...entity.TLampMateriel"> //参数这儿自己实体类的包
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select SEQ_USER_ID.nextval from dual
</selectKey>
insert into T_LAMP_MATERIEL (ID,NAME)
values (#{id}, #{tLampMateriel.name})
</insert>
正确的:
<insert id="insertMateriel" parameterType="...entity.TLampMateriel">
<selectKey keyProperty="tLampMateriel.id" resultType="int" order="BEFORE">
select SEQ_USER_ID.nextval from dual
</selectKey>
insert into T_LAMP_MATERIEL (ID,NAME)
values (#{tLampMateriel.id}, #{tLampMateriel.name})
</insert>
keyProperty这里要使用 对象.id,这样一改我就拿到id了
<selectKey keyProperty="id" resultType="int" order="BEFORE">
resultType里面的类型要和 数据库id列的类型,java实体类(TLampMateriel)中的类型一致