【部分内容参考地址:https://www.cnblogs.com/woniu2219/p/7111857.html


Hibernate

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。


Hibernate的工作原理

1、通过Configuration config=new Configuration().configure();    //读取并解析hibernate.cfg.xml配置文件

2、由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>    //读取并映射信息

3、通过SessionFactory sf = config.buildSessionFactory();    //创建SessionFactory

4、Session s = sf.openSession();    //打开session

5、Transaction tx = s.beginTransaction();    //创建并启动事务Transaction

6、persistent operate操作数据,持久化操作

7、tx.commit();    //提交事务

8、关闭Session

9、关闭SessionFactory


Hibernate的基本操作步骤

1、获取SessionFactory

2、通过SessionFactory 获取一个Session

3、在Session基础上开启一个事务

4、通过调用Session的save方法把对象保存到数据库

5、 提交事务

6、关闭Session

7、关闭SessionFactory

 public class TestHibernate {

     public static void main(String[] args) {

         //获取SessionFactory
SessionFactory sf = new Configuration().configure().buildSessionFactory(); Session s = sf.openSession(); //通过SessionFactory 获取一个Session
s.beginTransaction(); //在Session基础上开启一个事务 Catagory c = new Catagory();
c.setName("分类1");
s.save(c); //通过调用Session的save方法把对象保存到数据库 s.getTransaction().commit(); //提交事务
s.close(); //关闭Session
sf.close(); //关闭SessionFactory
} }

Hibernate的核心接口

  • session:负责被持久化对象CRUD操作
  • sessionFactory:负责初始化hibernate,创建session对象
  • configuration:负责配置启动hibernate,创建sessionFactory
  • Transaction:负责事务项目的相关操作
  • Query和Criteria接口:负责执行各种数据库查询

Hibernate的优点

1、对JDBC访问数据库的代码封装,大大简化了数据访问层繁琐的重复代码。

2、hibernate是轻量级框架,支持各种数据库,从一对一到一对多的各种复杂关系。


Hibernate的缓存机制

hibernate的缓存包括两大类:一级缓存(session缓存)和二级缓存(SessionFactory缓存)。

一级缓存:一级缓存是内置的,就是说只要你使用hibernate就必须使用session缓存。hibernate默认是开启一级缓存的。由于session对象的声明周期通常对应一个数据库事务或者一个应用事务,因此其缓存的缓存范围是事务。在一级缓存中,持久化类的每个实例都具有唯一的OID(对象标识符)。

二级缓存:由于二级缓存对象的生命周期和应用程序的整个过程对应,因此hibernate二级缓存的缓存范围是进程或者集群,有可能出现并发问题,因此需要采取适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。二级缓存是可选的,是一个可配置的插件,默认情况下不会启动。若要开启二级缓存,可以在hibernate.cfg.xml中开启二级缓存的配置,hibernate本身不提供二级缓存,都是使用第三方的二级缓存插件,可以使用 EhCache提供的二级缓存。

应该放在二级缓存中的数据:

1、很少被修改的数据

2、不是很重要的数据,允许出现偶尔并发的数据

3、不会被并发访问的数据

4、常量数据

不适合放在二级缓存中的数据:

1、经常被修改的数据

2、不允许出现并发访问的数据

3、与其他应用共享的数据


Hibernate的优化

1、使用双向一对多关联,不适用单向。

2、使用一对多取代一对一

3、配置对象缓存,不适用集合缓存


Hibernate的延迟加载和非延迟加载

延迟加载 又叫 lazyload。

get是非延迟加载,无论后面的代码是否会访问到属性,马上执行sql语句,对于不存在的对象返回null【处理对象是null,处理空对象的信息也会抛出异常】。

load是延迟加载,只有属性被访问到的时候,才会执行sql语句,对于不存在的对象会抛出异常。

属性的延迟加载:

当使用load方式来获取对象的时候,只有访问了这个对象的属性,hibernate才会到数据库中进行查询,否则不会访问数据库。

关系的延迟加载:

关系的延迟加载在one-many、many-many的时候都可以使用。


Hibernate的查询

  • 使用标准sql语句查询数据
  • 使用hql查询数据
  • 使用Criteria进行(分页)查询数据

使用 session的createSQLQuery方法执行标准sql语句时,由于标准sql语句可能有多种返回结果,不能保证其查询结果可以装进一个Product对象中,所以返回的集合里的每一个元素是一个对象数组。

         String name = "iphone";
String sql = "select * from product_ p where p.name like '%"+name+"%'";
Query q = s.createSQLQuery(sql);
List<Object[]> list = q.list();
for(Object[] os : list) {
for(Object o : os) {
System.out.print(o + "\t");
}
System.out.println();
}

使用hql查询数据时,根据hql创建一个Query对象,设置参数,(PreparedStatement:基1,Query:基0),通过Query对象的list()方法返回查询结果。
【注:使用hql时,使用的是类名,而不是表名】
【注:使用hql时,不需要在前面加select *】

         String name = "iphone";
Query q = s.createQuery("from Product p where p.name like ?");
q.setString(0, "%"+name+"%");
List<Product> ps = q.list();
for(Product p : ps) {
System.out.println(p.getPrice());
}

使用Criteria查询数据时,完全面向对象,不再有sql语句的痕迹。(Criteria还可以很方便的进行分页查询和获取总数)
通过session的creteCriteria创建一个Criteria对象,Criteria.add增加约束,调用list()方法返回查询结果的集合。

         String name = "iphone";
Criteria c = s.createCriteria(Product.class);
c.add(Restrictions.like("name", "%"+name+"%"));
List<Product> ps = c.list();
for(Product p : ps) {
System.out.println(p.getPrice());
}

使用Criteria分页查询数据时,无论你使用的是Oracle,Mysql,NoSQL还是DB2,分页查询的代码写法都是一样的。

c.setFirstResult(2); 表示从第3条数据开始 。

c.setMaxResults(5); 表示一共查询5条数据。

         String name = "iphone";
Criteria c = s.createCriteria(Product.class);
c.add(Restrictions.like("name", "%" + name + "%"));
c.setFirstResult(2);
c.setMaxResults(5); List<Product> pl = c.list();
for(Product p : pl) {
System.out.println(p.getName());
}

Hibernate中session的两种获得方式

Hibernate有两种方式获得session,分别是:openSession和getCurrentSession

区别:1、获取的是否是同一个session对象 
                              openSession每次都会得到一个新的Session对象 。
                            getCurrentSession在同一个线程中,每次都是获取相同的Session对象,但是在不同的线程中获取的是不同的Session对象 。
                        2、事务提交的必要性 
                              openSession只有在增加,删除,修改的时候需要事务,查询时不需要的 。
                              getCurrentSession是所有操作都必须放在事务中进行,并且提交事务后,session就自动关闭,不能够再进行关闭。


Hibernate中建立数据库连接池

建立数据库连接时比较消耗时间的,所以通常都会采用数据库连接池的技术来建立多条数据库连接,并且在将来持续使用,从而节约掉建立数据库连接的时间 。

hibernate本身是提供了数据库连接池的,但是hibernate官网也不推荐使用他自带的数据库连接池。 一般都会使用第三方的数据库连接池。C3P0是免费的第三方的数据库连接池,并且有不错的表现 。

【注:当运行次数不大的时候,从运行效果上来看,是看不出区别的。 只有在高并发量的情况下,才会体会出来。】


Hibernate中的配置问题:注解 VS XML

XML配置方式:

优:容易编辑,配置比较集中,方便修改,在大业务量的系统里面,通过xml配置会方便后人理解整个系统的架构,修改之后直接重启应用即可 。
        缺:比较繁琐,配置形态丑陋, 配置文件过多的时候难以管理 。
注解方式: 
        优:方便,简洁,配置信息和 Java 代码放在一起,有助于增强程序的内聚性。 
        缺:分散到各个class文件中,所以不宜维护, 修改之后你需要重新打包,发布,重启应用。

总结:
        => 小项目,参与人数不多,不复杂的用注解,开发快速。

=>复杂项目,多人交互,配置量大,维护复杂度高的,用配置文件。

关于Hibernate的部分知识总结的更多相关文章

  1. 记录Hibernate的缓存知识

    一.Hibernate缓存的作用 Hibernate是一个持久层框架,Hibernate要经常访问物理数据库.为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能,Hibernate的缓 ...

  2. hibernate[版本四]知识总结

    1.hibernate是orm对象关系映射,是对jdbc的封装 2.hibernate版helloworld 2.1导入jar <dependencies> <dependency& ...

  3. Hibernate 框架基本知识

    QTP:Quick Test Pressional 1,Hibernate是一个优秀的java持久化层解决方案,是当今主流的对象-关系映射(ORM,ObjectRelationalMapping)工具 ...

  4. Hibernate(1)基本知识

    hibernate初步 1.概述 ①hibernate是java应用和关系数据库之间的桥梁,是一个开源的对象关系映射框架,可用来把对象模型表示的java对象 映射到关系型数据库表中去. ②hibern ...

  5. hibernate 学习知识总结

    1.最近用hibernate 学会很多知识,总结如下: (1)数据库表格已经设置默认值,在进行数据插入的时候,bean里面不赋值的话,插入之后该字段依旧是null 是因为hibernate默认插入和更 ...

  6. HIBERNATE知识复习记录1-连接及常用方法

    要去面试了,复习一下HIBERNATE的相关知识吧,原来边看视频边写的代码如下,已经分不清先后次序了,大致看一看吧. 先看下总的配置文件hibernate.cfg.xml: <?xml vers ...

  7. 【Hibernate那点事儿】—— Hibernate知识总结

    前言: 上一篇简单的讲解了下Hibernate的基础知识.这里对Hibernate比较重要的一些知识点,进行总结和归纳. 手码不易,转载请注明!——xingoo 总结的知识点: 1 关于hiberna ...

  8. Hibernate框架(未完待续······)

        作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编 ...

  9. Hibernate学习笔记

    一.Hibernate基础 1.Hibernate简介 Hibernate是一种对象关系映射(ORM)框架,是实现持久化存储的一种解决方案.Java包括Java类到数据库表的映射和数据查询及获取的方法 ...

随机推荐

  1. 解决PUTTY出现中文乱码问题

    Putty在默认情况下没有使用UTF-8编码,因此在显示中文的时候会出现乱码.解决方法非常简单:按照下图,在连接之前,左边窗口中的“转换”选项卡(如图所示),然后在右边“假定接收的数据字符集”的下拉选 ...

  2. AdobeCS3DesignPremiumChs_Greendown.cn使用注册机激活失败重新激活操作方法

    解决Adobe Acrobat 9 Pro序列号无效/重新激活方法 1.删除C:\Program Files\Common Files\Adobe\Adobe PCD\cache\cache.db和C ...

  3. linux 的 磁盘管理

    1. 查看信息 1.1 查看磁盘信息 在linux中如果需要查看磁盘信息,需要使用df和du命令. df: 列出文件系统中整个磁盘的使用量 du:评估文件系统中磁盘的使用量,经常用来推算目录所占的容量 ...

  4. Unity导出APk出错解决方法二

    错误提示(需得打开编辑器log文件才能看到全部log,Unity3d只显示一部分): Error building Player: CommandInvokationFailure: Unable t ...

  5. ajax 请求调用问题

    http://localhost/dev/list 和  http://127.0.0.1/dev/list 最近在架构整体常规通用系统的解决方案,遭遇AJAX请求不执行的问题,刚开始以为Spring ...

  6. java面试题之----jdbc中使用的设计模式(桥接模式)

    1.JDBC(JavaDatabase Connectivity) JDBC是以统一方式访问数据库的API. 它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracl ...

  7. 年金(annuity)

    一.定义 一系列的付款(或收款),付款时间和付款金额具有一定规律性. 二.分类 1-支付时间和支付金额是否确定?确定年金(annuity-certain)风险年金(contingent annuity ...

  8. IIS 7.5+FCK编辑器+burp suite神器拿webshell

    本人小菜一枚,大牛勿喷 看图: 一个越南狗的网站,看了看好多人来过哦,估计都是在这跪下了,试了好多别人上传滴都不行,看了看是IIS7.5,难怪都卡在这里了,于是小编直接上神器Burp Suite- 截 ...

  9. 「C语言」数据类型及混合运算与类型转换

    深入学习C语言时,有必要先了解一下数据类型的概念,以及它们之间的混合运算与类型转换. 本篇文章便是根据<C语言程序设计教程>和在线翻阅资料后整理而出.(练习题将逐步更新) 目录:     ...

  10. 浅谈jquery之on()绑定事件和off()解除绑定事件

    off()函数用于移除元素上绑定的一个或多个事件的事件处理函数. off()函数主要用于解除由on()函数绑定的事件处理函数. 该函数属于jQuery对象(实例). 语法 jQuery 1.7 新增该 ...