MyBatis知多少(4)MyBatis的优点

MyBatis是一个混合型解决方案。它汲取了全部这些解决方案中最有价值的思想并将它们融会贯通。下表总结了MyBatis从咱们以前讨论的那些方案中所汲取的思想。html

相同的优势 解决的问题
存储过程 MyBatis对SQL进行了封装和外部化使SQL从你 的应用程序代码中分离出来。MyBatis具备与存储 过程类似的API,但MyBatis的这些API是面向对象 的。MyBatis也彻底支持对存储过程的直接调用 业务逻辑从数据库中分离出来,应用程序更容易部署与测试,也具备更好的可移植性
内联SQL MyBatis容许SQL以其最天然的方式书写。没有字符串拼接,没有参数设置没有结果获取 MyBatis对应用程序代码没有任何影响。不须要任何预编译器而且你可以彻底访问 SQL的全部特性,而不仅是一个子集
动态SQL MyBatis提供了若干特性以支持基于参数的动态 构建査询。不须要査询构建工具”这样的API MyBatis不要求SQL被写成一堆字符串的拼接,中间还夹杂着应用程序的代码
O/RM MyBatis支持许多与O/RM工具同样的特性,例如 延迟加载、链接抓取、高速缓存、运行时代码生成 以及继承  MyBatis可用于任意数据模型与任意对象模型的组合。它对这二者中的任何一个的设 计没有任何约束和要求

如今你已经理解MyBatis的根本思想了,接下来将讨论MyBatis持久层所具备的两个最重要的特性:外部化SQL和封装SQL。这两个概念展示了MyBatis框架的核心价值,并启用了这个框 架所能实现的许多高级特性。数据库

外部化的SQL编程

咱们能够从过去的软件开发中学习到的一条经验就是“老是将一个大系统设计为多个子系统,每一个子系统的功能都相对集中”。应该尽量地将那些须要由不一样的开发角色处理的任务分离开,例如,用户界面设计人员专职设计用户界面,应用程序开发人员专职开发应用程序,数据库管理人员专职管理数据库。即便只有一我的来扮演全部这些角色,这种分离也可以使你拥有一个漂 亮的分层设计,使你老是能专一于系统的某个特定部分。若是将SQL嵌入到Java源代码中,那么这 些SQL对于数据库管理人员或者对于使用相同数据库的.NET开发人员来讲就没有任何用处。外部化将SQL从应用程序的源代码中分离出来,从而使得二者都更加清晰。这样作就保证了SQL语句与任何特定的语言或平台都相对地独立。大多数现代开发语言都将SQL表现为一个字符串类型,这就 使得那些较长的SQL语句须要使用字符串拼接操做。考虑下面这个简单的SQL语句:缓存

SELECT

PRODUCTID,

NAME,

DESCRIPTION,

CATEGORY                                             •

FROM PRODUCT

WHERE CATEGORY = ?

当在现代编程语言(例如Java)中嵌入一个这样的字符串数据类型时,这个本来很简单的SQL 语句就变成了一团“乱七八糟”的字符串,难以管理了。架构

String s = "SELECT"

+ " PRODUCTID,"

+ " NAME,"

+ " DESCRIPTION,"

+ " CATEGORY"

+ " FROM PRODUCT"

+ " WHERE CATEGORY = ?"

若是忘记在FROM子句前留一个空格,那么就会引发SQL错误。很容易想象,若是你有一条复杂的SQL语句,那将会引发多大的麻烦。框架

这时MyBatis的一个主要优势就体现出来了:使用MyBatis你就拥有按照最天然的方式书写SQL 的能力。如下代码让你对经iBATIS映射后的SQL语句先有个感性认识:编程语言

SELECT

PRODUCTID,

NAME,

DESCRIPTION,

CATEGORY

FROM PRODUCT

WHERE CATEGORY = #categoryId#

注意该SQL不管是结构仍是简单性都没有变化。它与以前的SQL最大的不一样之处就在于参数的格式变为了#kategoryld#,这个格式一般是特定于语言的细节,MyBatis却使得它易移植且更具可读性。模块化

如今咱们已经将SQL从源代码中分离了出来,而且放在了一个能够更天然地使用的地方,接 下来只要将它从新与咱们的软件创建起链接,就能够执行它了。函数

封装化的SQL工具

计算机编程领域一个最古老的概念就是模块化。在一个过程化的应用程序中,代码可能被分 成许多文件、函数和过程。在面向对象的应用程序中,代码经常被组织为类和方法。封装 (encapsulation)是模块化的一种形式,它不只将代码组织到一个内聚的模块中,并且还将实现细 节隐藏了起来而仅仅向调用该类的代码暴露出它的接口。

封装的概念稍作扩展也能够应用到持久层中。能够经过定义SQL的输入和输出(例如它的界面)来封装它,这样应用程序的其余部分就不须要知道具体的SQL语句了。若是你是一个面向对 象的软件开发人员,那么能够像理解接口与实现的分离同样来理解这种封装。若是你是一个SQL 开发人员,那么能够像理解存储过程对SQL的隐藏同样来理解这种封装。

MyBatis使用XML (extensible Markup Language,可扩展标记语言)来封装SQL。因此选择 XML是由于它具备很好的跨平台性,而且获得了行业内的普遍采用,还有就是XML可能会像SQL 同样被长期使用下去,其生命可能会比其余任何一种语言或文件格式都长。MyBatis使用XML映射SQL语句的输入和输出。大多数的SQL语句都会有一个或更多的参数,会产生一堆表格化的数 据做为结果。或者说,结果被组织成了一系列的行和列。iBATIS容许你很容易地将输入输出参数 映射为某些对象的特性(property)。以下例所示:

<select id=categoryByld"

parameterClass="string" resultClass="category">

SELECT CATEGORYID, NAME, DESCRIPTION

FROM CATEGORY

WHERE CATEGORYID = #categoryld#

注意包围在SQL语句周围的XML元素。这就是对SQL的封装。这个简单的<select>元素定 义了咱们的语句的名字、输入参数类型以及输出结果类型。对于一个面向对象的软件开发人员来讲,这就像是一个方法的签名。

经过对SQL的外部化和封装,咱们得到了简单性和一致性。关于MyBatis的API如何使用以及SQL映射的语法细节,咱们将在后面讨论。在此以前,咱们首先应该知道,在架构应用程序中,MyBatis到底应该用在哪里,这很重要。

 

系列文章:

MyBatis知多少(1)

MyBatis知多少(2)

MyBatis知多少(3)

相关文章
相关标签/搜索