mybatis自增主键配置(?)

mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是Oracle Sequece 和 MySQL 自增主键,至于其他的手动生成唯一主键的问题在这里就不讨论了,这里主要说明下在mybatis中对于自增主键的配置。

不返回自增主键值

如果考虑到插入数据的主键不作为其他表插入数据的外键使用,那么可以考虑使用这种方式。

  1. Oracle Sequence 配置

    1. <sql id='TABLE_NAME'>TEST_USER</sql>
    2. <sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql>
    3. <!-- 注意这里直接调用sequence的nextval函数 -->
    4. <insert id="insert" parameterType="User">
    5. insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
    6. values ( <include refid="TABLE_SEQUENCE" /> ,#{name}, #{age} )
    7. </insert>

    当插入语句如上配置时,那么针对如下语句

    1. User user = new User();
    2. user.setName("test");
    3. user.setAge(24);
    4. userMapper.insert(user);
    5. System.out.println(user.id); // user.id 为空

    user.id为空,也就是说如上的配置并不能在完成插入操作后将插入时的主键值存放到保存的对象中。

  2. Mysql自增主键配置

    由于mysql数据库中,可以设置表的主键为自增,所以对于Mysql数据库在mybatis配置插入语句时,不指定插入ID字段即可。主键的自增交由Mysql来管理。

    1. <sql id='TABLE_NAME'>TEST_USER</sql>
    2. <!-- 注意这里的插入SQL中是没有指明ID字段的! -->
    3. <insert id="insert" parameterType="User">
    4. insert into <include refid="TABLE_NAME" /> (NAME,AGE)
    5. values (#{name}, #{age} )
    6. </insert>

    同样,针对Mysql如此配置mybaits,插入完成后user.id为空。

插入后获取自增主键值

上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用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. <insert id="insert" parameterType="User">
    5. <selectKey keyProperty="id" resultType="int" order="BEFORE">
    6. select <include refid="TABLE_SEQUENCE" /> from dual
    7. </selectKey>
    8. insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
    9. values ( #{id}, #{name}, #{age} )
    10. </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. userMapper.insert(user);
    5. System.out.println(user.id); // user.id 不为空

    user.id是有值的。

  2. Mysql自增主键配置

    针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,

    1. <sql id='TABLE_NAME'>TEST_USER</sql>
    2. <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="User">
    3. insert into <include refid="TABLE_NAME" /> ( NAME, AGE )
    4. values ( #{name}, #{age} )
    5. </insert>

    当然,由于Mysql的自增主键可以通过SQL语句

    1. select LAST_INSERT_ID();

    来获取的。因此针对Mysql,Mybatis也可配置如下:

    1. <sql id='TABLE_NAME'>TEST_USER</sql>
    2. <!-- 注意这里需要先查询自增主键值 -->
    3. <insert id="insert" parameterType="User">
    4. <selectKey keyProperty="id" resultType="int" order="BEFORE">
    5. SELECT LAST_INSERT_ID()
    6. </selectKey>
    7. insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
    8. values ( #{id}, #{name}, #{age} )
    9. </insert>

    只不过该中配置需要额外的一条查询SQL!

小结

  1. 当数据插入操作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销.

  2. 当执行插入操作后需要立即获取插入的自增主键值,比如一次操作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置.

【转】mybatis 自增主键配置的更多相关文章

  1. mycat分布式mysql中间件(自增主键)

    一.全局序列号 全局序列号是MyCAT提供的一个新功能,为了实现分库分表情况下,表的主键是全局唯一,而默认的MySQL的自增长主键无法满足这个要求.全局序列号的语法符合标准SQL规范,其格式为:nex ...

  2. mybatis的执行流程 #{}和${} Mysql自增主键返回 resultMap 一对多 多对一配置

    n Mybatis配置 全局配置文件SqlMapConfig.xml,配置了Mybatis的运行环境等信息. Mapper.xml文件即Sql映射文件,文件中配置了操作数据库的Sql语句.此文件需要在 ...

  3. (转)Mybatis高级映射、动态SQL及获得自增主键

    原文:http://www.cnblogs.com/edwinchen/p/4105278.html?utm_source=tuicool&utm_medium=referral 一.动态SQ ...

  4. mybatis 添加事物后 无法获取自增主键的问题

    检查代码后没发现mapper文件设置自增主键返回的问题,后来检查到,关闭事务后,执行完是可以获取返回的主键的, 我在mysql的客户端里关闭自动提交,发现使用select last_insert_id ...

  5. 关于mybatis用mysql时,插入返回自增主键的问题

    公司决定新项目用mybatis,虽然这个以前学过但是一直没用过都忘得差不多了,而且项目比较紧,也没时间去系统点的学一学,只好很粗略的百度达到能用的程度就行了. 其中涉及到插入实体要求返回主键id的问题 ...

  6. Mybatis高级映射、动态SQL及获得自增主键

    一.动态SQL 相信大家在用mybatis操作数据库时时都会碰到一个问题,假如现在我们有一个关于作者的list authorList,需要根据authorList里已有的作者信息在数据库中查询相应作者 ...

  7. mybatis框架(6)---mybatis插入数据后获取自增主键

    mybatis插入数据后获取自增主键 首先理解这就话的意思:就是在往数据库表中插入一条数据的同时,返回该条数据在数据库表中的自增主键值. 有什么用呢,举个例子: 你编辑一条新闻,同时需要给该新闻打上标 ...

  8. Mybatis 中获取添加的自增主键ID(针对mysql)

    分享一篇博客,主要就是针对在我们使用SSM的时候,在.xml中获取<insert></insert> 时的自增主键Id,由于好久没有,这个时候使用,有点生疏,就在这里写个笔记, ...

  9. Mybatis useGeneratedKeys 填充自增主键值(使用Mysql)的原理分析

    一.Mybatis配置 <insert id="insert" parameterType="com.test.TestDO" keyProperty=& ...

随机推荐

  1. 在JSP中如何使用JavaBean

    在JSP中使用JavaBean以后,可以实现HTML代码和Java代码的分离,是JSp更易于开发和维护.因此JavaBean成了JSP程序员必备的利器.虽然javaBean是java类,但是它也有自己 ...

  2. PowerShell 批量签入SharePoint Document Library中的文件

    由于某个文档库设置了编辑前签出功能,导致批量导入文件时这些文件默认的状态都被签出了.如果手动签入则费时费力,故利用PowerShell来实现批量签入Document Library中的文件. Reso ...

  3. 近期对招聘Android开发者的一些思考

    公司要招聘Android开发者,故面试了大概十来个人.由于是小公司,所以来的人大多是90后,比較年轻.90后大概二十三四岁吧,从简历上看都写了一到两年的工作经验. 也由于是小公司,所以对工作经验这些没 ...

  4. 第二篇:呈现内容_第一节:Control呈现

    一.Control的呈现过程 在上个章节““生死有序”的控件生命周期”中,我们提到Render是控件开发的主角,但在控件树的“合成模式(Composite)”部分这位主角却缺席了(戏份太多的缘由).哦 ...

  5. js 冷门的 label 语法

    https://github.com/Tencent/vConsole/blob/dev/src/lib/query.js#L142 https://www.cnblogs.com/hjbky/p/6 ...

  6. SG仿真常用模块

    workspace交互 配合gateway in/out,实现信号仿真与workspace的互联. 滤波器 可与FDATool同时使用,直接关联FDATool的参数,而不必输入FDATool的滤波器系 ...

  7. HTML框架标签的使用-&lt;frameset&gt;

    <html> <head> <title> frameset框架的使用-使用frameset框架进行布局 </title> <!-- 标签名称:f ...

  8. 临摹一个像素风格高楼shader

    原始效果地址:http://glslsandbox.com/e#40050.0 是一个的城市高楼感的shader,比较像素风 可以拿来做游戏背景,或者基于这个思路做一些别的效果 这个是我后来找的版本, ...

  9. 深入理解Linux内核-访问文件

    文件的访问模式:1.规范模式:2.同步模式:3.内存映射模式:4.直接I\O模式5.异步模式: 内存映射模式:1.共享型:在线性区页上的任何写操作都会修改磁盘上的文件:而且这种修改对映射了同一文件的所 ...

  10. Spark VS Presto VS Impala

    https://www.quora.com/What-is-the-difference-between-Spark-and-Presto