ibatis实战之插入数据(自动生成主键)
ibatis实战之插入数据(自动生成主键)
---------
如果你将数据库设计为使用自动生成的主键,就可以使用ibatis的<selectKey>元素(该元素是<insert>元素的一个专用子元素)来获取这些自动生成的主键的值并将其保存在对象中。完成这项工作可以有两种方式,具体选择何种方式由你所使用的具体的主键生成技术来确定。
第一种方式是,当你把记录插入到数据库中并且数据库为该记录自动生成了主键值之后,就立即抓取该键值。此时要注意的是,必须确保所使用的数据库驱动程序确实能返回你执行上一条insert语句所得到的键值。
第二种方式是在插入记录之前就获取键值。如果你使用数据库交互工具来插入记录,那么这种方式需要更多的工作量,因为你必须在插入记录之前先分配一个键值。然而,这种策略可以避免因为多线程同时插入数据并在记录插入之后才获取键值所带来的潜在风险,并且通常是最安全的方式,因为它几乎不需要对代码作任何假定。使用第一种方式可能会出现潜在的问题,使得应用程序无法像期望的那样顺利执行。但是使用这种方式,我们所需要的就是确保所得到的键值是唯一的。我们不需要数据库在当前会话中管理键值,只需要它生成并把键值返回给我们即可。
对于这两种方式,ibatis都可以帮助更轻松地成任务。<selectKey>元素使得这个任务对于你的应用程序来说完全是透明
的(至少在调和代码中)。insert方法的签名如下:
- Object insert(String id,Object parameterObject)throws SQLException;
insert方法返回一个Object对象的原因是:使你能够得到所生成的键值。例如,假设你的应用程序中有如下这个已映射语句和代码(使用了前面所介绍的第二种方式):
- <insert id="insert">
- <selectKey keyProperty="accountId" resultClass="int">
- SELECT nextVal('account_accountId_seq')
- </selectKey>
- INSERT INTO Account(
- accountId,username,password
- )VALUES(
- #accountId#,#username#,#password#
- )
- </insert>
- Integer returnValue = (Integer)sqlMap.insert("Account.insert",account);
returnValue变量将包含所生成的键值。但是还不止这些---<selectKey>元素中的keyProperty属性会告诉ibatis获取
键值并将其插入对象的相应属性的值。这意味着如果你愿意,你甚至可以忽略返回值,因为被插入的对象的主键已经被设置为了该值。
需要记住的是:<selectKey>元素其实也定义了一个已映射语句,并且该已映射语句可以访问的参数映射与包含该已映射
语句的insert相同。因此,在一上个示例中,如果想要选择用于记录插入的序列(sequence),就可以使用这样一个已映射
语句:
- <insert id="insertSequence">
- <selectKey keyProperty="accountId" resultClass="int">
- SELECT nextVal(#sequence#)
- </selectKey>
- INSERT INTO Account(
- accountId,username,password
- )VALUES(
- #accountId#,#username#,#password#
- )
- </insert>
ibatis实战之插入数据(自动生成主键)的更多相关文章
- mysql插入数据自动生成主键uuid
DemoMapper.java //注意方法的返回值必须是void; void add(Demo demo); ============================================ ...
- mybatis中Oracle及mysql插入时自动生成主键以及返回主键
mysql的方式: 方式一: useGeneratedKeys="true" keyProperty="id" 方式二: <selectKey keyPr ...
- mybatis添加信息自动生成主键
一.使用Oracle数据库 举例:添加员工的时候自动生成主键 1.在dao接口中声明方法 2.在mapper中实现该方法 需要先在数据表中创建序列 3.测试 注意:在调用过save方法之后,emp对象 ...
- mybatis的插入数据后的主键获取
为什么要在插入数据后获取主键:当有一个订单表和订单详情表,当插入订单表的数据后,需要在订单详情表插入该订单的具体购物情况,订单详情表需要的一个列是订单表的主键或者订单ID.(通俗讲:A表的主键是B表的 ...
- mybatis 插入数据时返回主键
在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:显然,假如主键是你生成后插入的,自然你已经有主键了,显然不需要我们再去获得,所以我们这里处理的是当主键 ...
- MyBatis在Oracle中插入数据并返回主键的问题解决
引言: 在MyBatis中,希望在Oracle中插入数据之时,同一时候返回主键值,而非插入的条数... 环境:MyBatis 3.2 , Oracle. Spring 3.2 SQL Snipp ...
- [oracle] 如何使用myBatis在数据库中插入数据并返回主键
在MyBatis中,希望在Oracle中插入数据的同时返回主键值,而非插入的条数. ① oracle使用 selectKey. U_USER_INFO_SEQ 是在数据库中定义好的这张表关联的序列se ...
- Laravel 5 插入数据后返回主键ID
方法一: $info = DB::table('表名')->insertGetId(['imgName' => $fileName]);//图片名入库后返回添加数据行的主键ID 方法二:( ...
- mybatis插入数据并返回主键(oracle)
通常我们执行一个inser语句,即使有返回,也只是会返回影响了多少条数据 @insert("insert into t_user (id,name) values (suser.nextva ...
随机推荐
- Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)
1 前景回顾 1.1 Linux的调度器组成 2个调度器 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测 ...
- KVM使用
这里使用的是Ubuntu18.04桌面版虚拟机 关于KVM可以看一下我之前的博客,有一些简单的介绍. 1.在打开虚拟机之前先开启此虚拟机的虚拟化功能. 2.安装KVM及其依赖项 wy@wy-virtu ...
- ACE侧边栏刷新自动展开之前的选择
在body下面加上 <script type="text/javascript"> $(document).ready(function(){ var url = do ...
- 关于IDE的选择
以往忘了看到谁说的,说开发.NET就用VS,开发JS就用webStorm,开发java没钱用Eclipse,有钱用IDEA
- SQL LIKE 操作符
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. LIKE 操作符 LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. SQL LIKE 操作符语法 SELECT colum ...
- jvm运行时内存模式
jvm内存模型 内存模型粗略划分为:堆和栈 详细划分为:堆,虚拟机栈,方法区,本地方法区,程序计数器 程序计数器: 为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程 ...
- Mysql SQL分组取每组前几条记录
按name分组取最大的两个val: [比当前记录val大的条数]小于2条:即当前记录为为分组中的前两条 > (select count(*) from tb where name = a.nam ...
- CSAPP:第一章计算机系统漫游
CSAPP:计算机系统漫游 关键点:上下文.程序运行.计算机系统抽象. 信息就是位+上下文一个程序的运行过程系统的硬件组成编译系统是如何工作的?一个程序的运行过程(c语言举例)计算机系统中的抽象 信息 ...
- P1145 约瑟夫 W(模拟)
暴力+模拟 #include<iostream> #include<cstring> using namespace std; int ans, k, k2; ]; bool ...
- day26 Python 改变对象的字符串显示
__str__,__repr__,__format__ format_dict={ 'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型 't ...