Hibernate详谈

一、Hibernate是什么?

        Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架,Hibernate可以自动生成SQl语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以使用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的web应用中使用。Hibernate是数据库与界面之间的桥梁,将对数据库的操作转换为对Java对象的操作,从而简化开发。

        注:POJO(Plain Ordinary Java Object)是简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或dto(Data Transform Object)来使用。POJO实质上可以理解为简单的实体类,顾名思义POJO类的作用是方便程序员使用数据库中的数据表,对于广大的程序员,可以很方便的将POJO类当做对象来进行使用,当然也是可以方便的调用其get,set方法。POJO类也给我们在struts框架中的配置带来了很大的方便。

二、Hibernate与MyBatis的区别,二者各自的优点是什么?

MyBatis是什么?

        MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

Hibernate和MyBatis的区别:

1、mybatis不完全是一个ORM框架,mybatis需要程序员自己编写sql语句,mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象;

Hibernate是完全面向POJO的,基本不需要编写sql就可以通过映射关系来操作数据库,是一种全表映射的体现

2、mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,但mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大;

而Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用Hibernate开发可以节省很多代码,提高效率,但是Hibernate的缺点是学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行

3、Hibernate和mybatis的增、删、改、查,对于业务逻辑层来说大同小异,对于映射层而言Hibernate的配置不需要接口和sql,相反mybatis是需要的,对于Hibernate而言,不需要编写大量的sql,就可以完全映射,同时提供了日志、缓存、级联(级联比mybatis强大)等特性,此外还提供HQL(Hibernate Query Language)对POJO进行操作,使用十分方便,但是它也有致命的缺陷,由于无须sql,当多表关联超过3个的时候,通过Hibernate的级联会造成太多性能的丢失,关联字段只能根据特定的条件变化而变化,而Hibernate无法支持这样的变化,遇到存储过程,Hibernate只能作罢。更为关键的是性能,Hibernate响应过慢。

以上的问题MyBatis都可以解决,Mybatis可以自由书写sql,支持动态sql,处理列表 ,动态生成表名,支持存储过程,这样就可以灵活地定义查询语句,满足各类需求和性能优化的需要,但mybatis也有缺陷,首先,它要编写sql和映射规则,其工作量稍微大于Hibernate,其次,它支持的工具也很有限,不能像Hibernate那样有许多的插件可以帮助生成映射代码和关联关系,而即使使用生成工具,往往也需要开发者进一步简化,mybatis通过手工编码,工作量相对大些,所以对于性能要求不太苛刻的系统推荐使用Hibernate,而对于性能要求高,响应快,灵活的系统则推荐使用mybatis

4、SQL优化方面:Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而mybatis的sql是手动编写的,所以可以按需求指定查询的字段。Hibernate HQL语句的调优需要将sql打印出来,而Hibernate的sql被很多人嫌弃因为太丑了;

Mybatis的sql是自己手动写的所以调整方便,但Hibernate具有自己的日志统计,Mybatis本身不带日志统计,使用Log4j进行日志记

5、扩展性方面:Hibernate与数据库的管理只需要在xml文件中配置即可,所有的HQL语句与具体使用的数据库无关,移植性很好,Mybatis项目中所有的sql语句都是依赖所用的数据库的,所以不同数据库类型的支持不好

6、总结:

相同点:Hibernate与Mybatis都可以是通过SessionFactoryBuilder由xml配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和sql语句,其中SessionFactoryBuilder,SessionFactory,Session的生命周期都是差不多的;

Hibernate和Mybatis都支持JDBC和JTA事务处理

MyBatis优势:

   MyBatis可以进行更为细致的SQL优化,可以减少查询字段

   MyBatis容易掌握,而Hibernate门槛较高

Hibernate优势:

     Hibernate的DAO层开发比MyBatis简单,MyBatis需要维护sql和结果映射;

    Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护更方便;

    Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同的sql;

    Hibernate有更好的二级缓存机制,可以使用第三方缓存,MyBatis本身提供的缓存机制不佳

MyBatis功能强大,数据无关性好,O/R映射能力强,MyBatis入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的sql使用经验,对于没有那么高的对象模型要求的项目来说,很实用。MyBatis的缺点就是框架比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量比较大,而且不太容易适应快速数据库修改

三、Hibernate的一些接口

1、Configuration接口

负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象

2、SessionFactory接口

负责初始化Hibernate。它充当数据存储源的代理,并负责创建session对象,它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享,它是重量级的,这意味着不能随意创建或销毁它的实例,如果应用只访问一个数据库,只需要创建一个SessionFactory

3、Session接口

负责执行被持久化对象的CRUD操作(CRUD:增读更删)。但需要注意的是Session对象是非线程安全的,因此在设计软件架构的时候,应该避免多个线程共享一个session实例。同时,Hibernate的Session不同于JSP应用中的HttpSession

4、Query和Critical接口

Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式

5、Transaction接口

是Hibernate的数据库事务接口,它对底层的事务接口做了封装,底层事务接口包括:1、jdbc API;2、JTA(Java Transation API);3、CORBA(Common Objecr Request Broker Architecture)API

四、Hibernate配置文件的头文件

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-configurationPUBLIC
"-//Hibernate/HibernateConfigurationDTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

五、Hibernate的配置文件

这是我项目中的一个Hibernate的配置文件

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-configurationPUBLIC
"-//Hibernate/HibernateConfigurationDTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<propertyname="connection.url">jdbc:mysql://localhost:3306/demo</property>
<propertyname="connection.driver_class">com.mysql.jdbc.Driver</property>
<propertyname="connection.username">root</property>
<propertyname="connection.password">root</property>
<propertyname="hibernate.show_sql">true</property>
<propertyname="hibernate.format_sql">true</property>
</session-factory>
</hibernate-configuration>

1)加载数据库相关信息

2)Hibernate的相关配置

hibernate.show_sql:可以将向数据库发送的SQL语句显示出来

hibernate.format_sql:格式化SQL语句

六、Hibernate映射配置文件

这是我项目中的一个Hibernate的映射配置文件

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mappingpackage="com.example.api">
<!--<classname="com.example.api.entity.User"table="user">-->
<!--<idname="id"type="java.lang.Integer"column="id"></id>-->
<!--<propertyname="username"type="java.lang.String"column="username"></property>-->
<!--<propertyname="password"type="java.lang.String"column="password"></property>-->
<!--<propertyname="name"type="java.lang.String"column="name"></property>-->
<!--<propertyname="phone"type="java.lang.String"column="phone"></property>-->
<!--<propertyname="email"type="java.lang.String"column="email"></property>-->


<!--</class>-->
</hibernate-mapping>

 如果你的实体类,以及service层在一个包下放着,可以直接引包,如果不在,需要配置如下信息

  1. name属性:类的全名称。
  2. table属性:映射到数据库里面的那个表的名称,可以省略,这时表的名称就与类名一致。
  3. catalog属性:数据库名称,可以省略,如果省略,则参考核心配置文件中url路径中的库名称。
  4. name:类中的属性名称
  5. column:表中的主键名称,column也可以省略,这时列名就与类中属性名称一致
  6. length:字段长度,如果length忽略不写,且你的表是自动创建这种方案,那么length的默认长度是255
  7. type属性:指定类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余悸-Shine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值