Java Web之理解 Hibernate And MyBatis

在JavaWeb开发中,最经典的就是SSH框架组合和SSM框架组合,现在很多IT公司愿意使用SSM,对于这里的H和M即Hibernate和MyBatis,今天简单来说道说道。

班门弄斧

上课时,我经常跟学生说,学习任何一门技术,一定要弄明白:

  • What:这个东西是什么?连这个技术是什么都说不清,人家会相信你精通吗?
  • Why:为什么要用?不要盲目学,一门技术的产生肯定有其背后的原因,解决了一个什么难题?还是简化了开发等等?
  • When:什么时候需要用?学完了不会灵活运用也不行。
  • How:怎么用?首先最重要的弄清楚原理,多思考,多应用,多犯错,才会成长。

知识讲解

Hibernate和MyBatis都是很流行的ORM(对象关系映射,说白了就是一种和数据库进行映射的技术)持久化层框架,其实质是还是对JDBC进行了封装,方便我们使用,简化我们的开发。先弄明白几个问题:

  • 什么是对象持久化:说白了就是把对象保存到数据库或者文件中
  • 传统开发:界面(View) --------- 业务层(SQL语句) --------- 数据库
  • 产生的问题
    • 一旦更换底层的数据库,很多操作都要重写
    • JDBC冗余代码过多(这是Hibernate发明的最初动力)
  • 引入持久层开发:界面(View) --------- 业务层(HQL语句、动态查询语句) --------- 持久层 --------- 数据库

为什么引入持久层就可以解决这个问题呢?解析:在持久层可以引入一个机制,当作一个翻译,针对底层不同的数据库,把HQL语句、动态查询语句翻译成不同的SQL语句,这样就解决了更换数据库后也不需要改SQL语句的问题,而且代码量也会大大降低。 说的这么好,那么Hibernate和MyBatis到底是怎么实现上述所说的方案的呢,也就是他们的ORM怎么来实现?

Hibernate

在Hibernate中这个机制就是一个配置文件hibernate.cfg.xml(放在src目录下

<hibernate-configuration>
    <session-factory>
       <property name="connection.url">jdbc:mysql://localhost/hibernate</property>
       <property name="connection.username">root</property>
       <property name="connection.password">saber</property>
       <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
       <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
       <!-- ddl语句自动建表 -->
       <property name="hbm2ddl.auto">none</property>
       <property name="show_sql">true</property>
       <property name="format_sql">true</property>
       <!-- 连接池配置 -->
       <property name="hibernate.connection.provider_class">        
org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider
       </property>
       <!-- 连接池中JDBC连接的最小数量。Hibernate默认为1 -->
       <property name="hibernate.c3p0.min_size">5</property>
       <!-- 连接池中JDBC连接的最大数量。Hibernate默认为100 -->
       <property name="hibernate.c3p0.max_size">20</property>
       <!-- 何时从连接池中移除一个空闲的连接(以秒为单位)时。默认为0,永不过期 -->
       <property name="hibernate.c3p0.timeout">300</property>
       <!-- 被缓存的预编译语句数量。用来提高性能。Hibernate默认为0,缓存不可用-->
       <property name="hibernate.c3p0.max_statements">100</property>
       <!-- 一个连接被自动验证前的闲置时间(以秒为单位)。Hibernate默认为0 -->
       <property name="hibernate.c3p0.idle_test_period">3000</property>
       <!-- 独立线程运行,如果通过getCurrentSession()来获得Session,需要设置如下-->
       <property name="current_session_context_class">thread</property>
       <!-- 映射持久化类  两种方式-->
       <mapping class="com.serup.model.Teacher" />
       <mapping resource="com/serup/model/Teacher.hbm.xml" />
    </session-factory>
</hibernate-configuration>

一旦项目换了数据库,需要修改的就是这个文件中的几个属性而已,业务层的逻辑代码不需要做任何修改。 使用Hibernate进行开发推荐这么干: ** Domain Object ----> Mapping ----> DataBase 也就是说对象和表要有一种映射,这种映射在Hibernate中有两种配置方式**

  • 1、XML方式(类名.hbm.xml) 通过hbm文件建立表和类的映射关系
  • 2、 Annotation方式 后来有了逆向工程,就简单多了,直接通过数据库表生成对应的文件即可。

MyBatis

在MyBatis中这个机制也是靠一个配置文件mybatis-config.xml(放在src目录下

<configuration>
    <properties resource="sqlserverinfo.properties"/><!--数据库的配置文件-->
    <typeAliases>
        <package name="com.demo.domain"/> <!--扫描类型别名的包 也可以单独扫描某个文件-->
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
    <!--映射文件完成具体的crud操作 -->
    <mapper resource="com/demo/domain/UserMapper.xml"/>
    </mappers>
</configuration>

这样每次换数据库,也只需要修改一下配置文件即可。 使用MyBatis进行开发推荐这么干: ** 建数据库,创建各种表 ---> 逆向工程自动生成MyBatis执行所需要的代码(mapper.java,mapper.xml、po..) ---> 根据业务逻辑写控制层和服务层。**

不同点

网上有各种对比,我只谈个人觉得的几点不同的地方

1、Hibernate有一个面向对象的查询语言叫HQL,这个非常强大,可以让不会SQL语句的猿也可以进行数据库的增删改查,但这也是它的一个弱项,SQL语句不能进行优化。 2、MyBatis需要进行SQL语句的配置,也就是说还是需要数据库的基础知识才能上手的,而且初学者在结果映射那块肯定遇到的坑很多。 3、没做过特别大的项目,如果对性能没特别特别的要求,HIbernate还是更容易实现功能。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

走近科学:三星电脑恶意禁用Windows更新“丑闻”

近期有Windows用户反映称,自己的三星电脑上Windows自动更新程序会被随机禁用,这个给他们的PC安全带来了安全隐患。禁用Windows更新的程序名为Di...

22070
来自专栏Java进阶架构师

IntelliJ IDEA 内存优化最佳实践

原文链接::http://blog.oneapm.com/apm-tech/426.html

9020
来自专栏云计算

服务集成时需避免的两个错误

随着面向服务架构(下文简称 SOA,Service Oriented Architecture)的出现,企业通过将业务功能分解为多重服务 [1],它们迅速地从整...

43950
来自专栏FreeBuf

现代版荆轲刺秦王:Struts2 REST插件漏洞分析

战国末期,大秦实力强盛,大有横扫六合之势,在灭了韩、赵两国后,下一个目标就是燕国。

11120
来自专栏散尽浮华

Centos7下部署分布式跟踪工具Pinpoint的操作记录

一、Pinpoint简单介绍 Pinpoint是一款对Java编写的大规模分布式系统的APM工具,有些人也喜欢称呼这类工具为调用链系统、分布式跟踪系统。一般来说...

16320
来自专栏自然语言处理

文本挖掘系列文章4

搜索已经作为生活中不可缺少的一部分,诸如:百度、google、还是在微信上寻找好友或者通过一段文本查找关键字。另外亚马逊、京东、天猫、苏宁等电商在搜索中也是别有...

22440
来自专栏格子的个人博客

JMeter安装配置和分布式

前段时间公司的新项目上线了一段时间之后,随着运营规模的变大,老大要求对系统进行一个摸底,那么肯定有人要为这个伟大的工作献身了,是的,那个人就是我。谁让我是就是打...

11520
来自专栏芋道源码1024

IntelliJ IDEA 内存优化最佳实践

【编者按】本文作者在和同事的一次讨论中发现,对 IntelliJ IDEA 内存采用不同的设置方案,会对 IDE 的速度和响应能力产生不同的影响。

47370
来自专栏陈树义

你绝不能错过的效率神器 —— Alfred

? Alfred 是 Mac 系统上一款专注于效率提升的著名应用,它能帮你快速打开网页、快速进行自定义搜索、查看剪贴板历史、快速查询单词等等。Alfred 提...

1.2K70
来自专栏企鹅号快讯

简析OpenTSDB的用途是什么

OpenTSDB 是一种基于 HBase 编写的分布式、可扩展的时间序列数据库。官方文档这样描述:OpenTSDB is a distributed, scal...

56480

扫码关注云+社区

领取腾讯云代金券