项目开发-iBatis源码阅读

近日工作内容是技术调研,研究iBatis使用方法及源码,源码阅读中总是能看到很多设计模式的影子,整理下来,获益匪浅。

ibatis client包结构

设计原则学习

1)  接口定义:上图中顶层接口定义的功能职责单一,聚在一个接口中,共同支撑一个功能。

2)  好莱坞原则:SqlMapClient的实现类,是顶层调用者,SqlMapExecutorDelegate类是底层的工作者,提供基本的功能,供上层调用。

3)  面向接口编程原则:SessionScope依赖的是抽象接口SqlMapClient、SqlMapExecutor、SqlMapTransactionManager、Transaction属性。

4)  iBatis提供给客户端使用的接口是SqlMapClientBuilder类的buildSqlMapClient方法,使用的是建造者模式。SqlMapClient的实例对象的创建,关联关系复杂,在buildSqlMapClient的build方法中完成了对象的属性组装,并将最终的完整对象返回给客户端使用。

5)  面向接口编程的原则,容易被忽视,有的项目直接就写Service的实现层。在集成Spring的项目开发过程中服务层的接口抽象是有必要的,MVC三层结构模式下,action和dao层代码结果通常较固定,如果业务流程有变更,只需要修改中间的服务层。服务层保持接口的编程原则,提供不同的实现,可以使得应用更灵活。

例如:89项目中英文不同模式下,某个操作的流程有差异,那么我们可以针对同一个接口提供两种实现方式,根据项目部署的语言,配置所引用的实现类,而调用代码仅仅依赖的是接口类型。

Spring的bean管理,最初给我印象深刻的一点就是:它可以针对同一个id的bean,根据需要设置不同的class属性(即实现类),而所有依赖该id的bean的地方,本质上是依赖同一个抽象类型的。这也是对OOP面向抽象编程原则的支持。

一条SQL的执行时序图

关联类的创建

1)SqlMapClient实例的创建,由SqlMapClientBuilder类提供静态方法,解析SqlMapClientConfig.xml配置文件创建一个SqlMapConfiguration实例对象,并返回它的SqlMapClientImpl成员变量值。

2)SqlMapClientImpl关联了一个ThreadLocal属性,存储的值是SqlMapSessionImpl对象,它的getLocalSqlMapSession()方法提供了获取SqlMapSessionImpl实例的方法,如果ThreadLocal的get方法能取到值,则返回,如果没有则新建一个SqlMapSessionImpl对象,并set到ThreadLocal中,再返回该对象。

3)SqlMapSessionImpl类关联了一个SessionScope、SqlMapExecutorDelegate,SqlMapSessionImpl类的构造依赖一个SqlMapClient参数,如下:

  public SqlMapSessionImpl(SqlMapClientImpl client) {
    this.delegate = client.getDelegate();
    this.sessionScope = this.delegate.beginSessionScope();
    this.sessionScope.setSqlMapClient(client);
    this.sessionScope.setSqlMapExecutor(client);
    this.sessionScope.setSqlMapTxMgr(client);
    this.closed = false;
  }

iBatis的不足之处

我们使用iBatis实现DAO层代码时,通常DAO类需要写大量重复、类似的代码,形如:

  //DAO of Person
  public static void insertPerson (Person person) throws SQLException {
	    sqlMapper.insert("Person.insert", person);
  }

  public static void deletePerson (int id) throws SQLException {
    sqlMapper.delete("Person.deleteById", id);
  }

  public static List selectAllPerson () throws SQLException {
	  return sqlMapper.queryForList("Person.selectAll");
  }

  public static Person selectById  (int id) throws SQLException {
	  return (Person) sqlMapper.queryForObject("Person.selectById", id);
  }

这些重复的CRUD的调用,其实本质上只需要提供statement id,及调用参数。这也是myBatis对iBatis的改进,myBatis简化了开发者编写DAO层的工作,将上述调用过程直接与sqlMap配置文件中的statement一一对应,大大简化了DAO的内容,减少了Code工作量。    例如:

DAO类定义:

sqlMap映射配置:

所以,个人更偏好myBatis一些,DAO层在必要的时候可以自己实现,也可以直接通过接口和配置完成,方便又简单。简单项目中,很少涉及到设计模式的运用,再加上公司开发流程不规范,写代码就有些信马由缰,甚至为了赶进度而忽略了基本的编码规范了。阅读框架源码,看到遍地都是设计模式的思想,还是很受启发的。

时间: 2024-10-13 22:58:51

项目开发-iBatis源码阅读的相关文章

【转】Java开源项目源码阅读方法及二次开发方法

一直以来,都想要阅读某些Java开源项目的源代码,甚至想要修改某些代码,实现对开源项目进行二次开发的目的.但总是不知从何入手,直接将开源项目的源代码导入Eclipse,总是会报很多错误,而无法编译.可以直接通过Eclipse打开开源项目的源代码,至少能够达到可视化源码阅读.源码导航的目的,还是能在一定程度上解决源码阅读不爽的问题,因为直接打开并没有改变源文件项目的目录结果,对于修改过后的代码,可以通过命令行找到源文件项目目录,并使用mvn或者ant对项目进行编译,再查看修改后的项目是否正确. 由

如何阅读Java源码 阅读java的真实体会

刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃<Core Java>,你是很难从中吸收到营养的,特别是<深入Java虚拟机>这类书,别人觉得好,未必适合现在的你. 虽然Tomcat的源码很漂亮,但我绝不建议你一开始就读它.我文中会专门谈到这个,暂时不展开. 强烈

Java源码阅读的真实体会

原文:http://zwchen.iteye.com/blog/1154193 刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃<Core Java>,你是很难从中吸收到营养的,特别是<深入Java虚拟机>这类书,别人觉得好,未必适合现在的你. 虽然Tomcat的

[收藏] Java源码阅读的真实体会

收藏自http://www.iteye.com/topic/1113732 刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃<Core Java>,你是很难从中吸收到营养的,特别是<深入Java虚拟机>这类书,别人觉得好,未必适合现在的你. 虽然Tomcat的源码

ThinkPHP源码阅读2-----C函数配置文件详解

ThinkPHP的配置非常灵活,可自定义加载.大概看了一下,一共有这几个地方会加载配置文件,方便以后的读取 /** * 获取和设置配置参数 支持批量定义 * * @param string|array $name * 配置变量 * @param mixed $value * 配置值 * @return mixed */ function C($name = null, $value = null) { static $_config = array (); // 无参数时获取所有 if (emp

Spring源码阅读:Spring如何支持各种ORM框架

为了让开发程序更容易,到现在为止,已经有很多ORM框架了,例如:JPA,JDO,Hibernate,Mybatis(之前版本是IBatis)等等.也正因为已经有这么多优秀的ORM框架,Spring团队并没有自己开发一套ORM框架,而是对这些框架都进行了支持,让这些框架在Spring环境下可以得到完全的应用. 通常,在Spring环境下使用这些ORM框架时,都会通过一个Template来使用.Spring对这些框架的集成是这样的: 例如Hibernate,在使用Hibernate时(没有在Spri

SDWebImage源码阅读-第三篇

这一篇讲讲不常用的一些方法. 1 sd_setImageWithPreviousCachedImageWithURL: placeholderImage: options: progress: completed: 取得上次缓存的图片,然后作为占位图的参数再次进行一次图片设置. - (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options

源码阅读系列:源码阅读方法

一.前提条件 1.纯熟扎实的语言基础 ??如果你学java,却对反射.泛型.注解一直半解,还是不要去读什么框架了,回去把java基础打扎实反而对你自身更有益. 2.UML能力 ??在软件工程中,UML在软件的不同生命周期阶段扮演着非常重要的角色,没有好的UML水平,面对大型的项目源码会束手无策. 3.对业务的理解 ??如果你要阅读的项目业务性比较强,事先对业务有一定的了解是必须的. 4.设计模式.重构的掌握 ??编程语言什么的没什么好说.着重提一个:设计模式由于Android源代码用到各种各样的

【 js 基础 】【 源码学习 】backbone 源码阅读(一)

最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-study)进行参考交流,有详细的源码注释,以及知识总结,同时 google 一下 backbone 源码,也有很多优秀的文章可以用来学习. 我这里主要记录一些偏设计方向的知识点.具体从以下几个方面入手:1.MVC 框架2.观察者模式 以及 控制反转 一.MVC 框架所谓 MVC 框架,包含三个部分,mod