【部分内容参考地址: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. [小北De编程手记] : Lesson 04 - Selenium For C# 之 API 上

    这一部分,我准备向大家介绍Selenium WebDriver的常用API,学习这部分内容需要大家最好有一些简单的HTML相关知识,本文主要涉及到以下内容: Selenium API:元素检查 Sel ...

  2. 【Python】raw转义字符

    r"hi" 这里字符串前面加了r,是raw的意思,它表示对字符串不进行转义.为什么要加这个?你可以试试print "\bhi"和r"\bhi" ...

  3. JNLP文件具体说明编辑

    JNLP(Java Network Launching Protocol )是java提供的一种可以通过浏览器直接执行java应用程序的途径,它使你可以直接通过一个网页上的url连接打开一个java应 ...

  4. python SQLAchemy多外键关联

    关联同一张表的两个字段 Customer表有2个字段都关联了Address表 创建表结构 orm_many_fk.py 只创建表结构 from sqlalchemy import Integer, F ...

  5. git go使用socket5代理

    git # set git through socks5 proxy: git config --global http.proxy socks5://127.0.0.1:1080 # Recover ...

  6. SQL Server ->> PARSE函数

    这个函数和TRY_PARSE一起从SQL Server 2012引入.它的存在是因为TRY_PARSE一旦遇到无法成功转换就会以NULL值返回,而如果你希望以报错的形式,你就可以用PARSE. 比如 ...

  7. 【Leetcode】【Hard】Reverse Nodes in k-Group

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...

  8. fork: retry: Resource temporarily unavailable

    用户A打开文件描述符太多,超过了该用户的限制 修改用户可以打开的文件描述符数量 1.首先,用另一个用户B登录,修改/etc/security/limit.conf * soft nofile 6553 ...

  9. July 02nd 2017 Week 27th Sunday

    No safe wading in an unknown water. 未知水深浅,涉水有危险. Is this the theory that has been the guideline for ...

  10. [由于远程方关闭传输流,身份验证失败]一次处理支付接口bug记录

    因公司系统升级,出现突然有些银行卡不能支付的情况,最开始排查发现是第三方平台接口返回有问题: 返回如下: 从11月7日下午开始一直联系第三方,第三方开始排查,一直说是数据格式有问题. 修改格式以后问题 ...