用一句话概括:是不是面向POJO,需不需要写MySQL语句这两点以及其他细节问题
对于性能要求不太苛刻的系统,比如管理系统、ERP等推荐使用Hibernate;而对于性能要求高、响应快、灵活的系统则推荐使用MyBatis
下文为这两个结论的拓展(不想看可以跳过)
本文比较重要的概念:三层架构 O/R映射层 hibernate缓存机制 级联 存储过程 动态SQL
Hibernate和MyBatis的增、删、查、改,对于业务逻辑层来说大同小异,对于映射层而言Hiberate的配置不需要接和SQL,相反MyBatis是需要的。对于Hibernate而言,不需要编写大量的SQL,就可以完全映射,同时提供了日志、缓存、级联(级联比MyBatis强大)等特性,此外还提供HQL(Hibernate Query Language)对POJO进行操作,使用十分方便,但它也有致命缺点
注解:
三层架构:
为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。
O/R映射层:
O/R映射层是持久层的一个特例,它的数据模型是对象模型(Object),存储模型是关系模型(Relational),cmp和Hibernate是对象模型到关系模型之间转换的两种不同实现。
hibernate缓存机制:
缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。
级联(cascade):
在计算机科学里指多个对象之间的映射关系,建立数据之间的级联关系提高管理效率
由于无需SQL,当多表关联超过个的时候,通过Hibernate的级联会造成太多性能的丢失,又或者我现在访问一个财务的表,然后它会关联财产信息表,财产又分为机械、原料等,显然机械和原料的字段试不一样的,这样关联字段只能根据特定的条件变化而变化,而Hibernate无法支持这样的变化。遇到存储过程,Hibernate只能作罢。更为关键的是性能,在管理的时代,对于性能的要求不是那么苛刻,但是在互联网时代就是系统的根本,响应过慢就会丧失客户,试想一下谁回去用一个经常需要等待超过10秒以上的应用呢
以上的问题MyBatis都可以解决,MyBatis可以自由书写SQL、支持动态SQL、处理列表、动态生成表名、支持存储过程。这样就可以灵活地定义查询语句,满足各类需求和性能优化的需要,这些在互联网系统中是十分重要的
注解:
存储过程(Stored Procedure):
是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
动态SQL:
基本语句:if语句、where语句和Choose(when,otherwise)、set语句、trim、foreach语句、SQL块、bind…
但MyBatis也有缺陷。首先,它要编写SQL和映射规则,其工作量稍微大于Hibernate。其次,它支持的工具也很有限,不能向Hibernate那样有许多的插件可以帮助生成映射代码和关联关系,而即使使用生成工具,往往也需要开发者进行进一步简化,MyBatis通过手工编码,工作量相对大些。所以对于性能要求不太苛刻的系统,比如管理系统、ERP等推荐使用Hibernate;而对于性能要求高、响应快、灵活的系统则推荐使用MyBatis