Mybatis 插入数据 获取 oracle 自增序列
基本背景
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 自增序列相关推荐
- MyBatis框架——mybatis插入数据返回主键(mysql、oracle)
向数据库中插入数据时,大多数情况都会使用自增列或者UUID做为主键.主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A.B中插入数据(A的主键是 ...
- 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...
java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...
- Mybatis插入数据后获取主键的值
Mybatis插入数据后获取主键的值 1. 所使用的数据库是支持自增的,且主键是自增的 <!-- 支持自增的数据库且主键是自增的:自动将插入后自增id的值赋值给传入的Employee的id--& ...
- oracle批量插入报错,[数据库]Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA
[数据库]Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA 0 2020-08-19 08:00:06 Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA-009 ...
- Mybatis 批量插入数据 关于Oracle 批量插入
问题:用mybaits 批量插入数据到Oracle 数据库的时候, 报错: ORA-00933: SQL 命令未正确结束 / ORA-00933: SQL command not properly e ...
- mysql 批量数据导入报错_Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA
Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA-00933: SQL 命令未正确结束 问题:用mybaits 批量插入数据到Oracle 数据库的时候, 报错:ORA-00933 ...
- 最新Mybatis插入数据返回自增主键详细配置
Mybatis插入数据返回自增主键 Mybatis插入数据以后只会返回影响的数据库行数,如果是插入一条数据成功则返回1,失败返回零,插入多条返回插入成功的数量. 通过注解或者xml配置无法直接返回自增 ...
- 使用mybatis插入数据到数据库中,显示插入成功,且没有报错,但是数据库中并没有新插入的数据的原因
使用mybatis插入数据到数据库中,显示插入成功,且没有报错,但是数据库中并没有数据的原因 没有提交事务,有时没有配置自动提交事务的设置,所以需要手动提交事务,即 sqlSession.commit ...
- mybatis插入数据到数据库成功,数据库却没有数据
mybatis插入数据到数据库成功,数据库却没有数据 错误描述: 解决办法: 错误描述: 编写测试类,显示数据插入成功: 但是去查看数据库中相应表中数据情况,缺发现没有数据! 解决办法: 查看核心配置 ...
- Java通过Mybatis实现批量插入数据到Oracle中
最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式: 结合网上资料,写了个小demo,文章末尾附上demo下载地址 1.新建项目:项目目 ...
最新文章
- boost::timer::cpu_timer相关的测试程序
- ubuntu自动提醒
- ORA-28001: the password has expired解决方法
- vsftpd 创建虚拟用户
- 确认oracle是否繁忙,Oracle系统繁忙时,快速定位
- 3D移动translate3d(CSS3)
- ifen.os x pe.dmg天翼云_3.3K屏显纵览天下 11代酷睿横行职场 华硕灵耀X纵横值得选择...
- 可视化概念思维导图软件 MindMapper 17 Arena 完美汉化开心版
- 线段树扫描线(1---算矩形的总面积)
- svchost.exe病毒-任务栏怎么也关闭不掉的搜索框
- 柳传志:选人要看“后脑勺”
- JAVA导入/导出EXCEL文件,自定义校验,错误回写excel,使用简单快捷
- 临界资源的同步与互斥,区分临界资源与临界区,二义性分析
- 明厨亮灶监控系统解决方案,看得见的食品安全
- surfacepro4黑苹果触屏_GitHub - MLZC/Surface-Pro-4-Sierra: 微软 Surface Pro 4 macOS Sierra 10.12 黑苹果...
- Android跳转淘宝商品详情页代码
- ORACLE等待事件:read by other session
- Android视频直播、点播播放器哪家强?
- maching learning入门(六)
- 最流行的Java IDE有哪些?
热门文章
- pythonsorted降序_【python】 sort、sorted高级排序技巧
- C++标准委员会7月科隆会议中投票通过的特性
- Windows设置自动开关机
- 【Excel文件合并工具】
- 100% 解决华硕 Armoury Crate 奥创软件安装及更新问题。解决错误码 502 等问题
- android 上运行python脚本,Android上执行python脚本-QPython
- ANSYS-SCDM二次开发(遍历获得structure和group下的部件名称)
- silklabo哪个公众号有资源_公众号和头条号,做哪个赚钱?
- php公众号模板在哪,微信公众号模板哪里找?公众号如何套用模板?
- 小福利,excel采用下拉框控件和复选框控件制作图表