mybatis 自增主键配置(不同类型的数据库,代码写法不同)
2016-06-13 16:37
369 查看
插入后获取自增主键值
上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用mybatis提供的<selectKey />来单独配置针对自增逐渐的处理。
1.
Oracle Sequence 配置
1. <sql id='TABLE_NAME'>TEST_USER</sql>
2. <sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql>
3.
4. <!-- 注意这里需要先查询自增主键值 -->
5. <insert id="insert" parameterType="User">
6. <selectKey keyProperty="id" resultType="int" order="BEFORE">
7. select <include refid="TABLE_SEQUENCE" /> from dual
8. </selectKey>
9. insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
10. values ( #{id}, #{name}, #{age} )
11. </insert>
当使用了<selectKey />后,在实际的插入操作时,mybatis会执行以下两句SQL:
1. select SEQ_TEST_USER_ID.nextval from dual; // 语句1
2. insert into (ID,NAME,AGE) values ( ?, ?, ? ); // 语句2
在执行插入 语句2 之前,会先执行 语句1 以获取当前的ID值,然后mybatis使用反射调用User对象的setId方法,将 语句1 查询出的值保存在User对象中,然后才执行 语句2 这样就保证了执行完插入后
1. User user = new User();
2. user.setName("test");
3. user.setAge(24);
4.
5. userMapper.insert(user);
6. System.out.println(user.id); // user.id 不为空
user.id是有值的。
2.
Mysql自增主键配置
针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,
1. <sql id='TABLE_NAME'>TEST_USER</sql>
2.
3. <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="User">
4. insert into <include refid="TABLE_NAME" /> ( NAME, AGE )
5. values ( #{name}, #{age} )
6. </insert>
当然,由于Mysql的自增主键可以通过SQL语句
1. select LAST_INSERT_ID();
来获取的。因此针对Mysql,Mybatis也可配置如下:
1. <sql id='TABLE_NAME'>TEST_USER</sql>
2.
3. <!-- 注意这里需要先查询自增主键值 -->
4. <insert id="insert" parameterType="User">
5. <selectKey keyProperty="id" resultType="int" order="BEFORE">
6. SELECT LAST_INSERT_ID()
7. </selectKey>
8. insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
9. values ( #{id}, #{name}, #{age} )
10. </insert>
只不过该中配置需要额外的一条查询SQL!
小结
1.
当数据插入操作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销.
2.
当执行插入操作后需要立即获取插入的自增主键值,比如一次操作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置.
上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用mybatis提供的<selectKey />来单独配置针对自增逐渐的处理。
1.
Oracle Sequence 配置
1. <sql id='TABLE_NAME'>TEST_USER</sql>
2. <sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql>
3.
4. <!-- 注意这里需要先查询自增主键值 -->
5. <insert id="insert" parameterType="User">
6. <selectKey keyProperty="id" resultType="int" order="BEFORE">
7. select <include refid="TABLE_SEQUENCE" /> from dual
8. </selectKey>
9. insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
10. values ( #{id}, #{name}, #{age} )
11. </insert>
当使用了<selectKey />后,在实际的插入操作时,mybatis会执行以下两句SQL:
1. select SEQ_TEST_USER_ID.nextval from dual; // 语句1
2. insert into (ID,NAME,AGE) values ( ?, ?, ? ); // 语句2
在执行插入 语句2 之前,会先执行 语句1 以获取当前的ID值,然后mybatis使用反射调用User对象的setId方法,将 语句1 查询出的值保存在User对象中,然后才执行 语句2 这样就保证了执行完插入后
1. User user = new User();
2. user.setName("test");
3. user.setAge(24);
4.
5. userMapper.insert(user);
6. System.out.println(user.id); // user.id 不为空
user.id是有值的。
2.
Mysql自增主键配置
针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,
1. <sql id='TABLE_NAME'>TEST_USER</sql>
2.
3. <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="User">
4. insert into <include refid="TABLE_NAME" /> ( NAME, AGE )
5. values ( #{name}, #{age} )
6. </insert>
当然,由于Mysql的自增主键可以通过SQL语句
1. select LAST_INSERT_ID();
来获取的。因此针对Mysql,Mybatis也可配置如下:
1. <sql id='TABLE_NAME'>TEST_USER</sql>
2.
3. <!-- 注意这里需要先查询自增主键值 -->
4. <insert id="insert" parameterType="User">
5. <selectKey keyProperty="id" resultType="int" order="BEFORE">
6. SELECT LAST_INSERT_ID()
7. </selectKey>
8. insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
9. values ( #{id}, #{name}, #{age} )
10. </insert>
只不过该中配置需要额外的一条查询SQL!
小结
1.
当数据插入操作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销.
2.
当执行插入操作后需要立即获取插入的自增主键值,比如一次操作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置.
相关文章推荐
- 数据库索引
- MySQL数据库备份和恢复
- MYSQLl查询今天、昨天、7天、近30天、本月、上一月 数据
- redis 五种数据类型的使用场景
- SQL语句--oracle树查询
- 数据库设置max_allowed_packet过小报错
- 数据库连接失败
- MySQL relay log 详细参数解释
- sql server 2012 删除服务器名称
- C++连接Oracle之ADO
- MySQL数据库设置主从同步
- 使用sqlyog远程连接mysql错误2003 cant connect to mysql 解决办法
- SQL语句统计每小时,每天、每月、每年的_数据
- 从一个文件夹中遍历文件插入到数据库
- 数据库(一)
- Zeos DB 连接Mysql Utf8 字符集设置
- 浅谈SQL Server中的三种物理连接操作(Nested Loop Join、Merge Join、Hash Join)
- oracle 查看列统计信息中 low_value
- c#中高效的excel导入sqlserver的方法
- 浅谈SQL Server中的三种物理连接操作(Nested Loop Join、Merge Join、Hash Join)