是一个开源框架,它是对象关联关系映射的框架,它对JDBC做了轻量级的封装,可以使用面向对象的思想来操纵数据库
一、Hibernate是对JDBC进一步封装
原来没有使用Hiberante做持久层开发时,存在很多冗余,如:各种JDBC语句,connection的管理,所以出现了Hibernate把JDBC封装了一下,我们不用操作数据,直接操作它就行了。
二、我们再从分层的角度来看
我们知道非常典型的三层架构:表示层,业务层,还有持久层。Hiberante也是持久层的框架,而且持久层的框架还有很多,比如:IBatis,Nhibernate,JDO,OJB,EJB等等。
三、Hibernate是开源的一个ORM(对象关系映射)框架。
ORM,即Object-Relational Mapping,它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。这样,我们在操作数据库的时候,不需要再去和复杂SQL打交道,只要像操作对象一样操作它就可以了(把关系数据库的字段在内存中映射成对象的属性)
1、Configuration接口:负责配置并启动Hibernate
2、SessionFactory接口:负责初始化Hibernate
3、Session接口:负责持久化对象的CRUD操作
4、Transaction接口:负责事务
5、Query接口和Criteria接口:负责执行各种数据库查询
注意:Configuration实例是一个启动期间的对象,一旦SessionFactory创建完成它就被丢弃了
工作原理
配置好hibernate的配置文件和与类对应的配置文件后,启动服务器
服务器通过实例化Configuration对象,读取hibernate.cfg.xml文件的配置内容,并根据相关的需求建好表或者和表建立好映射关系
通过实例化的Configuration对象就可以建立sessionFactory实例,进一步,通过sessionFactory实例可以创建 session对象
得到session之后,便可以对数据库进行增删改查操作了,除了比较复杂的全文搜索外,简单的操作都可以通过hibernate封装好的 session内置方法来实现
此外,还可以通过事物管理,表的关联来实现较为复杂的数据库设计
优点:hibernate相当于java类和数据库表之间沟通的桥梁,通过这座桥我们就可以做很多事情
初始化
1.通过Configuration config = new Configuration().configure();//读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.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
Configuration cfg = new Configuration().configure();
//建立SessionFactory
SessionFactory factory =cfg.buildSessionFactory();
//取得session
Session session = null;
try{
//开启session
session = factory.openSession();
//开启事务
session.beginTransaction();
User user = new User();
user.setName("jiuqiyuliang");
user.setPassword("123456");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//保存User对象
session.save(user);
//提交事务
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
//回滚事务
session.getTransaction().rollback();
}finally{
if(session != null){
if(session.isOpen()){
//关闭session
session.close();
}
}
}
}
session接口的作用:1.一个实例代表与数据库的一次操作,包括crud 2.是线程不同步的(不安全的),因此要保证在同一线程中使用,可以用getCurrentSession()
比较get(),load()这两种查询方法的区别:主要有两个,第一,get它会到缓存中先去查,查不到,向数据库发送请求,如果找不到,则返回NULL;第二,load它不会立即向DB发送请求,也就不会发送SELECT语句,如果找到或没有找到,都会先返回一个代理对象;如果后面要调用查询的对象,则再发送SELECT语句,如果DB中也没有找到,则报异常(对象没有找到的异常),我们称这种现象为懒加载。懒加载这种现象可以取消掉,在*.hbm.xml对象映射文件中默认为true; 它们的共同点:都是会先从缓存中去找数据(一级缓存session,和二级缓存),二级缓存需要配置哦
hibernate中一个对象对应的三种状态:
瞬时态:不在session的管理之下,并且数据库中也没有记录
持久态:处于session的管理之下,并且数据库中有记录
游离态:处于session的管理之下,但在数据库中没有记录
缓存分一级缓存(session级,不需要配置)和二级缓存(sessionfactory级,需要配置)
当我们要进行数据的查询时,程序会先到一级缓存中去查找,如果没有再到数据库中去查找(没配置二级缓存时),当在数据库中找到数据时,会把数据放到一级缓存当中。当然并不是所有的操作都会向一级缓存中存放数据,只有save,update,saveOrupdate,get,load,list,iterator,lock会向一级缓存中存放数据。
那么,有哪些操作会从一级缓存中读取数据呢?get,load.(如果一级缓存中没有对应数据,GET会立即向数据库发送请求,而LOAD会返回一个代理对象,直到真正要用到对象属性时,才向数据库发出查询)
注意:LIST会向一级缓存中放对象,但不会从一级缓存中取对象。query.list(),query.uniqueResult();并且一级缓存没有保护机制,会把内存占满,造成内存溢出。这时我们可以使用clear(),evict()进行清除。evict()就清除一个对象,clear()是清除所有的缓存信息。
session级缓存的生命周期是,当session关闭后,自动删除。
常用的二级缓存有:OScache,EHcache,Hashtable,
二级缓存的配置:是在hibernate.cgf.xml中配置的,配置4个 二级缓存开启,指定用哪种二级缓存,可以指定用统计命中次数和错过次数,指定哪个domain用二级缓存。二级缓存的策略有4种:read-only,read-write(默认),nostrict-read-write,transcational.之后还要在SRC目录下引入,OScache.properties这个文件,因为这里指定用OScache二级缓存。
hibernate 整合ehcahe: http://www.cnblogs.com/jingmoxukong/p/5975994.html
传送门:http://blog.csdn.net/jiuqiyuliang/article/details/39078749
http://blog.csdn.net/baidu_21578557/article/details/51643830