- 浏览: 3422510 次
- 性别:
- 来自: 珠海
文章分类
- 全部博客 (1633)
- Java (250)
- Android&HTML5 (111)
- Struts (10)
- Spring (236)
- Hibernate&MyBatis (115)
- SSH (49)
- jQuery插件收集 (55)
- Javascript (145)
- PHP (77)
- REST&WebService (18)
- BIRT (27)
- .NET (7)
- Database (105)
- 设计模式 (16)
- 自动化和测试 (19)
- Maven&Ant (43)
- 工作流 (36)
- 开源应用 (156)
- 其他 (16)
- 前台&美工 (119)
- 工作积累 (0)
- OS&Docker (83)
- Python&爬虫 (28)
- 工具软件 (157)
- 问题收集 (61)
- OFbiz (6)
- noSQL (12)
最新评论
-
HEZR曾嶸:
你好博主,这个不是很理解,能解释一下嘛//左边+1,上边+1, ...
java 两字符串相似度计算算法 -
天使建站:
写得不错,可以看这里,和这里的这篇文章一起看,有 ...
jquery 遍历对象、数组、集合 -
xue88ming:
很有用,谢谢
@PathVariable映射出现错误: Name for argument type -
jnjeC:
厉害,困扰了我很久
MyBatis排序时使用order by 动态参数时需要注意,用$而不是# -
TopLongMan:
非常好,很实用啊。。
PostgreSQL递归查询实现树状结构查询
http://leeyee.github.io/blog/2013/08/22/mybatis-auto-increment-primary-key/
mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键,至于其他的手动生成唯一主键的问题在这里就不讨论了,这里主要说明下在mybatis中对于自增主键的配置。
不返回自增主键值
如果考虑到插入数据的主键不作为其他表插入数据的外键使用,那么可以考虑使用这种方式。
Oracle Sequence 配置
当插入语句如上配置时,那么针对如下语句
user.id为空,也就是说如上的配置并不能在完成插入操作后将插入时的主键值存放到保存的对象中。
Mysql自增主键配置
由于mysql数据库中,可以设置表的主键为自增,所以对于Mysql数据库在mybatis配置插入语句时,不指定插入ID字段即可。主键的自增交由Mysql来管理。
同样,针对Mysql如此配置mybaits,插入完成后user.id为空。
插入后获取自增主键值
上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用mybatis提供的<selectKey />来单独配置针对自增逐渐的处理。
Oracle Sequence 配置
当使用了<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.id是有值的。
Mysql自增主键配置
针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,
当然,由于Mysql的自增主键可以通过SQL语句
来获取的。因此针对Mysql,Mybatis也可配置如下:
只不过该中配置需要额外的一条查询SQL!
小结
当数据插入操作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销.
当执行插入操作后需要立即获取插入的自增主键值,比如一次操作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置.
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开销.
当执行插入操作后需要立即获取插入的自增主键值,比如一次操作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置.
发表评论
-
spring配置事物的方式:注解和aop配置
2016-05-14 00:26 4102参考: Spring AOP中pointcut express ... -
写个mybatis的拦截插件,实现将所有执行的sql写入文件里
2016-05-12 15:59 5104原文 http://3131854.blog.51cto.co ... -
Mybatis分库分表扩展插件
2016-05-12 15:47 1620http://fangjialong.iteye.com/bl ... -
spring+mybatis+atomikos 实现JTA事务
2016-05-11 22:00 5522sping配置多个数据源 不同用户操作不同数据库 http:/ ... -
ibatis扩展支持主键生成的方法(非数据库方式)
2016-04-13 22:01 976http://blog.csdn.net/warison200 ... -
ibatis 动态 Mapped Statement
2016-03-31 17:02 855http://www.cnblogs.com/lcngu/p/ ... -
分布式事务管理
2016-03-31 16:43 1039http://my.oschina.net/pingpangk ... -
ibatis中动态查询表返回用resultClass="java.util.HashMap" 的问题
2016-03-11 10:49 1124http://blog.csdn.net/dyllove98/ ... -
Mybatis传多个参数(三种解决方案)
2016-03-07 17:46 1445http://my.oschina.net/ydsakyclg ... -
mybatis --mapper配置文件中大于小于怎么处理
2016-03-04 14:21 2405http://blog.csdn.net/nich002/ar ... -
Mybatis 数据库物理分页插件 PageHelper
2015-11-28 01:09 2791http://www.cnblogs.com/digdeep/ ... -
Druid 的SQL翻译功能如何使用
2015-11-27 21:40 1976Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接 ... -
[MyBatis]mapperLocations属性通配符的使用
2015-11-26 10:49 6219http://blog.csdn.net/szwangdf/a ... -
Hibernate Validation使用示例及讲解
2015-11-22 21:06 2752http://wdmcygah.iteye.com/blog/ ... -
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
2015-11-17 17:54 20171http://blog.csdn.net/weibing_hu ... -
SpringMVC + Mybatis + Shiro 权限整合
2015-11-14 14:06 8746详细见参考文章: 基于Spring + Spring MVC ... -
MyBatis3 的Mapper XML 文件详解
2015-11-13 11:54 1357MyBatis3 的Mapper XML 文件http://m ... -
HibernateDao.java
2015-11-10 15:55 1162http://my.oschina.net/lizy/blog ... -
Hibernate envers开发指南
2015-10-24 00:44 1234http://www.blogjava.net/xmatthe ... -
Spring+Ibatis数据库水平分库
2015-09-13 21:15 1297Spring+Ibatis数据库水平分库 http://blo ...
相关推荐
以下将详细讲解这两种数据库在MyBatis中的自增主键配置。 1. **Oracle Sequence 配置** 在Oracle中,你可以创建一个Sequence来生成唯一的序列号。在MyBatis中,你需要定义一个SQL片段来引用这个Sequence。以下是...
在MyBatis这个流行的Java持久层框架中,处理自增主键的值通常涉及到插入数据后如何获取新生成的ID。下面将详细阐述MyBatis如何实现这一功能。 1. **自增主键的原理**: 自增主键通常在关系型数据库如MySQL、...
Mybatis插入数据返回自增主键 Mybatis插入数据以后只会返回影响的数据库行数,如果是插入一条数据成功则返回1,失败返回零,插入多条返回插入成功的数量。 通过注解或者xml配置无法直接返回自增的主键。Mybatis插入...
1. **配置文件**:在 MyBatis Generator(MBG)中,我们首先需要创建一个 XML 配置文件,用于定义生成代码的基本设置,如数据库连接信息、目标输出目录、生成的文件类型等。配置文件中的 `<generatorConfiguration>`...
当在Mybatis的XML映射文件中配置一个插入语句时,设置`useGeneratedKeys="true"`指示Mybatis在执行插入操作后,调用JDBC的`getGeneratedKeys`方法来获取由数据库生成的自增主键。例如: ```xml INSERT INTO ...
MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 #### 二、获取自增ID的意义 在数据库操作中,经常需要插入数据到表中,...
在MyBatis的配置文件中,你可能已经为其他支持自增主键的数据库(如MySQL)设置了`useGeneratedKeys="true"`,但对Oracle来说,因为自增机制不同,需要在插入语句中显式调用序列。所以,对于Oracle,你需要按照上述...
在MyBatis中,我们可以通过配置来获取这个自增主键的值。 步骤一:在Mapper XML文件中配置插入语句。在`<insert>`标签内,我们需要添加两个属性:`useGeneratedKeys="true"` 和 `keyProperty="id"`。`...
在使用MyBatis Plus (MP) 进行数据操作时,有时可能会遇到插入数据后无法获取自增主键的情况。本文将深入分析这个问题,并提供解决方案。 首先,MyBatis Plus 是 MyBatis 的一个扩展库,它提供了很多方便的数据操作...
其次,全局主键策略是在`application.yml`配置文件中设定,通过`mybatis-plus`的`global-config`下的`db-config`配置项指定默认的主键类型。例如: ```yaml mybatis-plus: mapper-locations: com/mp/mapper/* ...
总的来说,当使用MyBatis操作支持主键自增的数据库时,正确配置映射文件并利用`useGeneratedKeys`和`keyProperty`属性,可以方便地获取并利用自增主键。这样不仅可以简化开发工作,还能确保数据的一致性和完整性。在...
Mybatis-plus 实现主键自增和自动注入时间的示例代码 Mybatis-plus 是一个基于 Mybatis 的增强型 ORM 框架,它提供了许多实用的功能来简化数据库操作。在本文中,我们将通过示例代码,介绍如何使用 Mybatis-plus ...
- `@Options`: 提供一些额外的选项,如`useGeneratedKeys`和`keyProperty`,用于处理自增主键。 4. **自动扫描与注册** 在Spring集成MyBatis时,可以通过`@MapperScan`注解在配置类上指定包名,让Spring自动扫描...
第17、18集则关注于自增主键的处理,17集展示了如何获取插入后自动生成的主键,通常在MySQL等支持自动增长主键的数据库中使用。而在18集中,针对Oracle数据库,讲解了如何利用序列来生成主键,这是Oracle数据库特有...
2. @Insert:插入数据的方法,可以返回自增主键。 3. @Update:更新数据的方法。 4. @Delete:删除数据的方法。 5. @Result:定义字段映射关系。 6. @Results:一组@Result的集合,常用于复杂的一对多或多对一映射。...
MyBatis Generator支持多种主键生成策略,如Identity(自动增长)、Sequence(序列号)和AutoIncrement(数据库自增)等。 4. **commentGenerator**:用于设置代码注释生成器。你可以自定义注释内容,比如添加作者...
在使用MyBatis进行数据库操作时,有时我们需要在插入数据后获取自动生成的主键ID,这在处理自增主键的场景下尤其常见。在MySQL数据库中,自增主键通常用于标识每条记录的独特性,而在插入新记录后,数据库会自动为这...
在Java开发中,MyBatis是一个非常...总结来说,MyBatis提供两种方式来处理插入数据并返回自增主键的逻辑。理解这两种方式的差异和适用场景,以及避免常见的编程陷阱,对于高效地使用MyBatis进行数据库操作至关重要。
- 插入用户,可以选择返回主键值,如果是自增主键,MyBatis可以自动获取;对于非自增主键,如UUID或Oracle序列,也需要特殊处理。 - 更新用户信息,MyBatis允许开发者根据需要更新特定字段。 - 删除用户,可以通过ID...