MyBatis的前身是IBatis,至于为什么从iBatis改成MyBatis以及代码为什么从Apache迁移到Google Code,大家可以参照
凤凰涅槃:从 iBatis 到 MyBatis。
这部分我们主要介绍MyBatis是什么,以及他是如何工作的。本系列的参考主要源自官方的文档《Data Mapper Guid-1.6.2》,我们将保持文档中对iBatis的叫法,英文好的可以直接上官方看哦。
1. 介绍
iBatis是一个数据映射框架,它使我们的Java/.Net应用程序能够更加简洁的跟数据库打交道。iBatis通过一系列的XML配置文件,解耦了对象和存储过程/SQL语句。与其他ORM工具相比,iBatis的最大优点就是简洁,包括其官方文档,也就92页。根据iBatis的宣称,其目的是使用20%的代码完成数据访问80%的功能。
iBatis的.Net版本的官方网址是:http://www.mybatis.org/dotnet.html,
源代码的svn路径是:http://mybatisnet.googlecode.com/svn/trunk
2. iBatis做了什么
iBatis所做的功能其实很简单,概括起来就是:我们提供数据库和对象,iBatis为我们提供映射关系。
3. iBatis如何工作
关于跟数据库打交道,我们知道每个开发平台都为我们提供了相应的方式,如Ado.Net,但是,对于开发人员来说,我们依旧发现一些比较难的问题:
- 将程序代码和SQL代码分隔开;
- 传递参数到程序类和解压输出结果;
- 将数据访问类从业务逻辑类从分割开;
- 缓存经常用到的数据直到数据源发生变化;
- 管理实务和线程
幸运的是,iBatis为我们解决了上述问题。
我们首先来看一张iBatis的工作流程图:
图片来源:官方的文档《Data Mapper Guid-1.6.2》
从这个流程图中,我们可以看出,iBatis的工作流大概是这样的:
- 提供一个输入参数,可以是自定义的类或者是原始的数据类型。这个参数可以在SQL语句或存储过程中动态的设置值。当然,如果我们没有必要在运行时值,输入参数是可以省略的;
- 在XML配置文件中,通过传递的参数和SQL语句或存储过程中的名字,进行映射。这一步是真正发生奇迹的步骤,iBatis将准备SQL语句/存储过程,用我们提供的参数设置运行时值,执行SQL语句/存储过程,然后返回结果;
- 对于更新(update/insert/delete)的情况,返回受影响的行数,对于查询的情况,一个对象,或者对象的集合将被返回,跟输入参数一样,返回值也可以是自定义的类,或者原始的类型。
4. iBatis是你项目的最佳选择吗?
对于项目中使用的任何技术,我们都会有个问题,这种技术适合我们的项目吗?它是不是最佳的选择呢?有没有更好的选择呢?对于iBatis,我们同样会有这样的问题,为了搞清这个问题,我们需要将iBatis跟具有同类功能的产品进行对比。
首先,iBatis是一个数据映射工具,他的功能是将数据库中查询出来的列映射到对象的属性(Property)中,如果你的项目是基于业务对象(business objects)的,那么iBatis应该是一个不错的选择;如果你的项目是基于多层架构的,那么iBatis甚至是一个更好的选择,因为这样业务层和UI层将很轻易的分割开。
基于上面的情况,另外一个好的选择方案是OR/M(Object/Relational Mapping Tool)工具,像NHibernate。OR/M为我们生成了大部分的SQL,这类工具之所以叫OR/M,是因为他们试图将一个对象图映射到关系模式中。
iBatis并不是一个OR/M工具,它所做的只是帮我们将对象映射到SQL语句/存储过程。如果我们的对象和表示对应的,那么OR/M将是一个不错的选择,但是,如果我们的对象存储的是关系视图,而不是简单的数据库表,那么OR/M就不一定是一个好的选择方案了。
总之,iBatsi是一个很好的选择方案,如果你:
- 不能够完全掌控数据库的实现,或者你想要访问一个被重构过的数据库的原始数据库;
- 组里面有数据库管理员或SQL专家
- 数据库是用来模型化问题域的,并且应用程序是首要职责是帮助客户端使用数据库模型