mybatis 自增主键配置
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; // 语句1
insert 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 3.2.6插入时候获取自增主键方法有二
以MySQL5.5为例:
方法1:
<insert id="insert" parameterType="Person" useGeneratedKeys="true" keyProperty="id">
insert into person(name,pswd) values(#{name},#{pswd})
</insert>
方法2:
<insert id="insert" parameterType="Person">
<selectKey keyProperty="id" resultType="long">
select LAST_INSERT_ID()
</selectKey>
insert into person(name,pswd) values(#{name},#{pswd})
</insert>
插入前实体id属性为0;
插入后实体id属性为保存后自增的id;
- 浏览: 144168 次
最新评论
-
diggywang:
不注册一样可以用,sublime是业界良心
sublime3注册码,测过可用 -
lkl:
说的没错。
SpringMVC访问静态资源的三种方式 -
lkl:
说的太对了,但是我们现在项目的配置在web.xml中,想改一下 ...
SpringMVC访问静态资源的三种方式 -
酷的飞上天空:
一般都是使用<mvc:default-servlet-h ...
SpringMVC访问静态资源的三种方式 -
lkl:
非常感谢james_lover的纠正
git本地与远程同步问题一
相关推荐
mybatis进行插入操作时,如果表的主键是自增的,...基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键,至于其他的手动生成唯一主键的问题在这里就不讨论了,这里主要说明下在mybatis中对于自增主键的配置。
mybatis获取自增主键的值 ,mybatis获取自增主键的值!
自增主键为什么不是连续的?
Mybatis插入数据返回自增主键 Mybatis插入数据以后只会返回影响的数据库行数,如果是插入一条数据成功则返回1,失败返回零,插入多条返回插入成功的数量。 通过注解或者xml配置无法直接返回自增的主键。Mybatis插入...
主键返回(mybatis的自增主键或者非自增主键) • 批量查询 • 动态传参 • 查询缓存(一级缓存、二级缓存) • 延迟加载(侵入式延迟加载、深度延迟加载) • 关联查询(一对一、一对映射) • 逆向工程 • ...
mybatis 自定义生成 entity/dao/mapper.xml 文件
mybatis获取自增IDmybatis获取自增ID
MyBatis 3.2.6插入时候获取自增主键方法有两种,下面以以MySQL5.5为例通过两种方法给大家介绍mybatis获取自增主键的方法,一起看看吧
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名...这篇文章主要介绍了Mybatis高级映射、动态SQL及获得自增主键的相关资料,需要的朋友可以参考下
给大家分享MyBatis Oracle 自增序列的实现方法及mybatis配置oracle的主键自增长的方法,非常不错具有一定的参考借鉴价值,感兴趣的朋友一起看看吧
主要给大家介绍了关于Mybatis使用useGeneratedKeys获取自增主键的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Mybatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
Mybatis逆向工程配置文件与jar(注解详细),jar包包括:mybatis-generator-core-1.3.2.jar,mysql-connector-java-5.1.34.jar,配置文件有generator.xml,还有一个生产语句txt。
mybatis逆向工程配置文件,包括执行文件,更改数据库连接和代码保存地址可直接使用,mybatis逆向工程配置文件,包括执行文件,更改数据库连接和代码保存地址可直接使用
MyBatis自动生成配置文件全解.zip MyBatis自动生成配置文件全解.zip MyBatis自动生成配置文件 全解.zip
第三章 MyBatis的核心配置,总结,,学生自用笔记,很详细
主要介绍了详解MyBatis中主键回填的两种实现方式,主键回填其实是一个非常常见的需求,特别是在数据添加的过程中,我们经常需要添加完数据之后,需要获取刚刚添加的数据 id,有兴趣的可以参考一下
在生成表主键ID时,我们可以考虑主键自增 或者 UUID,但它们都有很明显的缺点 主键自增:1、自增ID容易被爬虫遍历数据。2、分表分库会有ID冲突。 UUID: 1、太长,并且有索引碎片,索引多占用空间的问题 2、无序。 ...
这个是我今天学的一个Java里面mybatis的主配置中的其中一个包,由于软件问题,只可以传一个,这是接上一个config.dtd的mapper.dtd,这个下载了,记得解压,这个是mapper.dtd还有一个config,等会发下一个教程和代码,...
mybatis源码+配置步骤+包文件:适用于初学mybatis框架的人
mybatis 注解+配置文件方式完整例子 包含数据库的sql文件. 所有方法都有注解, 很明了.不知道为啥这个所需积分竟然逐步增长了,描述文字也50起步了。。