基本背景
oracle 有 sequence trigger
希望在新增的时候获取到新增这条记录的 id ( oracle 通过 trigger 调取 sequence )

20210203 搞了3个多小时,终于找到一篇我要的文章
https://www.cnblogs.com/tuxiaoer/p/12725777.html

一、实现主键自增

在oracle数据库中,主键并没有办法自动增长,无法使用insert对应的useGeneratedKeys和keyProperty属性自动返回增加的主键。

要实现自增需要修改 ID列为number类型,一下类型作为参考


一、使用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层代码
复制代码

@Overridepublic 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("")传递参数,导致我后面跟着百度的方法怎么都拿不到idint 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了

resultType里面的类型要和 数据库id列的类型,java实体类(TLampMateriel)中的类型一致

Mybatis 插入数据 获取 oracle 自增序列相关推荐

  1. MyBatis框架——mybatis插入数据返回主键(mysql、oracle)

    向数据库中插入数据时,大多数情况都会使用自增列或者UUID做为主键.主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A.B中插入数据(A的主键是 ...

  2. 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...

    java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...

  3. Mybatis插入数据后获取主键的值

    Mybatis插入数据后获取主键的值 1. 所使用的数据库是支持自增的,且主键是自增的 <!-- 支持自增的数据库且主键是自增的:自动将插入后自增id的值赋值给传入的Employee的id--& ...

  4. oracle批量插入报错,[数据库]Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA

    [数据库]Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA 0 2020-08-19 08:00:06 Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA-009 ...

  5. Mybatis 批量插入数据 关于Oracle 批量插入

    问题:用mybaits 批量插入数据到Oracle 数据库的时候, 报错: ORA-00933: SQL 命令未正确结束 / ORA-00933: SQL command not properly e ...

  6. mysql 批量数据导入报错_Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA

    Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA-00933: SQL 命令未正确结束 问题:用mybaits 批量插入数据到Oracle 数据库的时候, 报错:ORA-00933 ...

  7. 最新Mybatis插入数据返回自增主键详细配置

    Mybatis插入数据返回自增主键 Mybatis插入数据以后只会返回影响的数据库行数,如果是插入一条数据成功则返回1,失败返回零,插入多条返回插入成功的数量. 通过注解或者xml配置无法直接返回自增 ...

  8. 使用mybatis插入数据到数据库中,显示插入成功,且没有报错,但是数据库中并没有新插入的数据的原因

    使用mybatis插入数据到数据库中,显示插入成功,且没有报错,但是数据库中并没有数据的原因 没有提交事务,有时没有配置自动提交事务的设置,所以需要手动提交事务,即 sqlSession.commit ...

  9. mybatis插入数据到数据库成功,数据库却没有数据

    mybatis插入数据到数据库成功,数据库却没有数据 错误描述: 解决办法: 错误描述: 编写测试类,显示数据插入成功: 但是去查看数据库中相应表中数据情况,缺发现没有数据! 解决办法: 查看核心配置 ...

  10. Java通过Mybatis实现批量插入数据到Oracle中

    最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式: 结合网上资料,写了个小demo,文章末尾附上demo下载地址 1.新建项目:项目目 ...

最新文章

  1. boost::timer::cpu_timer相关的测试程序
  2. ubuntu自动提醒
  3. ORA-28001: the password has expired解决方法
  4. vsftpd 创建虚拟用户
  5. 确认oracle是否繁忙,Oracle系统繁忙时,快速定位
  6. 3D移动translate3d(CSS3)
  7. ifen.os x pe.dmg天翼云_3.3K屏显纵览天下 11代酷睿横行职场 华硕灵耀X纵横值得选择...
  8. 可视化概念思维导图软件 MindMapper 17 Arena 完美汉化开心版
  9. 线段树扫描线(1---算矩形的总面积)
  10. svchost.exe病毒-任务栏怎么也关闭不掉的搜索框
  11. 柳传志:选人要看“后脑勺”
  12. JAVA导入/导出EXCEL文件,自定义校验,错误回写excel,使用简单快捷
  13. 临界资源的同步与互斥,区分临界资源与临界区,二义性分析
  14. 明厨亮灶监控系统解决方案,看得见的食品安全
  15. surfacepro4黑苹果触屏_GitHub - MLZC/Surface-Pro-4-Sierra: 微软 Surface Pro 4 macOS Sierra 10.12 黑苹果...
  16. Android跳转淘宝商品详情页代码
  17. ORACLE等待事件:read by other session
  18. Android视频直播、点播播放器哪家强?
  19. maching learning入门(六)
  20. 最流行的Java IDE有哪些?

热门文章

  1. pythonsorted降序_【python】 sort、sorted高级排序技巧
  2. C++标准委员会7月科隆会议中投票通过的特性
  3. Windows设置自动开关机
  4. 【Excel文件合并工具】
  5. 100% 解决华硕 Armoury Crate 奥创软件安装及更新问题。解决错误码 502 等问题
  6. android 上运行python脚本,Android上执行python脚本-QPython
  7. ANSYS-SCDM二次开发(遍历获得structure和group下的部件名称)
  8. silklabo哪个公众号有资源_公众号和头条号,做哪个赚钱?
  9. php公众号模板在哪,微信公众号模板哪里找?公众号如何套用模板?
  10. 小福利,excel采用下拉框控件和复选框控件制作图表