博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis—insert语句返回主键和selectKey标签
阅读量:6937 次
发布时间:2019-06-27

本文共 2111 字,大约阅读时间需要 7 分钟。

本文已同步至个人博客

往数据库中插入一条记录后,有时候我们需要这条记录的主键,用于后续的操作。如果在插入后再去查一次数据库,显然不够优雅和效率,MyBatis中已经有了insert后返回主键的功能,下面就主要讲几种不同情况的具体做法。

1.主键自增的情况

对于MySQL和Sql Server这种支持主键自增的数据库,可以设置useGeneratedKeys="true"和keyProperty。例如现在有一个表 tbl_employee,表有id,name,age,create_time四个字段,MyBatis映射文件中可以写成如下:

INSERT INTO tbl_employee(name, age, create_time) VALUES(#{name}, #{age}, #{createTime})

useGeneratedKeys="true":使用自动生成的主键

keyProperty:指定主键是(javaBean的)哪个属性。

useGeneratedKeys:
(insert and update only) This tells MyBatis to use the JDBC getGeneratedKeys method to retrieve keys generated internally by the database (e.g.auto increment fields in RDBMS like MySQL or SQL Server). Default: false

keyProperty:

(insert and update only) Identifies a property into which MyBatis will set the key value returned by getGeneratedKeys , or by a selectKey child element of the insert statement. Default: unset .
Can be a comma separated list of property names if multiple generated columns are expected.

2.Oracle中用Sequence获取主键

对于Oracle数据库,当要用到自增字段时,需要用到Sequence,假设我们现在已经创建了一个名字为SEQ_ADMIN的 Sequence,在MyBatis中的映射文件中可以结合selectKey标签使用。

SELECT SEQ_ADMIN.NEXTVAL FROM DUAL
INSERT INTO tbl_employee(id, name, age, create_time) VALUES(#{id}, #{name}, #{age}, #{createTime})

order="BEFORE"表示SELECT SEQ_ADMIN.NEXTVAL FROM DUAL在 INSERT 语句执行之前先对id进行赋值。相反的,order还可以设置成AFTER,表示在INSERT语句执行完后,再查询一次slectKey标签中的语句,并赋值到Javabean的keyProperty的那个属性上。

源码分析

从源码上来分析,在BaseStatementHandler里面有生成generateKeys,主要是执行:

protected void generateKeys(Object parameter) {      KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();      ErrorContext.instance().store();      keyGenerator.processBefore(executor, mappedStatement, null, parameter);      ErrorContext.instance().recall();  }

processBefore,表示执行前处理,对应mapper里面的selectKey中的order="BEFORE"属性,先执行查询key,并设置到参数对象中。

在各个声明处理器中,update有代码:

KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();  keyGenerator.processAfter(executor, mappedStatement, ps, parameterObject);

processAfter,表示执行后处理,对应mapper里面的selectKey中的order="AFTER"属性,表示执行后,再查一遍key,设置到参数对象中。

转载地址:http://kcbnl.baihongyu.com/

你可能感兴趣的文章
Java设计模式之职责链设计模式
查看>>
课后作业-阅读任务-阅读提问-3
查看>>
JS数组追加数组采用push.apply的坑
查看>>
触发器,视图
查看>>
【引用】高手新手都能用的140个技巧
查看>>
Eclipse智能提示引用
查看>>
c# DbHelper
查看>>
100多行代码实现6秒完成50万条多线程并发日志文件写入
查看>>
软件测试
查看>>
如何避免adtbundle新建项目总是产生一个appcompat_v7和fragment_main.xml
查看>>
正则表达式识别汉字
查看>>
DeleteXMl
查看>>
linux下复制
查看>>
编程题
查看>>
Android数据存储——2.文件存储_A_文本文件
查看>>
scp -P 非22端口拷贝
查看>>
Django编写RESTful API(五):添加超链接提高模型间的关联性
查看>>
扫描二维码
查看>>
[摘录]高效人士七习惯—双赢思维原则
查看>>
用javascript实现jquery的trim方法
查看>>