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

ibatis代码分析——简要过程说明

阅读更多

   不管是使用spring框架集成ibatis还是直接使用ibatis,ibatis经历的第一步都是装载SqlMapConfig.xml文件,由于本文只是分析一下ibatis的代码,所以已单纯使用ibatis为例:

public static void main(String[] args) {
        // TODO Auto-generated method stub
        String resource = "dal/sqlmap-config.xml";
        Reader reader = null;
        try {
            reader = Resources.getResourceAsReader(resource);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

//        SqlMapClientBuilder xmlBuilder = new SqlMapClientBuilder();
        SqlMapClient sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);

        try {
            sqlMapClient.startTransaction();
            User user = new User();
            user.setName("tony");
            user.setSex(0);

            sqlMapClient.insert("insertUser", user);
            sqlMapClient.commitTransaction();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally{
            try {
                sqlMapClient.endTransaction();
                
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
}

 SqlMapClientBuilder会制造一个sqlMapClient,所以是我们使用ibatis的入口。

一旦我们拥有了这个入口,我们就能执行sql操作了,以上例中的sqlMapClient.insert("insertUser", user) 为例来说明执行这条sql的时候发生了一些什么事情。

  • SqlMapExecutor

sqlMapClient拿着一个statement的id和一个参数对象跑到SqlMapExecutor面前说,你帮我处理一下这两个东西。SqlMapExecutor说好的,然后转身把这个任务转发给了它的玄孙:

SqlMapClientImpl。SqlMapClientImpl看着太公交给他的任务,觉得由他自己来做不是很保险,于是又把它交给了同宗的叔叔SqlMapSessionImpl,让这个苦命的叔叔在他自己的会话里把这件

事情给办好。而这位叔叔对于这份苦差事非常厌倦,就把它给外包了,就这样通过层层的外包,最后来到了GeneralStatement 手上。

  • GeneralStatement
public int executeUpdate(RequestScope request, Transaction trans, Object parameterObject)
      throws SQLException {
    ErrorContext errorContext = request.getErrorContext();
    errorContext.setActivity("preparing the mapped statement for execution");
    errorContext.setObjectId(this.getId());
    errorContext.setResource(this.getResource());

    request.getSession().setCommitRequired(true);

    try {
      parameterObject = validateParameter(parameterObject);

      Sql sql = getSql();

      errorContext.setMoreInfo("Check the parameter map.");
      ParameterMap parameterMap = sql.getParameterMap(request, parameterObject);


      errorContext.setMoreInfo("Check the result map.");
      ResultMap resultMap = sql.getResultMap(request, parameterObject);


      request.setResultMap(resultMap);
      request.setParameterMap(parameterMap);

      int rows = 0;

      errorContext.setMoreInfo("Check the parameter map.");
      Object[] parameters = parameterMap.getParameterObjectValues(request, parameterObject);


      errorContext.setMoreInfo("Check the SQL statement.");
      String sqlString = sql.getSql(request, parameterObject);

      errorContext.setActivity("executing mapped statement");
      errorContext.setMoreInfo("Check the statement or the result map.");
      rows = sqlExecuteUpdate(request, trans.getConnection(), sqlString, parameters);


      errorContext.setMoreInfo("Check the output parameters.");
      if (parameterObject != null) {
        postProcessParameterObject(request, parameterObject, parameters);
      }

      errorContext.reset();
      sql.cleanup(request);
      notifyListeners();
      return rows;
    } catch (SQLException e) {
      errorContext.setCause(e);
      throw new NestedSQLException(errorContext.toString(), e.getSQLState(), e.getErrorCode(), e);
    } catch (Exception e) {
      errorContext.setCause(e);
      throw new NestedSQLException(errorContext.toString(), e);
    }
  }

 其中标为橙色部分的是几个关键点。ParameterMap负责将sql的insert/update/select/delete参数做映射,ResultMap负责将sql语句执行的结果映射到具体的java对象。

parameterMap.getParameterObjectValues(reqeust,parameterObject)将sql语句中的?与参数对应起来,比如:insert into userinfo(name,sex) values(?,?)就有[tony, 0]与之对应。

剩下的事情就变得容易了,这时SqlExecutor 跳出来说,下面就交给我了。

  • SqlExecutor

SqlExecutor一手拿着sql,一手拿着参数,肩上挂着请求,头上顶着链接叫嚣着,快快,快把PreparedStatement给我准备好,我要生了。

public int executeUpdate(RequestScope request, Connection conn, String sql, Object[] parameters) throws SQLException {
    ErrorContext errorContext = request.getErrorContext();
    errorContext.setActivity("executing update");
    errorContext.setObjectId(sql);
    PreparedStatement ps = null;
    setupResultObjectFactory(request);
    int rows = 0;
    try {
      errorContext.setMoreInfo("Check the SQL Statement (preparation failed).");
      ps = prepareStatement(request.getSession(), conn, sql);
      setStatementTimeout(request.getStatement(), ps);
      errorContext.setMoreInfo("Check the parameters (set parameters failed).");
      request.getParameterMap().setParameters(request, ps, parameters);
      errorContext.setMoreInfo("Check the statement (update failed).");
      ps.execute();
      rows = ps.getUpdateCount();
    } finally {
      closeStatement(request.getSession(), ps);
    }
    return rows;
  }

 于是乎数据就被生了下来。

 

1
2
分享到:
评论
2 楼 lord_is_layuping 2010-01-22  
 
1 楼 phpxiaoxin 2009-05-31  
哇哈哈,原来是这么生出来的。定一下,我当个接生婆,再去看一下。

相关推荐

    ibatis代码自动生成

    代码生成只是开发过程中的一个环节,生成后的代码还需要进行优化和维护。比如,对于复杂的业务逻辑,可能需要在Mapper XML文件中编写自定义的SQL;对于性能敏感的场景,可能需要对生成的SQL进行优化。 7. 集成到...

    IBatis 代码生成工具

    在这个场景中,我们讨论的是一个针对IBatis的代码生成工具,它能帮助开发者快速生成与IBatis框架相配套的XML配置文件。 这个名为"IBatis 代码生成工具"的程序是基于.NET平台构建的,这意味着它利用了Microsoft的...

    ibatis代码自动生成代码程序

    【ibatis代码自动生成代码程序】是一个实用工具,旨在帮助开发者快速生成基于iBATIS框架的Java代码。iBATIS,作为一个数据访问层框架,它允许程序员将SQL语句与Java代码分离,提供了一种简单但强大的方式来处理...

    Ibatis代码生成器

    注:附带模板,使用手册,环境配置等。 1)、数据库类型选择:目前支持Oracle和Mysql两种数据库语句的生成,默认是Oracle。 2)、要生成建表语句, a)、请在“数据库定义Excel文件路径”中选择对应的文件, ...

    ibatis代码生成工具

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

    ibatIS代码生成插件

    在开发过程中,手动编写重复的CRUD代码是一项繁琐的工作,而ibatIS代码生成插件正是为了解决这一问题。它能够根据数据库中的表结构自动生成对应的Java实体类、Mapper接口及XML配置文件、Service接口及实现类、...

    ibatis代码自动生成工具项目

    自动生成ibatis所需文件,达到快速查询,减少工作量的效果 CorpChannelDAO.java CorpChannelDAOimpl.java CorpChannel.java CorpChannelExample.java game_channel__corp_channel_SqlMap.xml 详情步骤请见...

    Castle+ibatis代码示例

    在这个"Castle+ibatis代码示例"中,我们将深入探讨这两个框架如何协同工作,以实现更加灵活、可维护的软件架构。 首先,让我们了解Castle项目。Castle Project是一个.NET平台上的开源开发工具集,它包含多个组件,...

    ibatis代码生成器

    自动生成action- mapper层所有增删改查代码,使用方便简单

    IBATIS3代码生成器

    【标题】"IBATIS3代码生成器"是一款专为基于IBATIS3框架的项目设计的工具,它能够自动生成常见的SQL映射文件、Java DAO接口和实现类,大大提高了开发效率,降低了手动编写这些代码的工作量。该工具的核心理念是通过...

    Spring MVC Ibatis Bean 根据mysql数据表——代码生成工具

    标题中的“Spring MVC Ibatis Bean 根据mysql数据表——代码生成工具”就是这样的一个工具,它能够根据MySQL数据库中的表结构,快速生成符合Spring MVC和Ibatis框架的代码。 Rapid-generator-0.2v可能是这个工具的...

    ibatis —— docs.zip

    MyBatis生成器(MBG)是MyBatis MyBatis 和iBATIS的代码生成器。它将为MyBatis的所有版本以及版本2.2.0之后的iBATIS生成代码。它将内省一个数据库表(或...您仍将需要手工编写SQL和对象代码以进行联接查询或存储过程。

    ibatis源代码项目

    总结,iBatis的源代码分析是一个深入了解其工作原理、优化性能以及定制化开发的重要途径。通过解析SqlSessionFactory、SqlSession、Mapper等核心组件,以及XML映射文件解析和动态SQL的实现,我们可以更好地运用...

    iBatis代码生成器

    总的来说,iBatis代码生成器是开发过程中的得力助手,它能够帮助开发者快速生成基础代码,从而更加专注于业务逻辑的实现,提高开发效率。而"WindowsControlLibrary.dll"和"CodeCreator.exe"则是这个工具的组成部分,...

    ibatis调用oracle存储过程分页

    ibatis调用oracle存储过程分页

    利用ibatis 生成代码

    利用ibatis框架生成代码的核心优势在于它极大地减少了开发过程中重复性的体力劳动。通过自动生成与数据库交互的代码,开发者能够更加专注于业务逻辑的实现,而无需被繁琐的数据访问细节所困扰。这不仅提高了开发效率...

    ibatis自动生成代码工具

    本工具的主要功能是:根据您指定的数据库地址选择表或自定义属性信息(文件),生成对应的pojo类和ibatis配置文件; 3. 目前支持的较好的是mysql数据库,oracle的也支持,但还没经过测试,故暂不提供此功能选项...

    mybatis和ibatis代码生成工具

    MyBatis和iBatis是两个著名的Java持久层框架,它们都致力于简化数据库与Java代码之间的交互。在Java开发中,代码生成工具可以极大地提高开发效率,减少手动编写重复的CRUD(创建、读取、更新、删除)操作。本压缩包...

    ibatIS调用存储过程

    总结,ibatIS调用存储过程涉及了框架配置、Mapper接口设计、XML映射文件编写、Java代码实现等多个方面,理解这些知识点对于在实际项目中灵活运用ibatIS调用存储过程至关重要。通过熟练掌握这些技能,开发者可以更...

    Ibatis调用存储过程调用存储过程

    此段代码展示了如何在Java层通过Ibatis调用上述定义的存储过程`shareDeviceToPerson`。首先,创建一个`Map`对象来存储过程参数,并设置输入参数;然后通过`getSqlMapClientTemplate().insert()`方法执行存储过程;...

Global site tag (gtag.js) - Google Analytics