zoukankan      html  css  js  c++  java
  • Hibernate与Mybatis的简单区别

    数据库连接创建、释放频繁造成系统的资源浪费从而影响系统性能,可以使用数据库连接池解决此问题,之前的java应用程序sql语句也是写在java代码中造成系统可维护性差,实际应用的sql变化较大,sql变动需要改变代码;向sql语句中传入参数麻烦,因为sql语句的where条件不一定,占位符需要和参数一一对应,否则会造成错误,对查询的结果集解析较为麻烦,sql变化导致解析代码发生变化,且解析前需要遍历,致力于将数据库记录封装成POJO对象,Hibernate和Mybatis是常用的两款ORM框架

    一、Hibernate

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了较深层次的封装,建立了对象与数据表的映射。是一个全自动化的、完全面向对象的持久层框架,对数据库提供了较为完整的封装

    二、Mybatis

    Mybatis是一个开源关系映射框架,原名ibatis,2010年由谷歌接管以后更名。是一个半自动化的持久层框架,主要着力与POJO与SQL之间的映射关系

    三、区别

    1.开发速度

    Hibernate的开发难度要比Mybatis大,主要是因为他对JDBC比较深的封装,比较复杂、庞大、开发周期比较长,但是对于关系模型高的软件(例如需求固定的定制化软件)如果用gHibernate可以节省很多代码,提高效率。

    Mybatis要比Hibernate更容易上手,主要依赖与原生态的sql书写,让开发者感到更熟悉,上手速度快,这也是为什么Mybatis更加流行的原因,。

    2.SQL

    Hibernate的sql语句被封装,可以直接使用,加快系统开发。但是在一些自动生成的sql语句有些较为繁琐,会消耗一些性能。

    Mybatis的sql语句需要手工完成,稍微繁琐,属于半自动化,可以避免不必要的查询字段,提高系统性能。这也是为什么Mybatis较Hibernate更为灵活的原因,Mybatis可以严格控制sql执行性能,灵活度高

    3.数据库扩展性

    Hibernate通过强大的映射结构和HQL语言,大大降低了数据库(Oracle、MySQL等)的耦合性,数据库移植性好

    Mybatis由于SQL语句多为依赖数据库写的,所以扩展性、数据库移植性差,需要根据不同的数据库编写不同的SQL语句。

    4.缓存机制

    Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。

    Hibernate具有三级缓存,以及缓存是Session缓存,是默认开启的,以及缓存与Session的生命周期相关;二级缓存是SessionFactory级的缓存,可以分为内置缓存和外置缓,其中的内置缓存存放了一些关于SessionFactory对象的一些集合属性包含的数据,包括映射元数据及预定的SQL语句等;三级缓存可以结合业界流行的缓存技术:如Redis、ecache等

    Mybatis的一级缓存是SqlSession级别的缓存;二级是mapper级别的缓存,多个SqlSession共享,而他也是默认开启以及缓存,但是总体来说Mybatis的缓存机制不佳,这也很大程度的限制了Mybatis的推广

    5.对象管理

    Hibernate具有完整的对象/关系映射解决方案,对象管理功能也比较完善,采用了更自然的面向对象的视角来持久化JAVA应用中的数据,开发者无需关心SQL的生成与结果映射,可以更关注与业务流程

    Mybatis仅有基本的字段映射,对象数据以及对象实际关系任然需要手写sql来实现和管理

    6.日志

    Hibernate拥有完整的日志系统,非常健全,设计 sql记录、关系异常、优化警告、缓存提示、脏数据警告等

    Mybatis除了基本记录功能以外,功能薄弱很多,可以通过其他日志系统如Log4j来进行日志记录

    参考:http://baijiahao.baidu.com/s?id=1597148284865632440&wfr=spider&for=pc

    http://m.680.com/gonglue/info-121231.html

  • 相关阅读:
    源码分析:Java对象的内存分配
    源码分析:Java堆的创建
    Java Main如何被执行?
    HotSpot模板解释器目标代码生成过程源码分析
    Java常量池解析与字符串intern简介
    Java类的连接与初始化 (及2013阿里初始化笔试题解析)
    css中对position的几种定位方式的最佳诠释
    DB2学习笔记
    three.js:Failed to execute 'texImage2D' on 'WebGLRenderingContext解决方案
    线程隔离ThreadLocal
  • 原文地址:https://www.cnblogs.com/LiuFqiang/p/11889117.html
Copyright © 2011-2022 走看看