Hibernate框架学习

1、hibernate的依赖包(框架代码需要依赖的jar包)
2、hibernate的核心包(hibernate3)--hibernate这个ORM框架的代码
3、Mysql的jdbc驱动包


结构:
两个xml文件
1、hibernate.cfg.xml(配置数据库连接的一些基本信息和对象映射的关系)
//设置数据库驱动
//设置数据库URL(数据库类型、数据库ip、数据库端口(3306)、数据库实例)
//数据库用户名
//数据库密码
//数据库方言(org.hibernate.dialect.MySQLDialect)为了更好的适配各种关系数据库,针对每个数据库
  指定了一个方言
//映射文件(map) --此文件中配置了对象属性和表字段之间的映射关系
 <mapping resource="com/liang/hibernate/User.hbm.xml"/>  
 
2、User.hdm.xml(配置POJO对象和数据库表之间的映射关系)


//配置文件前面部分是从jar包中的dtd文件获取的。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 


<hibernate-mapping>
   <class name="Employee" table="EMPLOYEE">
      <meta attribute="class-description">
         This class contains the employee detail. 
      </meta>
      <id name="id" type="int" column="id">
         <generator class="native"/>
      </id>
      <property name="firstName" column="first_name" type="string"/>
      <property name="lastName" column="last_name" type="string"/>
      <property name="salary" column="salary" type="int"/>
   </class>
</hibernate-mapping>


id标签是将指定的字段和表中的主键关联起来,一定少不了
<generator> 标签标示自动生成主键值。


3、会话
Hibernate的三种状态:
瞬时状态:
持久状态:
脱管状态:一但关闭session,持久状态实例就会变成脱管状态实例


4、Hibernate框架中一些常用的数据库操作接口


Session中封装了一些数据库操作接口:
1、插入记录 session.save(Object);
2、查询所有的记录:session.createQuery("FROM User").list();
createQuery()通过HQL去查询
3、修改记录
Object obj = session.get(clazz, Serializable id); //根据主键查询指定记录
obj.setXXX();
session.update();
4、删除记录
//根据id查询出
session.get(clazz, Serializable id); //根据主键查询指定记录
session.delete(Object);


5、HQL(查询语言),类似于SQL,但是HQL是面向对象的查询语句
SELECT t.name from User t;
看上去和sql语句没有什么区别,但是其中name不是表中的字段,是User类的属性
如何实现对象属性和数据库表字段的映射,应该是hibernate的核心。


group by是按照某个属性值进行分组,把相同属性值的分为一组,并且进行其他操作。


6、标准查询(Criteria)
在框架中提供了标准的查询API,然后结合过滤条件或者逻辑判断来进行查询


// To get records having salary more than 2000
Criteria cr = session.createCriteria(Employee.class);
cr.add(Restrictions.gt("salary", 2000));
 
7、原生SQL
在Hibernate3.0中提供了直接写SQL语句(包括存储过程)查询的API
SQLQuery createSQLQuery(String str);


String sql = "SELECT * FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Employee.class);
List results = query.list(); 


缓存:
缓存是应用程序的一种优化手段,减少对物理数据库的访问次数,提高系统的
响应时间。在Hibernate框架中,也使用了缓存策略,并且是多级缓存策略。


一级缓存(Session缓存):
二级缓存():
hibernate的lazy load(懒加载)










mybatis 和 hibernate两种常用的ORM框架的比较:




作者:乌拉拉
链接:https://www.zhihu.com/question/21104468/answer/58579295
来源:知乎
著作权归作者所有,转载请联系作者获得授权。


、开发对比开发速度
Hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。


开发社区
Hibernate 与Mybatis都是流行的持久层开发框架,但Hibernate开发社区相对多热闹些,支持的工具也多,更新也快,当前最高版本4.1.8。而Mybatis相对平静,工具较少,当前最高版本3.2。


开发工作量
Hibernate和MyBatis都有相应的代码生成工具。可以生成简单基本的DAO层方法。


针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。


2、系统调优对比Hibernate的调优方案
制定合理的缓存策略;
尽量使用延迟加载特性;
采用合理的Session管理机制;
使用批量抓取,设定合理的批处理参数(batch_size);
进行合理的O/R映射设计
Mybatis调优方案
MyBatis在Session方面和Hibernate的Session生命周期是一致的,同样需要合理的Session管理机制。MyBatis同样具有二级缓存机制。 MyBatis可以进行详细的SQL优化设计。


SQL优化方面
Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。


Hibernate HQL语句的调优需要将SQL打印出来,而Hibernate的SQL被很多人嫌弃因为太丑了。MyBatis的SQL是自己手动写的所以调整方便。但Hibernate具有自己的日志统计。Mybatis本身不带日志统计,使用Log4j进行日志记录。


扩展性方面
Hibernate与具体数据库的关联只需在XML文件中配置即可,所有的HQL语句与具体使用的数据库无关,移植性很好。MyBatis项目中所有的SQL语句都是依赖所用的数据库的,所以不同数据库类型的支持不好。


3、对象管理与抓取策略对象管理
Hibernate 是完整的对象/关系映射解决方案,它提供了对象状态管理(state management)的功能,使开发者不再需要理会底层数据库系统的细节。也就是说,相对于常见的 JDBC/SQL 持久层方案中需要管理 SQL 语句,Hibernate采用了更自然的面向对象的视角来持久化 Java 应用中的数据。


换句话说,使用 Hibernate 的开发者应该总是关注对象的状态(state),不必考虑 SQL 语句的执行。这部分细节已经由 Hibernate 掌管妥当,只有开发者在进行系统性能调优的时候才需要进行了解。


而MyBatis在这一块没有文档说明,用户需要对对象自己进行详细的管理。


抓取策略
Hibernate对实体关联对象的抓取有着良好的机制。对于每一个关联关系都可以详细地设置是否延迟加载,并且提供关联抓取、查询抓取、子查询抓取、批量抓取四种模式。 它是详细配置和处理的。


而Mybatis的延迟加载是全局配置的。


4、缓存机制对比Hibernate缓存
Hibernate一级缓存是Session缓存,利用好一级缓存就需要对Session的生命周期进行管理好。建议在一个Action操作中使用一个Session。一级缓存需要对Session进行严格管理。


Hibernate二级缓存是SessionFactory级的缓存。 SessionFactory的缓存分为内置缓存和外置缓存。内置缓存中存放的是SessionFactory对象的一些集合属性包含的数据(映射元素据及预定SQL语句等),对于应用程序来说,它是只读的。外置缓存中存放的是数据库数据的副本,其作用和一级缓存类似.二级缓存除了以内存作为存储介质外,还可以选用硬盘等外部存储设备。二级缓存称为进程级缓存或SessionFactory级缓存,它可以被所有session共享,它的生命周期伴随着SessionFactory的生命周期存在和消亡。


5、优势对比


Mybatis优势
MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
MyBatis容易掌握,而Hibernate门槛较高。
Hibernate优势
Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值