Java数据库开发之Hibernate框架(2)Hibernate API详解

一、Hibernate的运行过程

1:应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息。
2:并用这些信息生成一个SessionFactory对象。
3:然后从SessionFactory对象生成一个Session对象。
4:并用Session对象生成Transaction对象。 
5:可通过Session对象的get()、load()、save()、update()、delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作。
6:在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作到数据库中。

二、Configuration对象

        Configuration是hibernate的配置对象,主要用于解析Hibernate配置文件和持久化映射文件中的信息,最重要的功能,是用来创建SessionFactory对象.(主配置文件都要存放在CLASSPATH根路径,映射文件存放在domain同路径)
      可以把所有的配置信息全部放在hibernate.cfg.xml中,一般不使用hibernate.properties. 建议把基本配置信息全部放在hibernate.properties中,而在hibernate.cfg.xml只存在引入映射文件的配置

    Configuration主要管理hibernate.cfg.xml主配置文件,及持久化类与数据表的映射关系(*.hbm.xml文件)。

1):创建Configuration的两种方式:
   1:通过属性文件(hibernate.properties)
            Configuration cfg = new Configuration();
   2:通过Xml文件(hibernate.cfg.xml)
            :加载默认名称的配置文件(hibernate.cfg.xml)
              Configuration cfg = new Configuration().configure();
            :或加载指定名称的配置文件
              Configuration cfg = new Configuration().configure(“myhibernate.cfg.xml”);
2):Configuration类其它方法:
   1:addResource(String resource):导入一个指定位置的映射文件。
   2:addClass(Class clazz):导入与指定类同一个包中的以类名为前缀,后缀为.hbm.xml的映射文件。
   3:buildSessionFactory():创建Session工厂。如:SessionFactory sf = cfg.buildSessionFactory();

3):ServiceRegistry

ServiceRegistry 是 Service 的注册表, 它为Service提供了一个统一的加载/初始化/存放/获取机制. 
     1):Hibernate4.2之前
               ServiceRegistry registry = new ServiceRegistryBuilder().build();
     2):Hibernate4.3以后
               ServiceRegistry registry = new StandardServiceRegistryBuilder().build();
               SessionFactory sessionFactory = cfg.buildSessionFactory(registry);

     3):通过工具类创建SessionFactory对象

三、SessionFactory对象

Configuration对象根据当前的配置信息生成SessionFactory对象。
SessionFactory对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时SessionFactory还负责维护Hibernate的二级缓存:

1):SessionFactory负责创建Session对象.
        SessionFactory sessionFactory = cfg.buildSessionFactory();
        Session session = sessionFactory.openSession();

        
2):SessionFactory是线程安全的,SessionFactory是生成Session的工厂,SessionFactory的创建需要很大的系统开销,实际上,在创建sessionFactory的时候才会去连接数据库,一般的,针对一个应用,一个数据库服务器,只需要一个SessionFactory实例就够了.
        Connection对象是线程不安全的,DataSource却是线程安全的.
        Connection对象每次都要创建新的对象,DataSource在开发中只需要存在一个实例即可.

3):SessionFactory对象中openSession和getCurrentSession方法的区别
   1:openSession:这个方法代表,开启一个全新的Session(测试环境)  
           1.全新的连接,好比创建新的Connection对象.
           2.全新的事务
           3.全新的一级缓存
   2:getCurrentSession:得到当前上下文中的session,绑定到当前线程.(开发环境)
          1.如果当前上下文中存在session,则使用该session;
          2.如果当前上下文中不存在session,则使用openSession创建一个新的session;
          3.要使用getCurrentSessoin,必须在hibernate.cfg.xml中配置
                        <property name="hibernate.current_session_context_class">thread</property>
          4.getCurrentSession得到的session是和事务绑定的(Spring集成Hibernate的方式);
                  1,无论是DML还是DQL ,都必须开启事务
                  2,当事务提交的时候,session就跟着关闭了.-->此时不需要人为的调用:session.close()
   3:我们平时在测试的时候,还是使用openSession就可以了,关于事务的解决到spring中;

 

四、Session对象

Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。
此对象的生命周期很短。

Session对象,通过SessionFactory对象创建而来,包含了Connection对象,封装了很多操作方法.
1):Session类的一些方法: 
     1:取得持久化对象的方法: get()、load()
     2:持久化对象保存,更新和删除:save(Object)、update(Object)、delete(Object)
     3:查询的方法:createQuery(String)、createCriteria(Class)
     4:管理事务的方法:beginTransaction()、getTransaction()(获取当前Session中关联的事务对象)
     5:管理Session的方法:isOpen()、flush()、clear()、evict()、close()等。 clear():清空一级缓存所有对象,evict(Object o):从一级缓存中清除指定的对象.
2):Session的缓存
     1:session不是线程安全的(使用局部变量),所以session的最大生命周期:一个线程。
     2:Session中有一个缓存,称为一级缓存。显式执行flush()方法之前,所有的持久层操作的数据都缓存在session对象处。它存放当前工作单元加载的对象。
     3:在一个session的生命周期之内,连续拿相同类型,相同ID的对象,只需要发送一次SQL。
     4:一级缓存能提高一定的性能,但是有限(期待二级缓存).
     5:session加载出来的对象,都存放于一级缓存中进行管理.

按照方法的功能,把session的方法分为:
1):事务相关:
          Transactionsession.beginTransaction():标记打开当前session绑定的事务对象。
          Transactionsession.getTransaction():得到和当前session绑定的事务对象。
2):一级缓存相关:
         session.clear():清除一级缓存中所有的对象。
         boolean contains(Object entity):判断一级缓存中是否有给定的对象。
         session.evict(Object entity):从一级缓存中清除指定的对象。
         session.flush():把一级缓存中的脏数据同步到数据库中。
         session.refresh(Objectentity):强制重新查询对象,相当于把数据库中的数据同步到一级缓存中。
3):持久化操作相关:
         session.delete(Objectentity):从数据库中删除一个对象
         session.update(Objectentity):更新一个对象
         session.get(ClassentityType,Serializableid):根据主键查询一个对象
         session.load(ClassentityType,Serializableid):根据主键加载一个对象
              1.load方法是一个延迟加载(lazy-load)的方法;把对象的获取(SQL)延迟到了真正使用这个对象的时候才发送;
              2.真正使用?当使用一个非主键属性的时候;
              3.load实现原理?使用动态代理,为load的domain动态创建了一个子类,在这个子类中,复写所有非主键调用方法,在这些方法中,去发送.
          session.save(Objectentity):保存一个对象
          session.persist(Objectentity):保存一个对象(
               1,同步JPA的接口方法;
               2,和save的区别:在没有事务环境下,save方法会发送INSERT SQL,persist不会;)
          session.saveOrUpdate(Objectentity):如果对象没有保存到数据库,则保存,如果已经保存过,则更新。
          session.merge(Objectentity):等同于saveOrUpdate方法。
               1,同步JPA的接口方法;
               2,和saveOrUpdate的区别:在没有事务环境下,saveOrUpdate方法会发送INSERT SQL,merge不会;
4):其他:
          session.close():关闭session,相当于关闭了和session关联的connection对象。关闭session之后,就不能再使用这个      session完成持久化相关的操作。
           session.doWork(Workwork):Hibernate提供给程序员直接使用JDBC的一个途径。
           session.doReturningWork(ReturningWork):Hibernate提供给程序员直接使用JDBC的一种途径。
           Serializablesession.getIdentifier(Objectentity):得到一个对象的主键值

 session 上面所有的方法都在促使对象的状态发生改变.

五、Transaction对象

Transaction代表一次原子操作,它具有数据库事务的概念。
所有持久层都应该在事务管理下进行,即使是只读操作。

2):Transaction对象:代表对事务的封装;
         1.Transaction tx = session.beginTransaction():设置当前事务为活动状态
         2.Transaction tx = session.getTransaction():得到当前session上面已经活动的事务对象。
             注意,在调用这个方法之前必须调用beginTransaction()方法;(该方法得到的对象永远不会为空)

3):常用方法:
        1.tx.commit():提交相关联的session实例
        2.tx.rollback():撤销事务操作
        3.wasCommitted():检查事务是否提交。

六、Query和Criteria接口

Query和Criteria接口都是查询接口,Query实例包装了HQL查询语句,hql是面向对象的,他引用类名及类的属性名,而不是表名和字段名。
Criteria接口完全封装了基于字符串形式的查询语句,比Query接口更面向对象,他擅长执行动态查询。 
1):Query接口有如下常用方法:
        1:list():查询一个结果集合。
        2:uniqueResult():查询一个唯一的结果,如果没有结果,则返回null,如果结果有多个,就抛异常。

        例1:
        Query query =session.createQuery("FROM User")// 使用HQL查询
        List<User> list = query.list(); 

        例2:
        List<User> list = session.createQuery("FROM User WHERE id=5").list(); // 使用HQL查询

        例3:
        List<User> list = session.createQuery("FROM User ORDER BY id").list(); // 使用HQL查询
        
2):Criteria查询
        例1:
        Criteria criteria = session.createCriteria(User.class);
        List<User> list = criteria.list();

        例2:
        Criteria criteria = session.createCriteria(User.class);
        // 增加过滤条件
        criteria.add(Restrictions.eq("id", 5)); // id=5的条件
        List<User> list = criteria.list();
        
        例3:
        Criteria criteria = session.createCriteria(User.class);
        // 增加排序条件
        criteria.addOrder(Order.asc("id"));
        List<User> list = criteria.list();

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值