MyBatis知多少(2)

MyBatis从目前最流行的关系数据库访问方法中吸收了大量的优秀特征和思想,并找出其中的协同增效作用。下图展示了MyBatis框架是如何吸收我们在多年使用不同方式进行数据库集成的 开发过程中所学到的知识,并将其中最优秀的思想结合起来,形成这个混合型解决方案的。

接下来的几节将讨论这些不同的数据库访问方法,以及iBATIS从每种方法中汲取的优秀思想。

SQL

MyBatis的核心是SQL。从根本上说,所有的关系数据库都支持SQL,并将它作为与数据库交互的主要方式。SQL是一种简单的、非过程化的语言,用于操纵数据库,其实SQL包含两种语言。

第一种就是数据定义语言(Data Definition Language, DDL),其中包含像CREATE、DROP以 及ALTER这样的语句。这些语句用于定义数据库数据及其设计,包括表(table)、列(column)、 索引(index)、约束(constraint)、过程(procedure)以及外键关系(foreign key relationship)。iBATIS 并不直接支持DDL。虽然许多人的确通过iBATIS成功地执行了DDL,但我们不推荐这样做,因为 DDL通常应该由某个数据库管理小组拥有并控制,应用程序的开发人员无权操纵它。

SQL所包含的第二种语言就是数据操纵语句(Data Manipulation Language,DML)。DML包

括像SELECT、INSERT、UPDATE以及DELETE这样的用于直接操纵数据的语句。最初,SQL被设计 为一种简单得足以让终端用户(end user)可以使用的语言。按照这种设计思想,图像用户界面 就完全不需要了,甚至连应用程序也不需要了。当然,这种情况得回溯到当年那个永远是“黑屏 上闪着光标”的时代了,在那个时代我们才可以对终端用户报以更多的期望。

今非昔比,数据库已经变得太复杂了,不能指望终端用户通过SQL来直接操纵数据库了。你 能想象这样的情况吗:将一大堆SQL语句交给会计部门,然后对他说,“就这些了,查找一下 BSHEET表你就能找到所需要的信息。”这简直是不可能的了。

仅仅SQL本身已经再也不可能作为终端用户的一个有效接口 了,但对于开发人员来说SQL仍 然是一个非常强大的工具。SQL是唯一具有完整的数据库访问功能的方法,所有其他的工具都不 过是该完整功能的一个子集。正是这个原因,MyBatis完全支持SQL,并将它作为关系数据库访问 的主要方式。同时,MyBatis也具有许多其他方法的优点,这些方法包括存储过程和对象/关系映 射工具。

1.老式存储过程

存储过程(stored procedure)也许可以算是为关系数据库编写应用程序的最古老的方式了。 许多遗留系统使用的都是我们现在称为“两层(two-tier)”的设计。“两层设计”包括一个富客户 端界面来直接调用数据库中的存储过程。这些存储过程中可能包含可用于操纵当前数据库的 SQL。除了SQL,这些存储过程还可能含有(通常也的确含有)业务逻辑。与SQL不同,编写这 些存储过程时使用的语言是过程化的,具有像条件语句和迭代语句这样的流程控制语句。事实上, 仅仅使用存储过程就可以创建一个完整的应用程序。许多软件开发商也开发了像Oracle Forms、 PowerBuilder和Visual Basic这样的富客户端工具来支持“两层”的数据库应用程序的开发。

“两层应用程序”的最大问题在于其性能和扩展性。虽然数据库的功能的确非常强大,但它 们往往未必是处理成百上千甚至上百万个用户访问的最佳选择。对于现代Web应用程序来说,对 扩展性的需求并不少见。数据库在并发访问量、硬件资源以及网络套接字等方面的限制,将使得 这种“两层”架构在需要扩大规模时面临失败的危险。此外,“两层应用程序”的部署也是一场 噩梦。除了通常的富客户端部署问题外,复杂的运行时数据库引擎也需要部署到客户端机器上去。

2.现代存储过程

在某些圈子中存储过程仍被认为是三层(three-tier)和八层(N-tier)应用程序(例如Web应 用程序)的最佳实践。但现在存储过程通常被当作来自中层(middle tier)的远程过程调用(remote procedure call, RPC),并且许多性能方面的约束也可以通过建立间接池和数据库资源管理等方式 解决了。在现代的面向对象的应用程序中,存储过程仍然是实现完整的数据访问层的一个行之有 效的设计选择。存储过程在性能方面的确具有优势,因为它们总是能够比任何其他的解决方案更 快地完成数据库中的数据操作。但是,还有比性能更需要关注的问题。

将业务逻辑放在存储过程中通常都被认为是一个糟糕的设计。最主要的原因就在于存储过程 的开发很难符合现代应用程序的架构。它们难以编写、难以测试、同时也难以部署。更糟糕的是, 现代企业中数据库通常由其他的数据库管理小组拥有,并且受到最为严格的变更控制的保护。它 们通常无法快速变更以适应现代软件开发方法学的需要。此外,要用存储过程来实现完整的业务 逻辑,其自身也存在某些限制。如果业务逻辑需要访问其他的系统、资源或用户界面,存储过程 很可能就无法处理所有这些逻辑了。现代应用程序非常复杂,需要更加通用的语言,而不是像存 储过程这样仅仅优化了数据操纵能力的专用语言。为解决这个问题,有些开发商在它们的数据库 引擎中嵌入了像Java这样的更加强大的语言,来编写更加强壮的存储过程。但这其实根本没有解 决问题,它只会使得应用程序与数据库的边界变得更加模糊,并为数据库管理员带来新的负担: 他们现在需要开始担心数据库中的Java和C#了。对于解决问题,这实在是一个错误的工具。

软件开发中经常出现的一个场景就是矫枉过正(overcorrection)。当发现问题时,尝试的第一个解决方案往往是完全相反的方法。这非但没有解决问题,其结果往往是引入等量的完全不同的新问题。例如我们下面要讨论的内联SQL。

系列文章:

MyBatis知多少(1)

时间: 2024-10-12 06:29:36

MyBatis知多少(2)的相关文章

MyBatis知多少(18)MyBatis系统

小型.简单系统 小型应用程序通常只涉及单个数据库,只有一些相当简单的用户界面和领域模型.它的业务逻辑非常简单,甚至对一些简单的CRUD (Create, Read, Update, Delete:增删查改)应用程序来说可能根本就不存在.MyBatis之所以非常适合于小型应用程序,有3个原因. 第一,MyBatis本身就很小并且简单.它不需要服务器或者其他任何类型的中间件.根本不需要任何额外的基础设施.MyBatis也没有任何第三方依赖.MyBatis的最简安装只需 要2个JAR文件,总计不过37

MyBatis知多少(17)MyBatis和JDBC

有了MyBatis,就不再需要编写JDBC代码了.像JDBCT这样的API的确非常强大,但使用起来总不免觉得太过繁琐.代码清单给出了一个使用JDBC的示例. 从这个例子中很容易看出,JDBC API会产生许多额外的开销.尽管如此,每一行代码又都是必不可少的,所以要减少代码量还真不是一件容易的事情.最多也只不过是将其中的一些代码 挪到某个实用方法中,最明显的就是那些关闭资源(如PreparedStatement和 ResultSet)的代码. 其实,如果使用MyBatis,MyBatis在后台也是

MyBatis知多少(11)企业数据库

企业数据库比应用程序数据库更大,其外部影响也更大.它们与其他系统之间存在更多的关系,包括依赖关系和被依赖关系.这些关系可能是Web应用程序与报表工具之间的,但也很有可 能是与其他的复杂系统和数据库的接口.在企业数据库中,不仅仅存在远比应用程序数据库多得 多的外部接口,而且这些接口的作用方式也大不相同.一些接口可能是用于每晚批量加载数据的 接口,其他的则可能是实时事务处理接口.由于这些原因,企业数据库本身可能实际上就是由不止一个数据库组成的.下图从较高的层次描绘了一个企业数据库的例子. 企业数据库

MyBatis知多少(3)

解决存储过程固有限制的方法之一就是将SQL嵌入到更加通用的语言中去.与存储过程将业务逻辑移入数据库相反,内联SQL将SQL从数据库移入了应用程序代码.这就使得SQL语句可以直接与语言进行交互.从某种意义上说,SQL成为了该语言的一个特性.有很多语言具有这种“特 性”,包括COBOL.C.甚至Java.以下就是Java中SQL的一个示例: String name; Date hiredate; #sql { SELECT emp_name, hire_date ,hiredate FROM emp

MyBatis知多少(25)动态SQL

使用动态查询是MyBatis一个非常强大的功能.有时你已经改变WHERE子句条件的基础上你的参数对象的状态.在这种情况下的MyBatis提供了一组可以映射语句中使用,以提高SQL语句的重用性和灵活性的动态SQL标签. 所有的逻辑是使用一些额外的标签放在:XML文件.下面是一个例子,其中的SELECT语句将努力在两个方面: 如果想传递一个ID,然后它会返回所有与该ID的记录, 否则,将返回所有雇员ID为NULL的记录. <?xml version="1.0" encoding=&q

MyBatis知多少(17)MyBatis读取操作

上篇展示了如何使用MyBatis执行创建操作表.本章将告诉你如何使用MyBatis来读取表. 我们已经在MySQL下有EMPLOYEE表: 1 CREATE TABLE EMPLOYEE ( 2 id INT NOT NULL auto_increment, 3 first_name VARCHAR(20) default NULL, 4 last_name VARCHAR(20) default NULL, 5 salary INT default NULL, 6 PRIMARY KEY (i

MyBatis知多少(19)MyBatis操作

若要使用iBATIS执行的任何CRUD(创建,写入,更新和删除)操作,需要创建一个的POJO(普通Java对象)类对应的表.本课程介绍的对象,将“模式”的数据库表中的行. POJO类必须实现所有执行所需的操作所需的方法. 我们已经在MySQL下有EMPLOYEE表: 1 CREATE TABLE EMPLOYEE ( 2 id INT NOT NULL auto_increment, 3 first_name VARCHAR(20) default NULL, 4 last_name VARCH

MyBatis知多少(14)分散的数据库系统

任何一个重要的数据库无疑都会拥有不止一个依赖者.即使该数据库只是简单地被两个Web 应用程序所共享,也有许多事情需要考虑.假设有一个名为网上购物车的Web应用程序,它使用了一个包含类别代码的数据库.就网上购物车来说,类别代码是静态的,永远不会变化,所以该应用程序高速缓存了这些代码以提高性能.现在再假设有一个名为网上管理器的Web应用程序,它是用于更新类别代码的.这个网上管理器 应用程序运行在一个不同的服务器上,是一个完全独立的程序.那么,设想一下,当网上管理器更新了一个类别代码时,网上购物车如何

MyBatis知多少(10)应用程序数据库

应用程序数据库往往是最小.最简单.也最易于使用的数据库.这种数据库往往是我们这些开发人员通常不介意使用甚至非常乐意使用的.应用程序数据库通常与我们的应用程序处于同一个项目中,两者一齐设计和实现.正是因为这个原因,应用程序数据库的设计往往存在非常大的自由度,它也最有可能与我们的特定应用程序完美匹配.应用程序数据库的对外影响是最小的, 因为它通常只有一两个对外接口.第一个接口连接到我们的应用程序,而第二个接口可能就是一个简单的报表框架或报表工具.下图从较高的层次展示了一个应用程序数据库以及它与其他系

MyBatis知多少(9)不同类型的数据库

并非所有的数据库都如此复杂,需要使用昂贵的数据库管理系统以及企业级的硬件.一些数 据库其实非常小,足以运行在一台老式的PC机上.所有的数据库都是不一样的.它们有各自不 同的需求和不同的挑战.iBATIS可以帮助你使用几乎任何类型的关系数据库,但了解你使用的数 据库究竟是哪种类型通常也是非常重要的. 数据库的划分更多是依据它与其他系统的关系,而不是依据其设计和大小.但数据库的设计 和大小又往往取决于它与其他系统的关系.另一个会影响数据库设计和大小的因素就是数据库的 年龄.随着时间的推移,数据库往往