mybatis + (oracle)实现主键自增 + 插入数据并返回主键
一、实现主键自增
在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)中的类型一致