hibernate原理及总结

hibernate介绍

是一个开源框架,它是对象关联关系映射的框架,它对JDBC做了轻量级的封装,可以使用面向对象的思想来操纵数据库


一、Hibernate是对JDBC进一步封装

原来没有使用Hiberante做持久层开发时,存在很多冗余,如:各种JDBC语句,connection的管理,所以出现了Hibernate把JDBC封装了一下,我们不用操作数据,直接操作它就行了。

二、我们再从分层的角度来看

我们知道非常典型的三层架构:表示层,业务层,还有持久层。Hiberante也是持久层的框架,而且持久层的框架还有很多,比如:IBatis,Nhibernate,JDO,OJB,EJB等等。

三、Hibernate是开源的一个ORM(对象关系映射)框架。

ORM,即Object-Relational Mapping,它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。这样,我们在操作数据库的时候,不需要再去和复杂SQL打交道,只要像操作对象一样操作它就可以了(把关系数据库的字段在内存中映射成对象的属性)


hibernate原理及总结_第1张图片


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

你可能感兴趣的:(hibernate,开源框架,java)