`

ibatis的selectKey学习

阅读更多

背景:
      在使用ibatis插入数据进数据库的时候,会用到一些sequence的数据,有些情况下,在插入完成之后还需要将sequence的值返回,然后才能进行下一步的操作。
      使用ibatis的selectKey就可以得到sequence的值,同时也会将值返回。不过对于不同的数据库有不同的操作方式。
      对于oracle:
      <insert id="insertUser" parameterClass="ibatis.User">
           <selectKey resultClass="long" keyProperty="id">
              select SEQ_USER_ID.nextval as id from dual
          </selectKey>
           insert into user
          (id,name,password)
          values
          (#id#,#name#,#password#)
      </insert>
       该句话执行完之后,传进来的参数User对象DO里的id字段就会被赋值成sequence的值。

     对于mysql
     <insert id="insertUser" parameterClass="ibatis.User">
          insert into user
          (name,password)
          values
          (#name#,#password#)
           <selectKey resultClass="long" keyProperty="id">  
             SELECT LAST_INSERT_ID() AS ID  
        </selectKey>  
      </insert>
       将selectKey放在insert之后,通过LAST_INSERT_ID()  获得刚插入的自动增长的id的值。

 

 

附上ibatis源码:

//-- Basic Methods
  /**
   * Call an insert statement by ID
   *
   * @param sessionScope - the session
   * @param id      - the statement ID
   * @param param   - the parameter object
   * @return - the generated key (or null)
   * @throws SQLException - if the insert fails
   */
  public Object insert(SessionScope sessionScope, String id, Object param) throws SQLException {
    Object generatedKey = null;

    MappedStatement ms = getMappedStatement(id);
    Transaction trans = getTransaction(sessionScope);
    boolean autoStart = trans == null;

    try {
       //开始事务
      trans = autoStartTransaction(sessionScope, autoStart, trans);

      SelectKeyStatement selectKeyStatement = null;
      if (ms instanceof InsertStatement) {
        selectKeyStatement = ((InsertStatement) ms).getSelectKeyStatement();
      }

      // Here we get the old value for the key property. We'll want it later if for some reason the
      // insert fails.
      Object oldKeyValue = null;
      String keyProperty = null;
      boolean resetKeyValueOnFailure = false;
      if (selectKeyStatement != null && !selectKeyStatement.isRunAfterSQL()) {
        keyProperty = selectKeyStatement.getKeyProperty();
        oldKeyValue = PROBE.getObject(param, keyProperty);
        generatedKey = executeSelectKey(sessionScope, trans, ms, param);
        resetKeyValueOnFailure = true;
      }

      StatementScope statementScope = beginStatementScope(sessionScope, ms);
      try {
        ms.executeUpdate(statementScope, trans, param);
      }catch (SQLException e){
        // uh-oh, the insert failed, so if we set the reset flag earlier, we'll put the old value
        // back...
        if(resetKeyValueOnFailure) PROBE.setObject(param, keyProperty, oldKeyValue);
        // ...and still throw the exception.
        throw e;
      } finally {
        endStatementScope(statementScope);
      }

      if (selectKeyStatement != null && selectKeyStatement.isRunAfterSQL()) {
        generatedKey = executeSelectKey(sessionScope, trans, ms, param);
      }
      //提交事务
      autoCommitTransaction(sessionScope, autoStart);
    } finally {
    //结束事务
      autoEndTransaction(sessionScope, autoStart);
    }

    return generatedKey;
  }
 

 

分享到:
评论

相关推荐

    ibatis 中sqlMap配置

    对于序列主键(如Oracle、DB2中的Sequence),需要在插入语句之前配置`&lt;selectKey&gt;`标签来获取主键值。例如: ```xml &lt;selectKey resultClass="long" keyProperty="sctId"&gt; SELECT SEQ_TEST.NEXTVAL FROM DUAL...

    Ibatis框架的核心知识点

    对于支持自动生成主键的数据库,Ibatis 提供了 `&lt;selectKey&gt;` 元素来获取新生成的主键值。在插入语句中,`&lt;selectKey&gt;` 通常置于 `&lt;insert&gt;` 元素内,用于在插入数据后获取数据库生成的主键。例如,对于Oracle,...

    ibatis_sqlMap的配置总结

    &lt;selectKey resultClass="long" keyProperty="sctId"&gt; SELECT SEQ_TEST.NEXTVAL FROM DUAL &lt;/selectKey&gt; insert into ... ``` 对于MySQL这样的自增主键数据库,则可以在插入语句之后通过`LAST_INSERT_ID()`来...

    ibatis环境搭建教程

    - **&lt;selectKey&gt;`**:用于生成主键,在某些数据库中可能需要在插入记录前先获取自增主键值。 - **&lt;insert&gt;`**:定义插入操作,可以与`parameterMap`结合使用以支持复杂的参数传递。 - **&lt;resultClass&gt;`**:定义查询...

    08_ibatis教程_sql主键生成方式.rar

    Ibatis通过`&lt;selectKey&gt;`标签可以与触发器配合使用,但在设计时需谨慎,因为触发器可能增加数据库的复杂性和维护成本。 7. **Hi-Lo算法**: Hi-Lo算法是一种在应用层面生成主键的方法,主要用于减少对数据库的访问...

    iBatis_SqlMap的配置总结[1]

    - **后获取主键**:对于自动增长的主键,如MySQL,`&lt;selectKey&gt;`可以在插入语句之后配置,利用`LAST_INSERT_ID()`获取自增主键。 5. **SQL参数(ParameterClass)**: - 插入操作:`parameterClass`指定传入参数...

    常用ibatis配置

    在iBatis中,可以使用&lt;selectKey&gt;标签来获取插入记录后的自增ID。例如,文档中显示的是在插入数据后,通过调用数据库的IDENTITY函数获取自增ID值,这个值被设置到resultClass为int类型的keyProperty“id”中。 2. ...

    IBATIS学习笔记

    ### IBATIS学习笔记知识点详解 #### 一、IBATIS简介 iBatis是一个用于Java的数据持久化框架,类似于Hibernate、JDO和EJB等技术。它的主要特点是将对象映射为SQL语句,这使得开发人员可以更加灵活地控制SQL的执行,...

    spring+ibatis集成文档

    select * from ibatis where name = #{value} &lt;/select&gt; &lt;!-- 根据ID查询记录 --&gt; &lt;select id="getUsersById" resultMap="ibatisTest"&gt; select * from ibatis where id = #{value} &lt;/select&gt; &lt;!-- 插入...

    ibatis学习资料

    - **&lt;selectKey&gt;自动生成键**:在执行INSERT语句前获取主键值。 - **&lt;select&gt;查询**:定义查询语句及其对应的映射规则。 - **插入**:定义INSERT语句及其对应的映射规则。 - **更新**:定义UPDATE语句及其对应的映射...

    iBATIS入门实例测试

    PRIMARY KEY (`id`) ); ``` **四、配置iBATIS** 1. 创建`SqlMapConfig.xml`配置文件,定义数据源、事务管理器以及SQL映射文件的位置。 ```xml ``` 2. 创建`UserMapper.xml`文件,...

    iBATIS有关资料

    对于主键自动赋值,iBATIS提供了`&lt;selectKey&gt;`标签来处理。在Oracle中,我们可以这样实现: ```xml &lt;selectKey keyProperty="id" resultClass="int"&gt; SELECT STU_SEQ.NEXTVAL FROM DUAL &lt;/selectKey&gt; INSERT ...

    ibatis批处理

    此外,`&lt;selectKey&gt;`标签用于在插入后获取自增主键的值,这对于某些数据库系统(如MySQL)是必要的。 总的来说,iBatis的批处理功能通过在代码和配置文件中灵活运用循环,使得开发者能够有效地处理大批量数据操作,...

    Ibatis简易教程

    在第二个例子中,我们将学习如何使用iBatis插入新数据。这通常涉及创建一个`insert`映射,然后在Java代码中调用`insert`方法。类似地,第三个例子会介绍如何删除数据,通过创建`delete`映射并调用`delete`方法。 总...

    ibatis技术总结

    13. **&lt;selectKey&gt;**:定义主键生成策略,常用于自动填充主键字段。 这些标签共同构成了iBatis的SQL映射规则体系,确保了框架能够正确执行各种数据库操作。 #### 7. SQL参数详解 iBatis支持多种类型的SQL参数,...

    08_传智播客ibatis教程_sql主键生成方式

    在Ibatis配置中,可以通过`&lt;selectKey&gt;`标签来指定使用序列生成主键。 2. **身份列(Identity)**:在MySQL、SQL Server等支持自动增长的数据库中,可以设置某一列为主键并自动递增。在Ibatis中,可以在插入语句后...

    ibatis_数据缓存

    值得注意的是,iBatis并不是以查询参数的Class的hashcode或toString方法作为Key的一部分,而是使用在sqlmap中使用的变量集合。 **缓存功能** - iBatis 支持`queryForObject`和`queryForList`方法的结果缓存,但其他...

    ibatis学习之搭建Java项目

    iBatis的selectKey语句用于检索自动增长的值。selectKey语句可以用于检索数据库中自动增长的值,使得开发者更加方便地实现业务逻辑。 iBatis是一个功能强大且灵活的ORM解决方案,能够大大简化Java项目中的数据库...

Global site tag (gtag.js) - Google Analytics