博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis知多少(4)MyBatis的优势
阅读量:4980 次
发布时间:2019-06-12

本文共 2728 字,大约阅读时间需要 9 分钟。

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语句:

SELECTPRODUCTID,NAME,DESCRIPTION,CATEGORY                                             •FROM PRODUCTWHERE CATEGORY = ?

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

String s = "SELECT"+ " PRODUCTID,"+ " NAME,"+ " DESCRIPTION,"+ " CATEGORY"+ " FROM PRODUCT"+ " WHERE CATEGORY = ?"

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

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

SELECTPRODUCTID,NAME,DESCRIPTION,CATEGORYFROM PRODUCTWHERE 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)。如下例所示:

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

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

 

系列文章:

转载于:https://www.cnblogs.com/Coda/p/4639093.html

你可能感兴趣的文章
Leetcode860.Lemonade Change柠檬水找零
查看>>
隐藏,显示任务栏
查看>>
ArrayList和数组间的相互转换
查看>>
oracle恢复一个数据表的方法
查看>>
jquery如何通过name名称获取当前name的value值
查看>>
oracle控制何时触发审计动作
查看>>
NVelocity用法
查看>>
关于xp_cmdshall开启特定账号执行的相关设置步骤
查看>>
[USACO 6.3.2] Cryptcowgraphy
查看>>
.net 开发人员面试题 - 多线程
查看>>
PHP实现的快速排序
查看>>
AE属性表操作
查看>>
2进制_8进制_16进制之间快速转换的技巧.txt
查看>>
Python学习(五)函数 —— 内置函数 lambda filter map reduce
查看>>
[转] PDB文件概说
查看>>
再坚持一年多就写代码到40岁了,一直坚持.NET也没什么大错,傻B青年快乐多重新回归博客园...
查看>>
hbase安装配置
查看>>
How to publish a WordPress blog to a static GitLab Pages site
查看>>
面试人生
查看>>
JAVA多线程之当一个线程在执行死循环时会影响另外一个线程吗?
查看>>