【转】mybatis 自增主键配置
mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是Oracle Sequece 和 MySQL 自增主键,至于其他的手动生成唯一主键的问题在这里就不讨论了,这里主要说明下在mybatis中对于自增主键的配置。
不返回自增主键值
如果考虑到插入数据的主键不作为其他表插入数据的外键使用,那么可以考虑使用这种方式。
Oracle Sequence 配置
<sql id='TABLE_NAME'>TEST_USER</sql><sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql><!-- 注意这里直接调用sequence的nextval函数 --><insert id="insert" parameterType="User">insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)values ( <include refid="TABLE_SEQUENCE" /> ,#{name}, #{age} )</insert>
当插入语句如上配置时,那么针对如下语句
User user = new User();user.setName("test");user.setAge(24);userMapper.insert(user);System.out.println(user.id); // user.id 为空
user.id为空,也就是说如上的配置并不能在完成插入操作后将插入时的主键值存放到保存的对象中。Mysql自增主键配置
由于mysql数据库中,可以设置表的主键为自增,所以对于Mysql数据库在mybatis配置插入语句时,不指定插入ID字段即可。主键的自增交由Mysql来管理。
<sql id='TABLE_NAME'>TEST_USER</sql><!-- 注意这里的插入SQL中是没有指明ID字段的! --><insert id="insert" parameterType="User">insert into <include refid="TABLE_NAME" /> (NAME,AGE)values (#{name}, #{age} )</insert>
同样,针对Mysql如此配置mybaits,插入完成后
user.id为空。
插入后获取自增主键值
上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用mybatis提供的<selectKey />来单独配置针对自增逐渐的处理。
Oracle Sequence 配置
<sql id='TABLE_NAME'>TEST_USER</sql><sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql><!-- 注意这里需要先查询自增主键值 --><insert id="insert" parameterType="User"><selectKey keyProperty="id" resultType="int" order="BEFORE">select <include refid="TABLE_SEQUENCE" /> from dual</selectKey>insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)values ( #{id}, #{name}, #{age} )</insert>
当使用了
<selectKey />后,在实际的插入操作时,mybatis会执行以下两句SQL:select SEQ_TEST_USER_ID.nextval from dual; // 语句1insert into (ID,NAME,AGE) values ( ?, ?, ? ); // 语句2
在执行插入 语句2 之前,会先执行 语句1 以获取当前的ID值,然后mybatis使用反射调用
User对象的setId方法,将 语句1 查询出的值保存在User对象中,然后才执行 语句2 这样就保证了执行完插入后User user = new User();user.setName("test");user.setAge(24);userMapper.insert(user);System.out.println(user.id); // user.id 不为空
user.id是有值的。Mysql自增主键配置
针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,
<sql id='TABLE_NAME'>TEST_USER</sql><insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="User">insert into <include refid="TABLE_NAME" /> ( NAME, AGE )values ( #{name}, #{age} )</insert>
当然,由于Mysql的自增主键可以通过SQL语句
select LAST_INSERT_ID();
来获取的。因此针对Mysql,Mybatis也可配置如下:
<sql id='TABLE_NAME'>TEST_USER</sql><!-- 注意这里需要先查询自增主键值 --><insert id="insert" parameterType="User"><selectKey keyProperty="id" resultType="int" order="BEFORE">SELECT LAST_INSERT_ID()</selectKey>insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)values ( #{id}, #{name}, #{age} )</insert>
只不过该中配置需要额外的一条查询SQL!
小结
当数据插入操作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销.
当执行插入操作后需要立即获取插入的自增主键值,比如一次操作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置.
【转】mybatis 自增主键配置的更多相关文章
- mycat分布式mysql中间件(自增主键)
一.全局序列号 全局序列号是MyCAT提供的一个新功能,为了实现分库分表情况下,表的主键是全局唯一,而默认的MySQL的自增长主键无法满足这个要求.全局序列号的语法符合标准SQL规范,其格式为:nex ...
- mybatis的执行流程 #{}和${} Mysql自增主键返回 resultMap 一对多 多对一配置
n Mybatis配置 全局配置文件SqlMapConfig.xml,配置了Mybatis的运行环境等信息. Mapper.xml文件即Sql映射文件,文件中配置了操作数据库的Sql语句.此文件需要在 ...
- (转)Mybatis高级映射、动态SQL及获得自增主键
原文:http://www.cnblogs.com/edwinchen/p/4105278.html?utm_source=tuicool&utm_medium=referral 一.动态SQ ...
- mybatis 添加事物后 无法获取自增主键的问题
检查代码后没发现mapper文件设置自增主键返回的问题,后来检查到,关闭事务后,执行完是可以获取返回的主键的, 我在mysql的客户端里关闭自动提交,发现使用select last_insert_id ...
- 关于mybatis用mysql时,插入返回自增主键的问题
公司决定新项目用mybatis,虽然这个以前学过但是一直没用过都忘得差不多了,而且项目比较紧,也没时间去系统点的学一学,只好很粗略的百度达到能用的程度就行了. 其中涉及到插入实体要求返回主键id的问题 ...
- Mybatis高级映射、动态SQL及获得自增主键
一.动态SQL 相信大家在用mybatis操作数据库时时都会碰到一个问题,假如现在我们有一个关于作者的list authorList,需要根据authorList里已有的作者信息在数据库中查询相应作者 ...
- mybatis框架(6)---mybatis插入数据后获取自增主键
mybatis插入数据后获取自增主键 首先理解这就话的意思:就是在往数据库表中插入一条数据的同时,返回该条数据在数据库表中的自增主键值. 有什么用呢,举个例子: 你编辑一条新闻,同时需要给该新闻打上标 ...
- Mybatis 中获取添加的自增主键ID(针对mysql)
分享一篇博客,主要就是针对在我们使用SSM的时候,在.xml中获取<insert></insert> 时的自增主键Id,由于好久没有,这个时候使用,有点生疏,就在这里写个笔记, ...
- Mybatis useGeneratedKeys 填充自增主键值(使用Mysql)的原理分析
一.Mybatis配置 <insert id="insert" parameterType="com.test.TestDO" keyProperty=& ...
随机推荐
- 64位平台C/C++开发注意事项
在http://www.viva64.com/en/l/上例出了28个在64位平台上使用C/C++开发的注意事项,对于进入64位时代的程序员应该去看看这28个事项,这些英文读物对于有C/C++功底的朋 ...
- spark.mllib源代码阅读-优化算法1-Gradient
Spark中定义的损失函数及梯度,在看源代码之前,先回想一下机器学习中定义了哪些损失函数,毕竟梯度求解是为优化求解损失函数服务的. 监督学习问题是在如果空间F中选取模型f作为决策函数.对于给定的输入X ...
- TCP网络编程杂谈
作为一名IT工程师,网络通信编程相信都会接触到,比如Web开发的HTTP库,Java中的Netty,或者C/C++中的Libevent,Libev等第三方通信库,甚至是直接使用Socket API,但 ...
- [转]BSIM Parameters
Name Alias Description MOSFET LevelL LV1 Channel Length (L)This is also the effective channel length ...
- npm的影武者 —— Npx
npx github:https://github.com/zkat/npx 什么是Npx?它和npm是什么关系? 如果你把NPM升级到最新版本npm@5.2.0 ,它就会安装一个新的包npx $ n ...
- A标签实现文件下载功能
<a>可直接下载xls,doc,rar,zip,exe,js文件(图片跟txt文件是直接打开的) <a href="wKioJlJolKeCIzkCADd3Wf7OPI42 ...
- c# xml 输出注释格式控制
string str="\n\t///*! 妆容类物品子分类 */\n\tenum MakeupSubType\n\t{\n\t\tItem_InvalidMakeupSubType = - ...
- MongoDB联合查询 -摘自网络
1.简单手工关联 首先将结果查询出来放到一个变量里面,然后再查询 u = db.user.findOne({author:"wangwenlong"}); for(var p = ...
- php分享二十一:mysql语句
一.Join语法概述 JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接) RIGHT JOIN(右连接 ...
- Android 7.0 出现 ”FileUriExposedException“ 和 ”解析包出现错误“ 异常的解决办法
问题1 :android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.xxx.xxx.xxx.rel ...