houselet

Hibernate 学习笔记

一、hibernate 简介

二、hibernate 架构

三、hibernate ORM

四、hibernate 配置

五、hibernate 注释

六、hibernate 对象

七、hibernate 基本的增删改查

八、hibernate HQL语句

九、hibernate Criteria

十、hibernate 原生sql

十一、hibernate 表关系的处理

 

一、hibernate 简介

  1. Hibernate 是由 Gavin King 于 2001 年创建的开放源代码的对象关系框架。它强大且高效的构建具有关系对象持久性和查询服务的 Java 应用程序。

  2. Hibernate 将 Java 类映射到数据库表中,从 Java 数据类型中映射到 SQL 数据类型中,并把开发人员从 95% 的公共数据持续性编程工作中解放出来。

  3. 支持的数据库:Hibernate 支持几乎所有的主要 RDBMS。

 

二、hibernate 架构

  1. Hibernate 是传统 Java 对象和数据库服务器之间的桥梁,用来处理基于 O/R 映射机制和模式的那些对象。

  2. Hibernate 架构是分层的,作为数据访问层,你不必知道底层 API 。Hibernate 利用数据库以及配置数据来为应用程序提供持续性服务(以及持续性对象)。

     

  3. Hibernate 在三层架构中的地位

 

三、hibernate ORM

ORM 表示 Object-Relational Mapping (ORM),是一个方便在关系数据库和类似于 Java, C# 等面向对象的编程语言中转换数据的技术。ORM 系统相比于普通的 JDBC 有以下的优点:

  1. 使用业务代码访问对象而不是数据库中的表

  2. 从面向对象逻辑中隐藏 SQL 查询的细节

  3. 基于 JDBC 的 \'under the hood\'

  4. 没有必要去处理数据库实现

  5. 实体是基于业务的概念而不是数据库的结构

  6. 事务管理和键的自动生成

  7. 应用程序的快速开发

 

四、hibernate 配置(以MySQL为例)

  1. 环境搭建(可以到 http://www.hibernate.org/downloads 下载hibernate相关jar包),除了hibernate需要的jar包外,还要导入数据库驱动。

     

  2. Hibernate框架核心配置文件(hibernate.cfg.xml

    <!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>
           <!--四个必填项-->
           <!--配置数据源-->
           <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
           <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatedemo?characterEncoding=utf8</property>
           <property name="hibernate.connection.username">root</property>
           <property name="hibernate.connection.password">123456</property>

           <!--可选项-->
           <!--是否输出hibernate相关信息到控制台-->
           <property name="hibernate.show_sql">true</property>
           <property name="hibernate.format_sql">true</property>

           <!--配置方言-->
           <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
           
           <!--配置建表策略-->
           <property name="hibernate.hbm2ddl.auto">update</property>

           <!--关联一下 ORM 文件-->
           <mapping resource="cn/edu/dgut/bean/User.hbm.xml"></mapping>
       </session-factory>
    </hibernate-configuration>

 

  1. Hibernate 持久化类

    public class User {
       private int id;
       private String username;
       private String password;
       private String address;

       public int getId() {
           return id;
      }

       public void setId(int id) {
           this.id = id;
      }

       public String getUsername() {
           return username;
      }

       public void setUsername(String username) {
           this.username = username;
      }

       public String getPassword() {
           return password;
      }

       public void setPassword(String password) {
           this.password = password;
      }

       public String getAddress() {
           return address;
      }

       public void setAddress(String address) {
           this.address = address;
      }

       @Override
       public String toString() {
           return "User{" +
                   "id=" + id +
                   ", username=\'" + username + \'\\'\' +
                   ", password=\'" + password + \'\\'\' +
                   ", address=\'" + address + \'\\'\' +
                   \'}\';
      }
    }

     

  2. Hibernate 映射文件(User.hbm.xml)

    <!DOCTYPE hibernate-mapping PUBLIC
           "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
           "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
       <!--ORM 映射  实体类和 数据表映射-->
       <class name="cn.edu.dgut.bean.User" table="tb_user">
           <id name="id" column="id">
               <!--设置主键策略-->
               <generator class="native"></generator>
           </id>
           <property name="username" column="username"></property>
           <property name="password" column="password"></property>
           <property name="address" column="address"></property>
       </class>

    </hibernate-mapping>

 

五、hibernate 注释

Hibernate 注释是无需使用 XML 文件来定义映射的最新方法。你可以额外使用注释或直接代替 XML 映射元数据。

Hibernate 注释是一种强大的来给对象和关系映射表提供元数据的方法。所有的元数据被添加到 POJO java 文件代码中,这有利于用户在开发时更好的理解表的结构和 POJO。

  1. 添加注释相关jar包

    hibernate-annotations.jar, hibernate-comons-annotations.jar和 ejb3-persistence.jar

     

  2. 用带有注释的 Employee 类来映射使用定义好的 Employee 表的对象

    import javax.persistence.*;

    @Entity
    @Table(name = "EMPLOYEE")
    public class Employee {
      @Id @GeneratedValue
      @Column(name = "id")
      private int id;

      @Column(name = "first_name")
      private String firstName;

      @Column(name = "last_name")
      private String lastName;

      @Column(name = "salary")
      private int salary;  

      public Employee() {}
      public int getId() {
         return id;
      }
      public void setId( int id ) {
         this.id = id;
      }
      public String getFirstName() {
         return firstName;
      }
      public void setFirstName( String first_name ) {
         this.firstName = first_name;
      }
      public String getLastName() {
         return lastName;
      }
      public void setLastName( String last_name ) {
         this.lastName = last_name;
      }
      public int getSalary() {
         return salary;
      }
      public void setSalary( int salary ) {
         this.salary = salary;
      }
    }

    Hibernate 检测到 @Id 注释字段并且认定它应该在运行时通过字段直接访问一个对象上的属性。如果你将 @Id 注释放在 getId() 方法中,你可以通过默认的 getter 和 setter 方法来访问属性。因此,所有其它注释也放在字段或是 getter 方法中,决定于选择的策略。下一节将解释上面的类中使用的注释。

     

  3. 注释

    @Entity 注释

    • EJB 3 标准的注释包含在 javax.persistence 包,所以我们第一步需要导入这个包。第二步我们对 Employee 类使用 @Entity 注释,标志着这个类为一个实体 bean,所以它必须含有一个没有参数的构造函数并且在可保护范围是可见的。

    @Table 注释

    • @table 注释允许您明确表的详细信息保证实体在数据库中持续存在。

    • @table 注释提供了四个属性,允许您覆盖的表的名称,目录及其模式,在表中可以对列制定独特的约束。现在我们使用的是表名为 EMPLOYEE。

    @Id 和 @GeneratedValue 注释

    • 每一个实体 bean 都有一个主键,你在类中可以用 @Id 来进行注释。主键可以是一个字段或者是多个字段的组合,这取决于你的表的结构。

    • 默认情况下,@Id 注释将自动确定最合适的主键生成策略,但是你可以通过使用 @GeneratedValue 注释来覆盖掉它。strategygenerator 这两个参数我不打算在这里讨论,所以我们只使用默认键生成策略。让 Hibernate 确定使用哪些生成器类型来使代码移植于不同的数据库之间。

    @Column Annotation

    @Column 注释用于指定某一列与某一个字段或是属性映射的细节信息。您可以使用下列注释的最常用的属性:

    • name 属性允许显式地指定列的名称。

    • length 属性为用于映射一个值,特别为一个字符串值的列的大小。

    • nullable 属性允许当生成模式时,一个列可以被标记为非空。

    • unique 属性允许列中只能含有唯一的内容

       

  4. hibernate.cfg.xml 配置文件

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-configuration SYSTEM
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

    <hibernate-configuration>
      <session-factory>
           <!--四个必填项-->
           <!--配置数据源-->
           <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
           <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatedemo?characterEncoding=utf8</property>
           <property name="hibernate.connection.username">root</property>
           <property name="hibernate.connection.password">123456</property>

           <!--可选项-->
           <!--是否输出hibernate相关信息到控制台-->
           <property name="hibernate.show_sql">true</property>
           <property name="hibernate.format_sql">true</property>

           <!--配置方言-->
           <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
           
           <!--配置建表策略-->
           <property name="hibernate.hbm2ddl.auto">update</property>

           <!--关联一下 ORM 文件-->
           <mapping resource="cn/edu/dgut/bean/User.hbm.xml"></mapping>
       </session-factory>
    </hibernate-configuration>

     

六、hibernate 主要对象

  1. SessionFactory 对象

  • 配置对象被用于创造一个 SessionFactory 对象,使用提供的配置文件为应用程序依次配置 Hibernate,并允许实例化一个会话对象。SessionFactory 是一个线程安全对象并由应用程序所有的线程所使用。

  • SessionFactory 是一个重量级对象所以通常它都是在应用程序启动时创造然后留存为以后使用。每个数据库需要一个 SessionFactory 对象使用一个单独的配置文件。所以如果你使用多种数据库那么你要创造多种 SessionFactory 对象。

     

  1. Session 对象

  • 一个会话被用于与数据库的物理连接。Session 对象是轻量级的,并被设计为每次实例化都需要与数据库的交互。持久对象通过 Session 对象保存和检索。

  • Session 对象不应该长时间保持开启状态因为它们通常情况下并非线程安全,并且它们应该按照所需创造和销毁。

     

  1. Transaction 对象

  • 一个事务代表了与数据库工作的一个单元并且大部分 RDBMS 支持事务功能。在 Hibernate 中事务由底层事务管理器和事务(来自 JDBC 或者 JTA)处理。

  • 这是一个选择性对象,Hibernate 应用程序可能不选择使用这个接口,而是在自己应用程序代码中管理事务。

     

  1. Query 对象

  • Query 对象使用 SQL 或者 Hibernate 查询语言(HQL)字符串在数据库中来检索数据并创造对象。一个查询的实例被用于连结查询参数,限制由查询返回的结果数量,并最终执行查询。

     

  1. Criteria 对象

  • Criteria 对象被用于创造和执行面向规则查询的对象来检索对象。

     

七、hibernate 基本的增删改查

  1. 创建sql会话对象的过程封装成工具类

    public class HibernateUtil {

      private static SessionFactory sessionFactory = null;
      static {
          // 创建配置对象,读取hibernate.cfg.xml配置文件
          Configuration configuration = new Configuration().configure();
          // 创建一个会话工厂
          sessionFactory = configuration.buildSessionFactory();
      }

      // 返回一个会话对象
      public static Session getSession() {
          // 开启会话,类似于jdbc中的connection
          return sessionFactory.openSession();
      }
    }

     

    1. 基本的增删改查

    public class HbmDemo01 {
       /*// 创建配置对象
       Configuration configuration = new Configuration().configure();
       // 创建一个会话工厂
       SessionFactory sessionFactory = configuration.buildSessionFactory();
       // 开启会话
       Session session = sessionFactory.openSession();*/

       //增
       @Test
       public void save() {
           // 调用工具类,得到一个会话对象
           Session session = HibernateUtil.getSession();
           // 开启事务
           Transaction transaction = session.beginTransaction();

           // 创建一个用户对象,并设置属性初始值
           User user = new User();
           user.setUsername("瑞兹");
           user.setPassword("666666");
           user.setAddress("符文之地");

           // 操作数据库,进行插入数据
           session.save(user);

           // 提交事务
           transaction.commit();
           //transaction.rollback();

      }

       //删
       @Test
       public void delete() {
           Session session = HibernateUtil.getSession();
           // 开启事务
           Transaction transaction = session.beginTransaction();

           // 从数据库查询出对应id数据
           User user = session.get(User.class, 1);

           // 操作数据库,进行删除数据
           session.delete(user);

           // 提交事务
           transaction.commit();
      }

       //改
       @Test
       public void update() {
           Session session = HibernateUtil.getSession();
           // 开启事务
           Transaction transaction = session.beginTransaction();

           // 从数据库查询出对应id数据
           User user = session.get(User.class, 2);
           user.setUsername("亚索");
           user.setAddress("艾欧尼亚");

           // 操作数据库,进行删除数据
           session.update(user);

           // 提交事务
           transaction.commit();
      }

       //查
       @Test
       public void query() {
           Session session = HibernateUtil.getSession();
           // 开启事务
           Transaction transaction = session.beginTransaction();

           // 从数据库查询出对应id数据
           User user = session.get(User.class, 2);

           // 输出查询到的数据
           System.out.println(user);

           

分类:

技术点:

相关文章: