hibernate 简介:
hibernate是一个开源框架,它是对象关联关系映射的框架,它对JDBC作了轻量级的封装,而咱们java程序员可使用面向对象的思想来操纵数据库。
hibernate核心接口
session:负责被持久化对象CRUD操做
sessionFactory:负责初始化hibernate,建立session对象
configuration:负责配置并启动hibernate,建立SessionFactory
Transaction:负责事物相关的操做
Query和Criteria接口:负责执行各类数据库查询
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 session = sf.openSession();//打开Sesssion
5.Transaction tx = session.beginTransaction();//建立并启动事务Transation
6.persistent operate操做数据,持久化操做
7.tx.commit();//提交事务
8.关闭Session
9.关闭SesstionFactory
为何要用hibernate:
1. 对JDBC访问数据库的代码作了封装,大大简化了数据访问层繁琐的重复性代码。
2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工做
3. hibernate使用Java反射机制,而不是字节码加强程序来实现透明性。
4. hibernate的性能很是好,由于它是个轻量级框架。映射的灵活性很出色。它支持各类关系数据库,从一对一到多对多的各类复杂关系。
Hibernate是如何延迟加载?get与load的区别java
1. 对于Hibernate get方法,Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,而后在二级缓存中查找,尚未就查询数据库,数据 库中没有就返回null。这个相对比较简单,也没有太大的争议。主要要说明的一点就是在这个版本(bibernate3.2以上)中get方法也会查找二级缓存!程序员
2. Hibernate load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分状况讨论: 数据库
(1)若为true,则首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID之外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一个ObjectNotFoundException。缓存
(2)若为false,就跟Hibernateget方法查找顺序同样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。session
这里get和load有两个重要区别: 并发
若是未能发现符合条件的记录,Hibernate get方法返回null,而load方法会抛出一个ObjectNotFoundException。app
load方法可返回没有加载实体数据的代 理类实例,而get方法永远返回有实体数据的对象。框架
(对于load和get方法返回类型:好多书中都说:“get方法永远只返回实体类”,实际上并不正 确,get方法若是在session缓存中找到了该id对应的对象,若是恰好该对象前面是被代理过的,如被load方法使用过,或者被其余关联对象延迟加 载过,那么返回的仍是原先的代理对象,而不是实体类对象,若是该代理对象尚未加载实体数据(就是id之外的其余属性数据),那么它会查询二级缓存或者数 据库来加载数据,可是返回的仍是代理对象,只不过已经加载了实体数据。)函数
总之对于get和load的根本区别,一句话,hibernate对于 load方法认为该数据在数据库中必定存在,能够放心的使用代理来延迟加载,若是在使用过程当中发现了问题,只能抛异常;而对于get方 法,hibernate必定要获取到真实的数据,不然返回null。性能
Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体如今表与表之间的关系进行操做,它们都市对对象进行操做,咱们程序中把全部的表与类都映射在一块儿,它们经过配置文件中的many-to-one、one-to-many、many-to-many、
说下Hibernate的缓存机制:
Hibernate的查询方式
Sql、Criteria,object comptosition
Hql:
一、 属性查询
二、 参数查询、命名参数查询
三、 关联查询
四、 分页查询
五、 统计函数
如何优化Hibernate?
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,用多对一取代
4.配置对象缓存,不使用集合缓存
5.一对多集合使用Bag,多对多集合使用Set
6. 继承类使用显式多态
7. 表字段要少,表关联不要怕多,有二级缓存撑腰
hibernate的开发步骤:
开发步骤 1)搭建好环境 引入hibernate最小的jar包 准备Hibernate.cfg.xml启动配置文件 2)写实体类(pojo) 3)为实体类写映射文件"User.hbm.xml" 在hibernate.cfg.xml添加映射的实体 4)建立库表 5)写测试类 得到Configuration 建立SessionFactory 打开Session 开启事务 使用session操做数据 提交事务 关闭资源