MyBatis知多少(4)MyBatis的优势
MyBatis是一个混合型解决方案。它汲取了所有这些解决方案中最有价值的思想并将它们融会贯通。下表总结了MyBatis从我们之前讨论的那些方案中所汲取的思想。
方 案 | 相同的优点 | 解决的问题 |
存储过程 | 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知多少(4)MyBatis的优势的更多相关文章
- MyBatis知多少(26)MyBatis和Hibernate区别
iBatis和Hibernate之间有着较大的差异,但两者解决方案很好,因为他们有特定的领域.我个人建议使用MyBatis的,如果: 你想创建自己的SQL,并愿意维持他们. 你的环境是由关系数据模型驱 ...
- MyBatis知多少(26)调试
这是很容易,同时与iBATIS的工作程序进行调试. iBATIS有内置的日志支持,并适用于下列日志库,并在这个顺序搜索他们. Jakarta Commons日志记录(JCL). Log4J JDK 日 ...
- MyBatis知多少(25)动态SQL
使用动态查询是MyBatis一个非常强大的功能.有时你已经改变WHERE子句条件的基础上你的参数对象的状态.在这种情况下的MyBatis提供了一组可以映射语句中使用,以提高SQL语句的重用性和灵活性的 ...
- MyBatis知多少(24)存储过程
使用MyBatis配置来调用存储过程.为了理解这一章,首先需要了解我们是如何在MySQL中创建一个存储过程. 在继续对本节学习之前,可以自行学习MySQL存储过程. 我们已经在MySQL下有EMPLO ...
- MyBatis知多少(23)MyBatis结果映射
resultMap的元素是在MyBatis的最重要和最强大的元素.您可以通过使用MyBatis的结果映射减少高达90%的JDBC编码,在某些情况下,可以让你做JDBC不支持的事情. ResultMap ...
- MyBatis知多少(22)MyBatis删除操作
本节从表中使用MyBatis删除记录. 我们已经在MySQL下有EMPLOYEE表: CREATE TABLE EMPLOYEE ( id INT NOT NULL auto_increment, f ...
- MyBatis知多少(21)更新操作
上一章展示了如何使用MyBatis对表进行读取操作.本章将告诉你如何在一个表中使用MyBatis更新记录. 我们已经在MySQL下有EMPLOYEE表: CREATE TABLE EMPLOYEE ( ...
- MyBatis知多少(20)MyBatis读取操作
上篇展示了如何使用MyBatis执行创建操作表.本章将告诉你如何使用MyBatis来读取表. 我们已经在MySQL下有EMPLOYEE表: CREATE TABLE EMPLOYEE ( id INT ...
- MyBatis知多少(19)MyBatis操作
若要使用iBATIS执行的任何CRUD(创建,写入,更新和删除)操作,需要创建一个的POJO(普通Java对象)类对应的表.本课程介绍的对象,将“模式”的数据库表中的行. POJO类必须实现所有执行所 ...
随机推荐
- 在eclipse中安装freemarker插件及html使用freemarker编辑器
freemarker模板文件使用jboss tools下提供的FreeMarker IDE,在线安装的方法是:Help –> Install New Software 点击and,再出来的对话框 ...
- Delphi的VCL组件库
Visual Component Library的缩写(可视组件库)VCL是Visual Component Library的缩写,即可视组件库,它是Delphi,C++Builder等编程语言的基本 ...
- C++Builder及VC的库相互调用
coff2omf vc.lib bc.lib implib -f xxx.lib xxx.dll dll文件为VC编译的动态库lib文件为你需要转换的c++ builder 使用的静态库. 这也是 ...
- Revit中将倾斜轴线显示为正交模式
Revit建模过程中有时候会遇到某些特殊的建筑不规则建筑或者其轴线视图中并非正交二是倾斜的情况,用Revit建模过程中对于倾斜的建筑不仅不符合人的视觉习惯,而且也会对后期的机电管线的布设造成困扰,稍不 ...
- Linux--Ubuntu12.04下安装JDK
前言 在Ubuntu中安装JDK的方法非常的多,网上现在介绍的很多方法,都不是很清楚,对于初学者,很多都不太明白如何安装.本篇博客就Ubuntu下安装JDK进行详细的讲解,这里使用的Ubuntu版本为 ...
- 当创业遇上O2O,新一批死亡名单,看完震惊了!
当创业遇上O2O,故事就开始了,总投入1.6亿.半年开7家便利店.会员猛增至10万……2015半年过去后,很多故事在后面变成了一场创业“事故”,是模式错误还是烧钱过度?这些项目的失败能给国内创业者带来 ...
- 最近的shell脚本(updating)
1.批量替换 sed -i 's/class="table"/class="table table-hover"/g' `grep 'class="t ...
- [Compose] 21. Apply Natural Transformations in everyday work
We see three varied examples of where natural transformations come in handy. const Right = x => ( ...
- Run same command on all SQL Server databases without cursors
original: https://www.mssqltips.com/sqlservertip/1414/run-same-command-on-all-sql-server-databases-w ...
- Unity 由Verlet数值积分产生的头发运动
先发下效果图. 参考项目unitychan-crs-master与miloyip大神的博客 爱丽丝的发丝,使用Verlet数值积分,根据旧的现在位置与上一桢位置来计算现在的位置,得到新的方向,上面的运 ...