MyBatis知多少(18)MyBatis系统
小型、简单系统
小型应用程序通常只涉及单个数据库,只有一些相当简单的用户界面和领域模型。它的业务逻辑非常简单,甚至对一些简单的CRUD (Create, Read, Update, Delete:增删查改)应用程序来说可能根本就不存在。MyBatis之所以非常适合于小型应用程序,有3个原因。
第一,MyBatis本身就很小并且简单。它不需要服务器或者其他任何类型的中间件。根本不需要任何额外的基础设施。MyBatis也没有任何第三方依赖。MyBatis的最简安装只需 要2个JAR文件,总计不过375KB。除了需要配置几个SQL映射文件外,MyBatis不需要进行任何其他安装,因此只需要几分钟时间就可以拥有一个可工作的持久层了。
第二,MyBatis不会对应用程序或者数据库的现有设计强加任何影响。因此,如果你有一个小型系统,且己经部分实现或者甚至己经发布了,那么依然可以轻松地重构持久层以使用MyBatis。 因为MyBatis很简单,所以它根本不会使得应用程序的架构过分复杂。而如果使用对象/关系映射工具或者代码生成工具,由于它们都对应用程序或数据库的设计做了某些假设,因此它们不可能 对应用程序的架构毫无影响。
最后,只要有过软件开发的经验,相信你就不会怀疑,任何一个小软件都几乎不可避免地有 一天会成长为一个大软件。所有成功的软件都有进一步成长的趋势。这是一件好事,而我们接下 来想说的就是,MyBatis同样非常适合于大型系统,它甚至可以扩展以满足企业级应用程序的需要。
MyBatis之于大型、企业级系统
MyBatis当初就是为企业级应用程序而设计的。最重要的是,MyBatis在这个领域比之其他解决方案有着大量的优点。MyBatis最初的创建者都只有从大型应用到企业级应用程序系统的开发经 验。这些系统通常都涉及不止一个数据库,且所有这些数据库都是不可控的。之前中我们讨论了各种类型的数据库,包括企业级数据库、私有数据库和遗留数据库。创建MyBatis框架一个很重要的原因就是针对这样的数据库。因此,MyBatis拥有许多适合于企业应用环境的特征。
其实MyBatis适用于大型系统中的第一个原因我们已经在其他地方说过了,不过这个原因的确很重要,所以我们再强调一下也不为过:MyBatis没有对数据库模型或对象模型的设计做任何假设。 不论你的应用程序中这两个模型之间是多么不匹配,MyBatis都能适用。况且,MyBatis没有对你的 企业级系统的架构做出任何假设。不论你对数据库是根据业务功能纵向划分,还是按照技术横向划分,MyBatis都允许高效地处理数据并将它整合到面向对象的应用程序中去。
第二点,MyBatis的某些特征使得它能够非常高效地处理大型数据集。MyBatis支持的行处理器使得它能够批处理超大型记录集(一次一条记录)。MyBatis也支持只获取某个范围 内的结果,这就使得你可以只获取那些你当前亟需的数据。例如,假设你有10 000条记录,但只 需要其中的第500条〜第600条,那么就可以轻松地仅获取这些记录。MyBatis支持驱动程序提示, 使得执行这样的操作非常高效。
最后一点,MyBatis允许你用多种方式建立从对象到数据库的映射关系。一个企业级系统只以一种模式工作的情况是非常少见的。许多企业级系统需要在白天执行事务性的功能,而在晚上执行批处理功能。MyBatis允许你将同一个类以多种方式映射,以保证每一种功能都能以最高效的方式执行。MyBatis同样支持多种数据获取策略。例如,可以选择对某些数据进行延迟加载,也可以 将一个复杂的对象图只用一条联合查询SQL语句就同时加载完毕,从而避免严重的性能问题。
我们有充足的理由说明,你几乎可以在任何系统中使用MyBatis。正如前面所介绍的, 像MyBatis这样一个框架能够使你的应用程序从架构级别上受益。本节就将讨论这些益处以及使这些益处成为可能的iBATIS特征。
简单性
MyBatis被广泛认为是当今可用的最简单的持久化框架之一。简单性的理念根植于MyBatis开发团队,它在MyBatis的所有开发目标中居于首位。这种简单性的取得是因为MyBatis直接构建于JDBC 和SQL之上。MyBatis对于Java开发人员来说非常简单,因为它除了不用编写那么多代码外,与JDBC的工作机制非常相像。几乎你知道的关于JDBC的一切都对iBATIS同样适用。几乎可以认为, MyBatis就是以XML的形式描述的JDBC代码。也就是说,MyBatis拥有许多JDBC所没有的架构级的优点,我们随后就将讨论这些优点。MyBatis对于数据库管理员以及SQL程序员来说也非常容易 理解。iBATIS配置文件几乎人人都能读懂,只要有SQL编程的经验。
生产效率
任何一个优秀的框架,其基本目的都是使得框架的使用者能够获得更高的生产效率。一般情况下,框架负责处理公共的任务,减少编写重复的样板代码,以及解决复杂的架构级的问题。 MyBatis在给开发人员带来更高的开发效率方面做得非常成功。在Java用户组所做的—案例中, MyBatis减少了持久层大约62%的代码量。之所以能减少如此多的代码量, 究其原因是开发人员再不需要编写繁琐的JDBC代码了。SQL语句仍然是硬编码的,不过就像你在前面小节中所看到的,SQL不是问题——问题在于JDBCAPI。
性能
性能这个话题无疑会引起框架开发人员、框架使用者以及商业软件开发商之间的一场激烈争论。事实是,从一个较低的层次来看这个问题,无疑所有的框架都会带来一定的性能损失。一般 来说,如果你比较硬编码的JDBC代码和MyBatis代码,做一个1 000 000次的for循环,就会发现 JDBC在性能上的确有一些优势。幸运的是,在现代应用程序开发中,以上这样的for循环带来的 性能损失并不重要。真正重要的是,你如何从数据库中获取数据,何时获取,获取的频率又是多少。例如,从数据库中动态地获取记录的分页查询之所以能大大提高应用程序的性能就在于,你不会将潜在的成千上万条记录从数据库中一次取出。同样地,使用像延迟加载这样的特征可以避免加载那些当前用例并不需要的数据。另一方面,如果你确定需要加载一份复杂的对象图,涉及来自多个表的大量数据,那么使用一条SQL语句就完成所有对象的加载显然可以大大提高效率。 MyBatis支持许多性能优化措施。就目前而言,最重要的是 要知道MyBatis总是能通过一种简单的方式来配置和使用,其性能与JDBC相当,甚至更好。另一 个需要重点考虑的问题就是,并不是所有的JDBC代码都是编写良好的。JDBCAP非常复杂,编 写正确的代码需要非常小心。不幸的是,大量的JDBC代码都编写得相当糟糕,因此从较低层次上看甚至还没有MyBatis工作得好。
系列文章:
MyBatis知多少(18)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类必须实现所有执行所 ...
随机推荐
- solr课程学习系列-solr服务器配置(2)
本文是solr课程学习系列的第2个课程,对solr基础知识不是很了解的请查看solr课程学习系列-solr的概念与结构(1) 本文以windows的solr6服务器搭建为例. 一.solr的工作环境: ...
- 隐藏nginx 版本号信息
为了安全,想将http请求响应头里的nginx版本号信息隐藏掉: 1. nginx配置文件里增加 server_tokens off; server_tokens作用域是http server loc ...
- [算法导论]BFS @ Python
class Graph: def __init__(self): self.V = [] class Vertex: def __init__(self, x): self.key = x self. ...
- Md5加密方法
package com.atguigu.surveypark.util; import java.security.MessageDigest; /** * 数据 */ public class Da ...
- 解决Electron加载带jquery的项目报错问题
<!-- Insert this line above script imports --> <script>if (typeof module === 'object') { ...
- BZOJ 2648: SJY摆棋子 kdtree
2648: SJY摆棋子 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2648 Description 这天,SJY显得无聊.在家自己玩 ...
- Apache shiro之身份验证(登陆)流程
从张开涛blog学习后整理:http://jinnianshilongnian.iteye.com/blog/2018398 上图中的类和接口都可以继承和实现来个性化自己的实现. 其中重点看一下Mod ...
- OpenResty(nginx)操作mysql的初步应用
OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器,它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. OpenResty ...
- saiku源代码安装
以前的文章介绍了如何直接安装saiku,http://www.cnblogs.com/liqiu/p/5183894.html .这里面偷懒没有源代码编译,不过这几天也就这么用了. 最近随着使用的深入 ...
- C primer plus 练习题 第三章
5. #include <stdio.h> int main() { float you_sec; printf("请输入你的年龄:"); scanf("%f ...