Mybatis与Hibernate概述

1 Mybatis与Hibernate概述   

两者均是当前最流行的ORM框架之一,所谓ORM(Object Relational Mapping),即对象关系映射,它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将这些对象组织起来,实现系统业务逻辑的过程。在ORM过程中最重要的概念是映射(Mapping),通过这种映射可以使业务对象与数据库分离。

Hibernate是一个开放源代码的对象关系映射框架,对JDBC提供了较为完整的封装,建立对象与数据库表的映射。是一个全自动的、完全面向对象的持久层框架。在AC-WAN的代码中,我们用到的就是这个ORM框架,想必大家都会有所感受,我们直接操作的是数据库映射的java对象,基本上不用写那些sql语句,封装还是很完美的,也有一部分需要自己在Dao类中添加一部分的sql语句,然后调用hibernate封装好的方法,直接执行,方便快捷,操作数据库,我们只需关注上层的Dao类函数,无需关注底层是怎么实现的。

但是到了NCE的版本中,采用了Spring的架构,另外数据库则采用了Mybatis的框架,其实Mybatis也是一个开源对象关系映射框架,开发过NCE版本的同学应该知道,它应该算是一个半自动化的持久层框架,不像Hibernate封装的那么完善,下面就介绍两者的区别

[ 编辑本段 ]   [ 回目录 ]2.1 Hibernate是全自动,Mybatis是半自动   

hibernate是全自动,在开发中,sql语句已经被封装,直接可以使用,在系统的开发中,速度相对较快;

Mybatis 属于半自动化,sql需要手工完成,需要自己去定义Mapper.xml,里面需要自己完成Sql语句的操作,稍微繁琐;

[ 编辑本段 ]   [ 回目录 ]2.2 可移植性   

从可移植性上来说,Hibernate数据库移植性要强于MyBatis的数据库移植性,因为不同的数据库需要写不同的SQL。

这个从写NCE框架的LLT就可以感受到,NCE版本使用的是U2000的LLT框架,LLT框架使用的H2DB数据库,其不支持uuid这个Sql语句函数,但是支持random_uuid这个函数,但是再实际环境中,我们用的是mysql数据库,正好跟其相反, 由此看出不同的数据库支持的函数不同,导致其针对不同的数据库可移植性差。Mybatis由于所有SQL都是依赖数据库书写的,所以扩展性,迁移性比较差

[ 编辑本段 ]   [ 回目录 ]2.3 日志系统   

Hibernate日志系统非常健全,涉及广泛,包括:SQL记录、关系异常、优化警告、缓存提示、脏数据警告等;而MyBatis则除了基本记录功能外,功能薄弱很多。

[ 编辑本段 ]   [ 回目录 ]2.4 SQL优化   

SQL直接优化上,MyBatis要比Hibernate方便很多,

由于MyBatis的sql都是写在Mapper的xml里,因此优化sql比Hibernate方便很多。而Hibernate的sql很多都是自动生成的,无法直接维护sql;虽然Hibernate有hql,但功能还是不及sql强大,见到报表等变态需求时,hql也歇菜,也就是说hql是有局限的;hibernate虽然也支持原生sql,但开发模式上却与orm不同,需要转换思维,因此使用上不是非常方便。总之写sql的灵活度上Hibernate不及MyBatis。

[ 编辑本段 ]   [ 回目录 ]2.5 更新功能   

从更新功能上来说 Hibernate会更新所有字段,而MyBatis可以只需要更新其中一个字段,所以在性能上有一些差异。

[ 编辑本段 ]   [ 回目录 ]2.6 安全性   

Hibernate是预编译的,MyBatis可能存在SQL注入问题,另外使用Hibernate对数据库类型进行切换时,成本明显低于MyBatis

[ 编辑本段 ]   [ 回目录 ]3 一句话总结   

Mybatis:小巧、方便、高效、简单、直接、半自动化

Hibernate:强大、方便、高效、复杂、间接、全自动化