spring|十年架构师,带你初识SSM框架结构,深入开发Java就在今天( 三 )


MyBatis的优势在于灵活 , 它几乎可以代替JDBC同时提供了接口编程 。 目前MyBatis的数据访问层DAO(DataAccessObjects)是不需要实现类的 , 它只需要一个接口和XML(或者注解) 。 MyBatis提供自动映射、动态SQL、级联、缓存、注解、代码和SQL分离等特性 , 使用方便 , 同时也可以对SQL进行优化 。 因为其具有封装少、映射多样化、支持存储过程、可以进行SQL优化等特点 , 使得它取代了Hibernate 成为了Java互联网中首选的持久框架 。
Hibernate简介
要将POJO和数据库映射起来需要给这些框架提供映射规则 , 所以下一步要提供映射的规则 , 如下图所示 。
在MyBatis或者Hibernate 中可以通过XML或者注解提供映射规则 , 这里讨论的是XML方式 , 因为在MyBatis中注解方式会受到一定的限制 , 所以MyBatis通常使用XML方式实现映射关系 。
我们把POJO对象和数据库表相互映射的框架称为对象关系映射(Object Relational Mapping ORM 或O/RM , 或O/R mapping) 框架 。 无论MyBatis或者Hibemate都可以称为ORM框架 , 只是Hibermate的设计理念是完全面向POJO的 , 而MyBatis 则不是 。 Hibermate基本不再需要编写SQL就可以通过映射关系来操作数据库 , 是一种全表映射的体现;而MyBatis则不同 , 它需要我们提供SQL去运行 。
Hibernate是将POJO和数据库表对应的映射文件 , 如下图 。
首先 , 对POJO和表t role 进行了映射配置 , 把两者映射起来了 。 然后 , 对POJO进行操作 , 从而影响t role 表的数据 , 比如对其增、删、查、改可以按照如所示方式操作 。
MyBatis在移动互联网时代 , MyBatis成为了目前互联网Java持久框架的首选 , 与Hibernate消除SQL不同 , MyBatis 不屏蔽SQL 。 不屏蔽SQL的优势在于 , 程序员可以自己制定SQL规则 , 无须Hibernate自动生成规则 , 这样能够更加精确地定义SQL从而优化性能 。 它更符合移动互联网高并发、大数据、高性能、高响应的要求 。
显然MyBatis在业务逻辑上和Hibermate是大同小异的 。 其区别在于 , MyBatis 需要提供接口和SQL这意味着它的工作量会比Hibernate大 , 但是由于自定义SQL、映射关系 ,
所以其灵活性、可优化性就超过了Hibernate 。互联网可优化性、灵活性是十分重要的 , 因为一条SQL的性能可能相差十几倍到几十倍 , 这对于互联网系统是十分重要的 。
Hibernate和MyBatis的区别
Hibernate和MyBatis的增、删、查、改 , 对于业务逻辑层来说大同小异 , 对于映射层而言Hibernate的配置不需要接口和SQL相反MyBatis 是需要的 。 对于Hibernate而言 , 不需要编写大量的SQL就可以完全映射 , 同时提供了日志、缓存、级联(级联比MyBatis强大)等特性 , 此外还提供HQL (Hibermate Query Language)对POJO进行操作 , 使用十分方便 , 但是它也有致命的缺陷 。
由于无须SQL当多表关联超过3个的时候 , 通过Hibermate的级联会造成太多性能的丢失 , 又或者我现在访问一个财务的表 , 然后它会关联财产信息表 , 财产又分为机械、原料等 , 显然机械和原料的字段是不-样的 , 这样关联字段只能根据特定的条件变化而变化 , 而Hibernate无法支持这样的变化 。 遇到存储过程 , Hibernate只能作罢 。 更为关键的是性能 , 在管理系统的时代 , 对于性能的要求不是那么苛刻 , 但是在互联网时代性能就是系统的根本 , 响应过慢就会丧失客户 , 试想一下谁会去用一个经常需要等待超过10秒以上的应用呢?
以上的问题MyBatis都可以解决 , MyBatis 可以自由书写SQL、支持动态SQL、处理列表、动态生成表名、支持存储过程 。 这样就可以灵活地定义查询语句 , 满足各类需求和性能优化的需要 , 这些在互联网系统中是十分重要的 。
但MyBatis也有缺陷 。 首先 , 它要编写SQL和映射规则 , 其工作量稍微大Hibernate 。 其次 , 它支持的工具也很有限 , 不能像Hibernate那样有许多的插件可以帮助生成映射代码和关联关系 , 而即使使用生成工具 , 往往也需要开发者进一步简化 , MyBatis 通过手工编码 , 工作量相对大些 。 所以对于性能要求不太苛刻的系统 , 比如管理系统、ERP 等推荐使用Hibernate;而对于性能要求高、响应快、灵活的系统则推荐使用MyBatis 。


推荐阅读