Hibernate 笔记大全—

Hibernate4框架:


  1. 作用:能让开发人员以面向对象的方式操作数据库,从而简化持久层的开发。
  2. ORM框架:Object Relation Mapping : O/R Mapping 对象关系映射。
            Object: 面向对象的编程语言.
   Relation: 关系型数据库。
   ORM框架主要负责面向对象的编程语言与关系型数据库之间转换。


     ORM框架:只是一种思想,不是一个具体的框架。
     ORM框架有哪些:Hibernate、TopLink、JDO等。
     ORM框架的设计思想:
          面向对象的编程语言(Java)     关系型数据库
                            类                                  表
                           对象                         一行数据
                         属性(Field)                     一列
     
  3. JPA: Java Persistence Api : Java持久化api。
     a. JPA是Sun根据ORM框架的思想,制订了持久化层的规范。
        JDBC: 是Sun为数据库厂商制定的数据库连接的规范。Java DataBase Connection.
     
        Hibernate框架它对JPA做了实现。


        注意:编程时尽量面向JPA编程,到时底层ORM框架就可以随意切换。


  4. hibernate与jpa:


     hibernate出现的时间比较早,所以学习时,既要学习hibernate又要学习jpa.


一、Hibernate的下载与安装:
    a. 到官方网站:http://www.hibernate.org 下载hibernate的压缩包。
       hibernate-release-4.3.1.Final.zip
    
    b. 文件目录说明:
       -- documentation : 存放hibernate所有文档。
          devguide : 开发指导。
          javadocs : hibernate的api文档。
 manual : 开发指南。
          quickstart : 快速开始。


       -- lib : (依赖的第三方jar包,自已的jar包)
          required : 必须的。
          jpa : 必须的。
          optional : (可选的) c3p0连接池(必须的)、proxool连接池、ehcache缓存框架。


       -- project : 源码、示例、测试用例。 etc文件夹下面存放了hibernate的配置文件模版。


二、Hibernate的简单使用:
    第一步:拷贝jar (required、jpa、c3p0、mysql驱动).
    第二步:写一个hibernate.cfg.xml(全局的配置文件).
    第三步:开发
            a. 开发持久化类。
      持久化类 = pojo + annotation注解(@Entity).
      持久化类 = pojo + Xxx.hbm.xml配置文件.


      pojo : Plain Old Java Object 最简单、最传统的java Bean.
               写pojo有下面四个要求:
      -- 要提供一个无参构造器
      -- 所有的属性都要有setter与getter方法。
      -- 属性不能用final修饰。
      -- 必须提供一个唯一的标识符属性。(@Id)
            b. hibernate编程。
               Configuration : 加载hibernate.cfg.xml配置文件,创建SessionFactory.
      SessionFactory : 专门创建Session
      Session : 持久化操作。
      Transaction : 事务。




  Session 会话(持续的有效时间)
  Servlet(HttpSession) : 浏览器打开到关闭。
  MyBatis (SqlSession) : 数据库连接的获取到数据库连接的关闭。
  Hibernate (Session)  : 数据库连接的获取到数据库连接的关闭。
  


三、配置文件:
    1. ehcache.xml : 缓存的配置文件。


    2. hibernate.cfg.xml : 核心的全局的配置文件
       数据库方言、是否显示sql语句、是否格式化sql语句、是否支持自动建表、
       数据库连接的信息、c3p0信息。
       <property name=""></property>
       


       持久化实体的配置:
       <mapping class="持久化实体类"/>
       <mapping resource="org/fkjava/domain/User.hbm.xml"/>


    3. hibernate.properties : 属性文件。
       添加持久化实体需要调用:
       Configuration.addAnnotatedClass(User.class)




    4. Xxx.hbm.xml : 配置pojo 与 表之间的映射关系。(被pojo 加 annotation注解取代).




四、Hibernate的体系结构:
    基础的api说明:
    1. Configuration : 加载hibernate.properties|hibernate.cfg.xml文件,产生一个SessionFactory。


    2. SessionFactory : 它是当前数据库在内存中镜像,因为它封装了数据源,实体与表之间映射关系.
           整个应用只需一个SessionFactory,一个SessionFactory对应的是一个数据库,所在以在应用启动创建
  SessionFactory, 在应用关闭时,关闭SessionFactory。


       a. 它是线程安全的,允许多线程并发访问。
       b. 它是创建Session的工厂。
       c. 可选的二级缓存。(默认的话是关闭)
    
    3. Session : 是应用程序与持久层交互的单线程对象。它存活的时间比较短。
       a. 它底层封装了数据库连接(Connection), 用完就要关闭.
       b. 它是创建Transaction的工厂。
       c. 必须开启的一级缓存。
       d. 它是线程不安全的。(ThreadLocal)


    4. Transaction : hibernate的事务,它底层封装了jdbc事务(局部事务),jta(分布式事务)
                            WebShere(IBM)、WebLogic(Oracle)、Jboss.




五、Hiberante的CRUD操作:
    Session管理下持久化实体的状态。
    a. transient : 瞬态。User u = new User();


    b. persistent : 持久化。在Session的一级缓存中。在持久化状态下,对该实体所做修改,
会同步到底层的数据库。当调用session.flush()或者是transaction.commit().


session.contains(u) : 返回true, u就持久化状态。
        
    c. detached : 脱管。脱离了Session管理,不在Session的一级缓存中,曾经被Session管理过。
       User u = new User(); // 瞬态
       u.setId(3); // 脱管
   
    1. 添加( 瞬态 --> 持久化状态):
       a. Serializable id  = session.save(u); 立即发送insert语句,保存数据。(但是主键id要自增长). 
          u : 持久化状态


       b. session.saveOrUpdate(u) : 添加或者修改. (先根据主键id查询做判断,是添加还是修改)。
          u : 持久化状态


       c. session.persist(u) : 延迟发送insert语句,保存数据。(跟事务是否开启有关系)
 u : 持久化状态


       d. User user = (User)session.merge(u) : 集成了添加与修改
         // u : 瞬态    user : 持久化状态
    
    2. 修改:
        a. 在脱管状态下( 脱管---> 持久化状态):
  session.update(u); 
  session.saveOrUpdate(u);
           User user = (User)session.merge(u);


b. 在持久化状态下
  根据主键id获取一个已持久化的对象,直接调用setter方法即可。
  User user = get(User.class, 5);
  user.setXxxxx();


    3. 删除:
       a. 在脱管状态下( 脱管---> 持久化状态):
          User user = new User();
 user.setId(5);
          session.delete(user);


       b. 在持久化状态下
          User user = get(User.class, 5);
 session.delete(user);


    4. 根据主键查询:
       session.get(User.class, 1) : 立即发送sql语句加载数据。




       session.load(User.class, 1) : 延迟加载数据,它开始返回一个代理对象,
                      当你要真正用的时候才分发送sql语句。(当有真正用它时有可能会出现异常)


    5. session.evict(entity) : 从session一级缓存中踢出entity.
       session.clear() : 清空session一级缓存中所有实体。
   




注意:只加@Entity的话,持久化实体生所表名是它的类名列名就是实体属性名。


dtd位置:
 hibernate-release-4.3.1.Final\project\hibernate-core\src\main\resources\org\hibernate



版权声明:本文为ldc5306590原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。