`
tjuxiaoqiang
  • 浏览: 25993 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ibatis中selectKey的用法与源码

阅读更多
最近用到插入oracle数据库时,主键id是sequnce自动生成,具体写法如下
对于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>
对于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>

上面是两种数据库的实现。

下面我们看看源码是如何做的
//-- 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;
      //对于oracle适用于执行insert之前执行selectKey获取id值
      if (selectKeyStatement != null && !selectKeyStatement.isRunAfterSQL()) {
        keyProperty = selectKeyStatement.getKeyProperty();
        oldKeyValue = PROBE.getObject(param, keyProperty);
        //sequnce获取id的值
        generatedKey = executeSelectKey(sessionScope, trans, ms, param);
        resetKeyValueOnFailure = true;
      }

      StatementScope statementScope = beginStatementScope(sessionScope, ms);
      try {
        //执行sql语句
        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);
      }
      //对于mysql适用于执行完insert后,获取id值
      if (selectKeyStatement != null && selectKeyStatement.isRunAfterSQL()) {
        generatedKey = executeSelectKey(sessionScope, trans, ms, param);
      }
      //提交事务
      autoCommitTransaction(sessionScope, autoStart);
    } finally {
    //结束事务
      autoEndTransaction(sessionScope, autoStart);
    }

    return generatedKey;
  }
0
1
分享到:
评论

相关推荐

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    解析这个XML文件的过程涉及到DOM或SAX解析器,源码中这部分功能通常在`org.apache.ibatis.io.Resources`和`org.apache.ibatis.builder.Configuration`类中实现。 三、Executor执行器 Executor执行器是iBatis的核心...

    iBATIS2.3.4 jar包及源码

    在本主题中,我们关注的是iBATIS 2.3.4版本的jar包及其源码。 首先,`ibatis-2.3.4.jar` 是包含iBATIS核心库的二进制文件,用于在Java应用中集成iBATIS。这个jar包包含了所有必要的类和资源,如SQL映射接口、数据...

    ibatis源码

    通过分析Ibatis的源码,我们可以了解其内部如何处理SQL映射、参数绑定、结果映射等核心任务,以及它如何与各种框架(如Struts)协同工作。这对于我们优化数据库访问、理解和解决实际开发中的问题都有极大的帮助。...

    iBATIS框架源码剖析源码

    2. **SqlMap接口和SqlMapClient**:SqlMap是与数据库交互的接口,而SqlMapClient是其实现,提供了执行SQL映射文件中的SQL语句的方法,如select、insert、update和delete。 3. **动态SQL**:iBATIS支持动态SQL,允许...

    iBATIS框架源码剖析

    iBATIS框架源码剖析

    IBatis.Net流风通用管理框架源码.rar

    【描述】描述中提到的"IBatis.Net流风通用管理框架源码"意味着这是一个包含了整个框架的源代码,用户可以深入理解其内部工作原理,同时也方便开发者进行二次开发或自定义调整。通用管理框架通常包括用户认证、权限...

    ibatis2.3源码

    【描述】中的"可以直接与myeclipse进行关联"意味着该源码包可以方便地在MyEclipse集成开发环境中导入和使用。MyEclipse是一款强大的Java EE集成开发工具,支持直接导入外部项目源码,便于开发者进行代码阅读、学习和...

    ibatis源码+api文档+jar包

    1. 源码阅读:源码中包含Ibatis的所有核心组件,如SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession等。通过阅读源码,可以深入了解其工作原理,例如如何加载配置文件、如何创建和管理SqlSession、如何执行...

    iBatis框架源码剖析

    iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。于2010年6月16号被谷歌托管,改名为MyBatis。是一个基于SQL映射支持Java和·NET的持久层框架。

    ibatis 2.3.4 源码

    ibatis 2.3.4 的源码 public abstract Object insert(String paramString, Object paramObject) throws SQLException; public abstract Object insert(String paramString) throws SQLException; public ...

    ibatis框架源码剖析光盘资料

    在这个压缩包中,包含的文件是《ibatis框架源码剖析》的全文内容。 ibatis作为一个轻量级的Java持久层框架,其核心功能在于将SQL语句与Java代码解耦,提供了一种灵活的数据访问接口。它在设计上采用了基于XML或注解...

    spring+ibatis的Java项目demo项目源码

    本项目源码提供了一个完整的 Spring + iBATIS 的 Demo 示例,旨在帮助开发者理解和学习如何将这两个框架集成到一个Java项目中。下面将详细介绍这个项目的相关知识点。 **Spring 框架** Spring 是一个全面的后端开发...

    ibatisDemo 入门源码

    《IbatisDemo入门源码详解》 IbatisDemo是一个典型的基于Ibatis框架的入门示例,它为我们展示了如何在Java项目中使用Ibatis进行数据库操作。Ibatis,一个优秀的持久层框架,它允许开发者将SQL语句直接写在配置文件...

    最新ibatis 源码

    ibatis源码 学习参考 对于学习ibatis很有帮助

    springMVC+ibatis的源码

    通过学习和分析这个源码,开发者不仅可以深入了解SpringMVC和iBatis的协同工作原理,还可以掌握如何在Eclipse这样的IDE中配置和运行这样的项目。这有助于提升对MVC模式的理解,提高数据库操作的能力,以及熟练运用...

    Ibatis和Mybatis实例源码

    《Ibatis与Mybatis源码解析》 Ibatis和Mybatis是两个著名的Java持久层框架,它们在数据库操作中提供了高效、灵活的解决方案。本文将深入探讨这两个框架的源码,帮助开发者理解其内部机制,提升Java编程能力。 首先...

    Ibatis框架三层架构项目源码.rar

    Ibatis框架是一个轻量级的Java持久层框架,它...通过分析源码,开发者能够深入理解Ibatis如何处理数据访问,如何与Web层交互,以及如何组织和管理数据库操作。同时,这样的分层结构也有助于代码的可维护性和扩展性。

Global site tag (gtag.js) - Google Analytics