zoukankan      html  css  js  c++  java
  • hibernate 学习 五 hibernate核心接口

    一 Configuration接口

      Configuration对象只存在于系统的初始化阶段。配置相关。

      配置文件可以使用默认的路径,也可以指定路径。

      Configuration config = new Configuration().configure()  

      SessionFactory sessionfactory = Config.buildSessionFactory()

      也可以使用new Configuration().setProperty()的方式动态配置属性

    二 SessionFactory接口

      通常一个应用程序只有一个SessionFactory实例,主要用来生成session对象。

      但是,当项目中要操作多个数据库时,则必须为每一个DB指定一个SessionFactory。

      Hibernate中sessionFactory相当于一个缓冲区,hibernate自动生成的SQL,映射数据,数据库配置,以及某些可重复利用的数据可以存放在换出去中,这是hibernate的二级缓存。

      SessionFactory是线程安全的,他的一个实例可以多个线程共享。   

      OpenSession():  调用时创建一个新的,用完后,要手动关闭,使用Close

      GetCurrentSession(): 创建一个实例,并绑定到当前线程,在提交或失败回滚后自动关闭。

             OpenSession用的比较少,一般都使用GetCurrentSession();

                                      必须在hibernate.cfg.xml中配置事务。

                      <session-factory>  
                        <!--  Put other elements here -->  
                        <property name="hibernate.current_session_context_class">thread/JTA</property>  
                      </session-factory>
    JDBC事务和JATA事务的区别
        JDBC的一切行为包括事务是基于一个Connection的,在JDBC中是通过Connection对象进行事务管理。在JDBC中,常用的和事务相关的方法是:
    setAutoCommit、commit、rollback等。
    JDBC为使用Java进行数据库的事务操作提供了最基本的支持。通过JDBC事务,我们可以将多个SQL语句放到同一个事务中,
    保证其ACID特性。JDBC事务的主要优点就是API比较简单,可以实现最基本的事务操作,性能也相对较好。
    但是,JDBC事务有一个局限:
    一个 JDBC 事务不能跨越多个数据库!!!所以,如果涉及到多数据库的操作或者分布式场景,JDBC事务就无能为力了。
    JTA:分布式事务

    三 Session接口

      session对象的生命周期以Transaction对象的事务开始和结束为边界。

      对象的三个状态:(1)瞬时态; (2)持久态; (3)游离态;

      save() : 将对象加入缓存; 生成唯一标识; 生成insert语句

      update(): 将对象加入缓存; 生成update语句;

      saveOrUpdate():

      delete():

      get(): 先从一级缓存查,如果没有则越过二级缓存,查DB; 无论Class元素的lazy属性是什么,都直接返回实体类;  不存在时返回NULL; 不延迟加载

      load(): 先一级缓存,再二级缓存;当Class元素的lazy属性是false时,会返回持久化对象的代理类实例;  不存在返回异常; 延迟加载

      contains():

      evict() :  清空缓存;

      clear() :清空缓存

      createQuery(): HQL

      createCriteria():

      createSQLQuery( ):SQL

      createFilter()          

    四 Transaction接口

      管理事务的接口;

      事务:为了避免数据不完整,不一致;

      事务的ACID:原子性, 一致性,持久性,隔离性(可串行性)。

      不完全的事务隔离会导致如下问题:

              更新丢失:

               脏数据:

               不可重复读:

               幻读:

      隔离级别:  

          读操作未提交:可以读取事务的中间状态(读取未提交的数据), 脏读,不可重复读,幻读

               读操作已提交:不能读取未提交的事务;   不会脏读, 但是可以不可重复读,幻读;

                可重读:保证能读取相同的数据不会丢失,不会脏读,不会不可重复读;但是会幻读;

           可串行化:最严格;

         hibernate可以对事务进行配置:本地事务  或者  全局事务;  还可以对隔离级别进行设置(8-串行化; 4-可重复读;2-读已提交; 1:读未提交);

      常用方法

        commit():

        rollback(): 

    五 Query接口

      HQL ,  QBC, SQL 三种查询的方式;

       HQL: 不是引用表名和字段名,而是引用类名和属性名。

       setter():设置HQL中的参数;参数有两种表示:     一是用名称:  是  “:参数名”(这种方式更容易阅读);  二是用:?

        list(): 将所有结果集中的数据转换为java对象,占很大空间,浪费;

        iterator():  把使用到的数据才转成java对象;但是必须顺序读取。

        uniqueResult() : 返回唯一的结果;

       executeUpdate() :  

        setFirstResult()

       setMaxResult() :

       实体查询:  String    hql = "from Users as U";

            属性查询:   “select name,age from User”

                              "slect new User(name, age) from User"

      HQL 聚集函数: 

      HQL分组和排序:

      HQL子查询:

    六 Criteria接口

      更加面向对象的查询方式

     

  • 相关阅读:
    Hibernate之HQL查询
    Java设计模式----状态模式(State)
    Java设计模式----备忘录模式(Memento)
    Java设计模式----命令模式(Command)
    Java设计模式----责任链模式(Chain of Responsibility)
    Java基础小知识
    Hibernate检索策略
    Java设计模式----观察者模式(Observer)
    Google代码实验室
    Codeforces Round #257 (Div. 2) 前四题
  • 原文地址:https://www.cnblogs.com/liufei1983/p/8612992.html
Copyright © 2011-2022 走看看