热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MyBatis之useGenerateKeys,selectKey,Oracle批量插入

原标题:MyBatis之useGenerateKeys,selectKey,Oracle批量插入需求:使用MyBatis往MySQL数据库中插入一条

原标题:MyBatis之useGenerateKeys,selectKey,Oracle批量插入

需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值。

方法:在mapper中指定keyProperty属性,示例如下:


insertintouser(userName,password,comment)
values(#{userName},#{password},#{comment})

注意:此处可能会有

如果在的右边尖括号之后有空格,在启动时可能会报:元素类型 "insert" 必须后跟属性规范 ">" 或 "/>"并且,在作新增操作时会一直增不进去而报SQL语法错误,碰到这类问题就把标签整体在敲一边就可以了

如上所示,我们在insert中指定了keyProperty="userId",其中userId代表插入的U文章来源地址51433.htmlser对象的主键属性

User.java

publicclassUser{
privateintuserId;
privateStringuserName;
privateStringpassword;
privateStringcommen文章来源站点https://www.yii666.com/t;
//setterandgetter
}

UserDao.java

publicinterfaceUserDao{
publicintinsertAndGetId(Useruser);
}

测试:

Java代码

Useruser=newUser();
user.setUserName("chenzhou");
user.setPassword("xxxx");
user.setComment("测试插入数据返回主键功能");
System.out.println("插入前主键为:"+user.getUserId());
userDao.insertA文章来源地址51433.htmlndGetId(user);//插入操作
System.out.println("插入后主键为:"+user.getUserId());

输出:


  1. 插入前主键为:0

  2. 插入后主键为:15

查询数据库:

如上所示,刚刚插入的记录主键id为15

总结:用了这个useGenerateKeys="true"后,不用再在写一句关于select的SQL(降低数据库的压力)而直接能够得到刚刚插进去的那个主键,但是——这个属性只能用在主键能自增长的数据库里面比如MySQL可以用,但是oracle就不能用了!

对于oracle返回自增主键(oracle序列)使用selectKey

相关属性如下:


  • keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性

  • order:相对于insert语句来说它的执行顺序,只要不是自增主键,那么就设置为before

  • resultType:指定返回的结果类型

具体使用时:


  • 主键返回之自增主键 :SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值只适用于自增主键



SELECT LAST_INSERT_ID()

insert into userinfo (userId,userName,userpass,usertype,address) values(#{userId},#{userName},#{userPass},#{userType},#{address})

  • 主键返回值UUID :order:如果主键自增,那么为after;如果主键不自增,那么为before,其中UUID函数是mysql的函数




select UUID()

insert into userinfo (userId,userName,userpass,usertype,address) values(#{userId},#{userName},#{userPass},#{userType},#{address})

  • 主键返回值序列 :order:只要不是自增主键,那么就设置为before,序列也就是sequence,它是Oracle的主键生成策略



select seq.nextval from dual

insert into
userinfo (userId,userName,userpass,usertype,address)
values
(#{userId},#{userName},#{userPass},#{userType},#{address})

Oracle批量插入

一般在MySQL或者oracle里面直接批量SQL是:

insert into login
select null,'nihoa' from dual union all
select null,'nihoa' from dual

但是这样的写法要注意——千万不能有values,否则报错

另外,在mybatis里面的oracle 批量插入的时候还必须用到假表select a.* from () a,用到主键自己增长的必须把序列放到同一级别

insert into login(id,name)
select sequence.nextval,a.* from(

select
#{item.name}
from dual

) a

oracle自己增长的话,必须把序列放到和假表的同一级别,否则回报一个:序列号不允许使用

附录:JDBC返回生成主键

Connection con=null;
PreparedStatement ps=null;
con = JDBCManager.getConnection();
String sql="insert into users(name,password) values(?,?)";
try {
ps = cowww.yii666.comn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);//获取返回的主键;
ps.setString(1, "qq");
ps.setString(2, "123");
ps.execwww.yii666.comuteUpdate();
ResultSet rs=ps.getGeneratedKeys();//返回一个结果集,保存着产生的key的结果集,
while(rs.next()){
System.out.println(rs.getObject(1));//结果集只有一个值;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCManager.DBclose(con, ps, null);
}

来源于:MyBatis之useGenerateKeys,selectKey,Oracle批量插入


推荐阅读
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • java线条处理技术_Java使用GUI绘制线条的示例
    在Java的GUI编程中,如何使用GUI绘制线条?以下示例演示了如何使用Graphics2D类的Line2D对象的draw()方法作为参数来绘制一条线。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • java.lang.Class.getDeclaredMethod()方法java.lang.Class.getDeclaredMethod()方法用法实例教程-方法返回一个Met ... [详细]
author-avatar
莫莫2602891683
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有