• Hibernate 框架入门(一)


    1. SSH

    • Web 层: Struts2
    • 业务层: Spring
    • 持久层: Hibernate

    2. Hibernate 概述

    1. 概述

      • Hibernate 是一个对象关系映射框架(ORM 框架);
      • 对 JDBC 访问数据库的代码做了封装,简化了开发;
      • 可以通过操作对象的方式来操作数据库表记录;
    2. ORM(对象关系映射)

      • O: 面向对象领域的 Object (JavaBean 对象)
      • R: 关系数据库领域的 Relational (表的结构)
      • M: 映射 Mapping (XML 的配置文件)

    3. 搭建开发环境

    3.1 Jar 包
    • MySql 驱动包
    • Hibernate 框架目录下的 required 下的所有包
    • 日志 jar包(log4j, slf4j-api, slf4j-log4j12)
    3.2 创建类(JavaBean)与表结构的映射
    • 一般该映射文件存储在 JavaBean 所在的包下;
    • 默认的命名规则: 实体类名.hbm.xml;
    • 配置本地文件,显示编写配置文件时的提示(见下图);
    • 有多少个JavaBean 类就需要编写多少个映射配置文件;
    • JavaBean中,成员变量不使用基本数据类型,而使用包装类;因为未赋值的情况,基本数据类型默认为0, 而
      包装类默认为 null;

    // Customer.hbm.xml
        <?xml version="1.0" encoding="UTF-8"?>
    
        // 该条约束可以在 Libraries/web app Libraries/hibernate-core/org.hibernate/
        //             最底部的 hibernate-mapping-3.0.dtd 中找到
        <!DOCTYPE hibernate-mapping PUBLIC
                    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
            <hibernate-mapping>
                // 配置类和表结构的映射
                <class name="cn.itheima.domain.Customer" table="cst_customer">
    
                    // name 为 JavaBean 类中的属性
                    // column 为表结构的字段
                     <id name="cust_id" column="cust_id">
                        // 主键的生成策略
                        <generator class="native"/>
                    </id>
    
                      // 配置其他属性
                      <property name="cust_name" column="cust_name"/>
                      <property name="cust_user_id" column="cust_user_id"/>
                      <property name="cust_create_id" column="cust_create_id"/>
                      ...
                </class>
            </hibernate-mapping>
    
    3.3 编写 Hibernate 核心的配置文件
    • 存储在 src 目录下,名称固定: hibernate.cfg.xml;
    // hibernate.cfg.xml
        <?xml version="1.0" encoding="UTF-8"?>
    
        // 该条约束可以在 Libraries/web app Libraries/hibernate-core/org.hibernate/
        //             最底部的 hibernate-configuration-3.0.dtd 中找到
        <!DOCTYPE hibernate-configuration PUBLIC
                    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
        <hibernate-configuration>
    
            // 首先配置 session-factory 标签, 一个数据库对应一个 SessionFactory 标签
            <session-factory>
    
                // 必须要配置的参数有 5 个, 四大参数和数据库方言
          <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
          <property name="hibernate.connection.url">
                jdbc:mysql://localhost:3306/hibernate_day01
           </property>
                <property name="hibernate.connection.username">root</property>
                <property name="hibernate.connection.password">root</property>
    
                // 数据库方言(必须配置)
                <property name="hibernate.dialect">
                            org.hibernate.dialect.MySQLDialect
                </property>
    
                // mysql的版本为 5.5 时, 方言需要设置为 org.hibernate.dialect.MySQL5Dialect
    
                //可选配置
                // 在控制台显示 SQL 语句
                <property name="hibernate.show_sql">true</property>
                // 在控制台格式化输出 SQL 语句,提高可读性
                <property name="hibernate.format_sql">true</property>
                // 生成数据库的表结构(通过映射转成 DDL 语句)
                // update: 如果没有表结构,创建表结构; 如果存在,不创建,只添加数据 (也可以向表中增加列)
                // create: 每次都会创建一个新的表(测试的时候使用)
                // create-drop: 每次都会创建一个新的表, 当执行结束之后,将创建的这个表删除(测试时候使用)
                // validate: 校验! 如果有表,使用原来的表,同时校验映射文件与表中字段是否一致; 如果不一致,就会报错
                <property name="hibernate.hbm2ddl.auto">update</property>
    
    
                // 引入映射配置文件
                <mapping resource="cn/itheima/domain/Customer.hbm.xml"/>
            </session-factory>
        </hibernate-configuration>
    

    3.4 编写 Hibernate 入门代码

    // 保存客户信息
        public class Demo{
    
            public void testSave(){
    
                /*
                 * 1. 加载核心配置文件
                 * 2. 创建 SessionFactory 对象, 用于生成 Session 对象
                 *    该 Session 对象是由 Hibernate 框架提供的
                 * 3. 创建 Session 对象
                 * 4. 开启事务
                 * 5. 编写保存客户信息代码
                 * 6. 提交事务
                 * 7. 释放资源
                 */
    
                 // 1. 加载配置文件
                 Configuration config = new Configuration();
                 // 默认加载 src 目录下的 hibernate.cfg.xml 配置文件
                 config.cofigure();
    
                 // 2. 创建 SessionFactory 对象
                 SessionFactory factory = config.buildSessionFactory();
                 // 3. 创建 session 对象
                 Session session = factory.openSession();
                 // 4. 开启事务
                 Transaction tr = session.beginTransaction();
    
                 // 5. 编写保存用户信息代码
                 Customer c = new Customer();
                 // 因为主键已经设置为自动增长,所以不必再设置主键(cust_id)的值
    
                 c.setCust_name("张三");
                 c.setCust_level("2");
                 c.setCust_phone("110");
    
                 // 保存数据, 操作对象就相当于操作数据库的表结构
                 session.save(c);
    
                 // 6. 提交事务
                 tr.commit();
                 // 7. 释放资源
                 session.close();
                 factory.close();
            }
        }
    

    4. Hibernate 的配置文件详解

    4.1 映射配置文件, 即Customer.hbm.xml

    1. <class> 标签, 用来将类与数据库表建立映射关系.
      • name 属性: 类的全路径;
      • table 属性: 表名(如果类名与表名一致,table 属性可以省略);
      • catalog 属性: 数据库的名称,基本上都不会写;
    2. <id> 标签, 用来将类中的属性和表中的主键建立映射, id标签就是用来配置主键的.
      • name 属性: 类中的属性名;
      • column 属性: 表中的字段名. (如果类中的属性名和表中的字段名一致, 那么 column 可以省略);
      • length 属性: 字段的长度. 如果数据库已经创建好了,那么 length 可以不写; 如果没有创建好,
        生成表结构时, length 最好指定;
    3. <property> 标签, 用来将类中的普通属性和表中的字段建立映射.
      • name 属性, 类中的属性名;
      • column 属性, 表中的字段名;
      • length 属性, 数据长度;
      • type 属性, 数据类型(一般都不需要编写,如果写需要按照规则来编写)
        • Hibernate 的数据类型: type=string;
        • Java 的数据类型: type=java.lang.String;
        • 数据库字段的数据类型(使用子标签): <column name="列名" sql-type="varchar"></column>

    4.2 核心配置文件

    1. 核心配置文件可以使用 .properties 的配置文件
      • 缺点: 不能加载映射的配置文件,需要手动编写代码去加载;
      • 因此,开发基本使用 XML 文件的形式.

    5. Hibernate 常用的接口和类

    5.1 Configuration 类

    • Configuration 对象用于配置并启动 Hibernate;
    • Hibernate 应用通过该对象来获得对象-关系映射文件中的元数据, 以及动态配置 Hibernate 的属性,
      然后创建 SessionFactory 对象;
    • 简单说, 加载 Hibernate 的配置文件,可以获取 SessionFactory 对象;
    // Hibernate 支持 xml 和 properties 类型的配置文件, 在开发中基本都使用 XML 配置文件
        // 如果使用 properties 文件
        Configuration config = new Configuration(); // 这样就可以加载配置文件
        // 手动加载映射文件
        config.addResource("cn/itheima/domain/Customer.hbm.xml");
    
        // 如果使用 XML 文件
        Configuration config = new Configuration();
        config.configure();  // 需要使用这句话, 才算加载配置文件
    
        // 简写格式
        Configuration config = new Configuration().configure();
    

    5.2 SessionFactory 接口

    1. SessionFactory 是生成 Session 对象的工厂类;
    2. SessionFactory 的特点:
      • 由 Configuration 通过加载配置文件创建该对象;
      • SessionFactory 对象中保存了当前数据库配置信息和所有映射关系以及预定义的 SQL 语句.
        同时, SessionFactory 还负责维护 Hibernate 的二级缓存;缓存预定义 SQL 语句是为了提高效率;
      • 一个 SessionFactory 实例对应一个数据库,应用从该对象中获得 Session 实例;
      • SessionFactory 是线程安全的,意味着它的一个实例可以被应用的多个线程共享;
      • SessionFactory 是重量级的,意味着不能随意创建或销毁它的实例.
      • SessionFactory 需要一个较大的缓存,用来存放预定义的 SQL 语句及实体的映射信息. 另外,可以
        配置一个缓存插件,这个插件被称之为 Hibernate 的二级缓存,被多线程所共享.
    3. 一般一个应用使用一个 SessionFactory, 并且最好是在应用启动时,就完成初始化.
    // 编写 HibernateUtil 的工具类
        public class HibernateUtil {
            public static final Configuration CONFIG;
            public static final SessionFactory FACTORY;
    
            // 编写静态代码块
            static{
                // 加载 XML 的配置文件
                CONFIG = new Configuration().configure();
                // 构造工厂
                FACTORY = CONFIG.buildSessionFactory();
            }
    
            // 从工厂中获取 session 对象
            public static Session getSession(){
                return FACTORY.openSession();
            }
        }
    

    5.3 Session 接口

    1. 概述
      • Session 称之为持久化管理器,它提供了和持久化有关的操作,比如添加,修改,删除,加载和查询实体对象;
      • Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心;
      • 所有的持久化对象必须在 session 的管理下才可以进行持久化操作;
      • 持久化类与 Session 关联起来后就具有了持久化的能力;
    2. 特点
      • Session 是线程不安全的,应避免多个线程使用同一个 Session 实例;
      • Session 是轻量级的,它的创建和销毁不会消耗太多的资源.应为每次客户请求分配独立的 Session 实例;
      • Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久化操作的数据都缓存在 session 对象中.
    3. 常用方法
      • save(obj): 保存;
      • delete(obj): 删除; 删除之前,应该先查询是否存在;
      • get(Class clazz, Serializable id): 通过主键查询一条记录;
        clazz 表示要查询的 JavaBean 的 class 对象, id 表示主键的值;
      • update(obj): 修改, 修改之前,应该先查询;
      • saveOrUpdate(obj): 保存或者修改(如果没有数据,保存;如果有,修改数据);
      • createQuery(): HQL 语句的查询方式;

    5.4 Transaction 接口

    1. Transaction 是事务的接口.
    2. 常用方法
      • commit(): 提交事务;
      • rollback(): 回滚事务;
    3. 特点
      • Hibernate 框架默认情况下事务不自动提交,需要手动提交事务;
      • 如果没有开启事务,那么每个 Session 的操作,都相当于一个独立的事务;

    参考资料

  • 相关阅读:
    VpnService
    css样式占位和不占位隐藏元素的方法
    apply和call用法
    根据条件改变表格内容
    bootstrap中给表格设置display之后表格宽度变小问题解决
    根据条件决定是否为input设置只读属性
    根据条件决定My97DatePicker日期控件弹出的日期格式
    关于关闭TAB,IFRAME占用的内存不能释放问题
    jquery中attr和prop的区别分析
    jQuery height()、innerHeight()、outerHeight()函数的区别详解
  • 原文地址:https://www.cnblogs.com/linkworld/p/7694029.html
Copyright © 2020-2023  润新知