Java学习笔记Java学习笔记java框架

Hibernate 框架(第一天笔记)

2018-03-03  本文已影响27人  04999b3feda6

1、Hibernatede 用处、作用和优势

  1. Hibernate使程序员通过操作对象的方式来操作数据库表记录
  2. Hibernate的作用
    • 将数据存储到数据库中
    • 从数据库中读取数据
  3. Hibernate的优势
    • 屏蔽了应用程序与数据库之间的联系,让应用程序操作数据库更加简单
    • 当底层数据库发生变化的时候,应用程序不需要发生改变,方便

2、Hibernate 的快速入门

入门程序创建的是Java项目

  1. 下载Hibernate 的运行环境

  2. 搭建hibernate 的开发环境

    • 创建工程
    • 引入所需的jar包
      • 在工程目录下新建lib文件夹
      • 复制官方发布的lib包中的required下的jar包
      • 引入数据库的jar包
  3. 创建表结构

    • 新建数据库:
      • 数据库名称:hibernate 注意编码方式UTF-8
    • 创建表
  4. 编写Javabean实体类

    • 注意实体类的编写规范
      • 尽量使用包装类型
      • 建议实现序列化接口
      • 一定要无参构造方法
  5. 创建类结构与表结构的映射

    • 在JavaBean所在的包下创建xml的映射文件
      • 映射文件命名规范:实体类名称.hbm.xml
    • 在映射文件中引入约束
      • 如果电脑可以联网,则自动从网上下载DTD,在编写xml就会有提示
      • 如果不能上网,编写配置文件是没有提示的,需要自己来配置实际开发中,都是配置本地DTD文件的
    • 编写映射文件
  6. 编写hibernate的核心配置文件

    • 在src目录下创建核心配置文件 hibernate.cfg.xml
    • 在xml文件中引入DTD约束
    • 没网的情况下,编写xml时,没有提示,需要手动配置,配置方法同映射文件的配置
    • 编写核心配置文件
  7. 编写测试代码

    • 测试代码执行过程
      • 实例化Configuration的对象
      • 读取配置文件(hibernate.cfg.xml)
      • 构建SessionFactry
      • 获取session
      • 开启事务
      • 执行数据库操作(存或读)
      • 提交事务
      • 释放资源

3、Hibernate映射文件

  1. class标签

    • 作用:将类与数据库建立映射联系(建在domain包下)
    • name 属性: 类的全路径名
    • table 属性: 表名(类名与表名一致,那么table属性可以省略)
    • catalog 属性:数据库的名称,基本上都会省略不写
  2. id 标签

    • 作用:用来将类中的属性与表中的主键建立映射,id标签就是用来配置主键的
    • name属性:类中属性名
    • column属性:表中的字段名(如果类中的属性名与表中的字段名一致,那么可以不用写)
    • length属性:字段长度,如果数据库已经创建好了,那么length可以不写。如果没有创建好,生成表结构的时候length最好指定
    • generator标签:用于指定主键的生成策略,class 属性一般取值为native,表示:判断底层数据库类型,如果是mysql,采用自增长来维护主键,如果是orcal,采用序列化来维护主键
  3. property标签

    • 作用:用来将类中的普通属性与表中的字段建立映射
    • name属性:类中的属性名
    • column属性:表中的字段名(如果类中的属性名与表中的字段名一致,则可以省略)
    • length属性:字段的长度。(一般不写)
    • thpe属性:数据类型(一般都不需要编写)

4、Hibernate核心配置文件

  1. 核心配置的两种方式

    • 第一种方式是属性文件的形式,即properties的配置文件
      hibernate.properties

      hibernate.connection.driver_class=com.mysql.jdbc.Driver
      hibernate.connection.url=jdbc:mysql://localhost:3306/hibernate
      hibernate.connection.username=root
      hibernate.connection.password=123456
      hibernate.dialect=org.hibernate.dialect.MySQLDialect
      hibernate.show_sql=true
      hibernate.format_sql=true
      

      缺点:不能加载映射的配置文件,需要手动编写代码去加载

         //创建Configuration类的对象
         Configuration cfg = new configuration();<br>
        //添加映射文件<br>
        cfg.addResource("cn/jhw/domain/Customer.hbm.xml");
      
    • 第二种方式是XML文件的形式,开发基本都会选择这种方式

      hibernate.cfg.xml

      //加载配置文件
      Configuration configuration = new Configuration().configure()
      

      优点:
      - 格式比较清晰
      - 编写有提示
      - 可以在该配置文件中加载映射的配置文件(最主要的)

  2. 关于hibernate.cfg.xml文件的配置方式

    • 必须有的配置

    数据库连接信息

     <!-- 配置数据库驱动类名 -->
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
     <!-- 配置数据库连接地址 -->
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
     <!-- 数据库用户名 -->
     <property name="hibernate.connection.username">root</property>
     <!-- 数据库密码 -->
     <property name="hibernate.connection.password">123</property>
    

    数据库方言

    <!-- 配置数据库方言 -->
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    

    可选配置
    hibernate.show_sql:显示sql语句

    <!-- 打印sql语句 -->
    <property name="hibernate.show_sql">true</property>
    

    hibernate.format_sql:格式化sql语句

    <!-- 格式化sql -->
    <property name="hibernate.format_sql">true</property>
    

    hibernate.hbm2ddl.auto :通过映射转成DDL语句,可取create、create-drop、update(常用)、validate

     <!-- 
     create:指定每次在加在hibernate框架时,先删除表结构,再创建表结构
     create-drop:指定每次在加在hibernate框架时,先删除表结构,再创建表结构,当sf关闭时,删除表结构
     update:指定每次在加在hibernate框架时,验证实体类和表结构是否一致,如果不一致,就更新表结构
     validate:指定每次在加在hibernate框架时,验证实体类和表结构是否一致,如果不一致,就会报错
    -->
     <property name="hibernate.hbm2ddl.auto">update</property>
    

    加载映射文件

     <!-- 引入自定义的映射文件 -->
     <mapping resource="cn/jhw/domain/Customer.hbm.xml"/>
    

5、Hibernate 中的API介绍

  1. Configuration类

    • 作用

      • Configuration对象用于配置并且启动Hibernate
      • Hibernate应用通过该对象来获取对象关系映射文件中的数据,以及动态的配置Hibernate属性,然后创建SessionFactory对象
      • 简单的一句话:加载Hibernate的核心配置文件,可以获取SessionFactory对象
    • 常用方法

      • 默认的构造函数:只能加载类的根路径下,名称为hibernate.properties的配置文件;
      • configure() :用于加载类的根路径下,名称为hibernate.cfg.xml的配置文件;
      • buildSessionFactory() :根据配置文件,构建SessionFactory;
      • addResource():指定映射文件的位置;
      • addClass(Class clazz):指定实体类的字节码;
  2. SessionFactory 接口(一般应用使用一个SessionFactory,最好是应用启动时就完成初始化。

    • 作用

      • SessionFactory接口负责初始话hibernate,充当数据处理源的代理,并负责创建Session对象
    • 常用方法

      • openSession():每次都是生成一个新的Session
      • getCurrentSession():获取当前线程的Session
  3. 编写HibernateUtils的工具类

     /**
      * Hibernate的工具类:创建SessionFactory,获取Session
      * @author jhw
      */
     public class HibernateUtils {
     
         private static final SessionFactory sf;
         
         static{
             sf = new Configuration().configure().buildSessionFactory();
         }
         
         /**
          * 获取Session的工具方法
          * @author jhw
          */
         public static Session openSession(){
             return sf.openSession();
         }
     }
    
  4. SessionFactory 中使用数据库连接池

    • 如果我们要使用第三方的连接池如c3p0,那么需要我们自己手动去配置
    • 配置步骤:
      • 导入c3p0所需的jar包

      • 在hibernate的核心配置文件中配置

        <!-- 指定采用c3p0数据库连接池 -->
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <!-- 在数据库连接池中可用的数据库连接的最小数目 -->
        <property name="hibernate.c3p0.min_size">5</property>
        <!-- 在数据库连接池中可用的数据库连接的最大数目 -->
        <property name="hibernate.c3p0.max_size">20</property>
        <!-- 设置数据库连接的过期时间,以秒为单位,连接池中某个数据库连接空闲时间超过了timeout时间,就会从连接池中清除 -->
        <property name="hibernate.c3p0.timeout">5000</property>
        <!-- 每3000秒检查所有的连接池中的空闲连接,以秒为单位 -->
        <property name="hibernate.c3p0.idle_test_period">3000</property>
        
  5. Session接口

    • 概述

      • Session是在Hibernate中使用最频繁的接口,它提供了和持久化有关的操作,比如增删改查;
      • Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心
      • Session是线程不安全的
      • 持久化对象必须在Session的管理下才可以进行持久化操作
    • 特点

      • 不是线程安全的,应避免多个线程使用同一个Session实例
      • Session是轻量级的,它的创建和销毁不会消耗太多资源。应为每次客户请求分配独立的session实例
      • Session有一个缓存,被称之为Hibernate的一级缓存,每个session实例都有一个自己的缓存。
    • 常用方法

      • save(Object entity); //保存一个实体到数据库
      • update(Object entity); //更新一个实体
      • delete(Object entity); //删除一个实体
      • get(Class clazz,Serializable id);//根据id查询一个实体。Class:表示要查询的实体类字节码 Serializable:就是查询条件
      • beginTransaction();//开启事务,并返回事务对象
      • load(Class clazz,Serializable id);//根据id查询一个实体。Class:表示要查询的实体类字节码 Serializableb:就是查询条件
  6. Transaction 接口

    1. 什么是事务? ---> 事务是逻辑上的一组操作单元,该单元里的所有操作要么全部成功,要么全部取消
    2. 事务的特性:原子性、一致性、隔离性、持久性、

补充 : 实体查询的两个方法

  1. 概念 : 所谓的实体查询即OID查询,就是使用主键作为条件来查询一个实体。其中涉及的方法是Session对象get方法和load方法。

  2. 两种方法的区别:

    • 查询时机不一样

      • get方法任何时候都是立即加载,即只要一调用get马上发起数据库的查询

      • load方法默认情况下是延迟加载,即真正用到对象的非OID字段数据时才会发起查询

      • load方法可以通过配置的方式改为立即加载。
        配置方式

        <class name="Customer" table="cst_customer" lazy="false"> 
        
    • 返回结果不一样

      • get方法永远返回查询的实体类对象
      • load方法当延迟加载时,返回的时实体类的代理对象
  3. 涉及的概念:

    • 立即加载:
      • 是不管用不用马上查询。
    • 延迟加载:
      • 等到用的时候才真正发起查询。
上一篇 下一篇

猜你喜欢

热点阅读