1. 程式人生 > >Hibernate入門學習筆記

Hibernate入門學習筆記

Hibernate學習筆記

Hibernate的基本概念

Hibernate是什麼?

hibernate是一個是對JDBC進行了輕量級封裝的orm框架(framework),處於專案的持久層。orm(Object relation mapping)物件關係對映框架

ROM是什麼

物件關係對映(ObjectRelation Mapping,簡稱ORM)是一種為了解決面向物件與關係資料庫存在的互不匹配的現象的技術。簡單的說,ORM是通過使用描述物件和資料庫之間對映的元資料,將java程式中的物件自動持久化到關係資料庫中。本質上就是將資料從一種形式轉換到另外一種形式。

結論:使用orm技術(hibernate是其中最為流行的)可以在java程式以類和物件的方式去操控資料庫表和記錄.

Hibernate的優點

  1. 引入hibernate可以使工作人員角色細化,讓程式設計師更關心業務流程。讓資料庫人員關注資料庫相關的各種操作。
  2. 分層更清晰,耦合性更小。
  3. 通用性強:可以更輕鬆的從一個數據庫平臺轉移到別的平臺。
  4. 物件化:把關係資料庫變成了Java的物件,更加方便操作。
  5. 效能保證:hibernate可能按不同的資料庫,處理不同的操作是用
  6. 最優化的SQL語句,不用我們去想,對於分等演算法,在hibernate中會顯得更簡單,可靠。
  7. 增加了程式的魯棒性!

什麼是POJO

在使用hibernate時,要求和資料庫的某張表相互對映的那個java類,是一個POJO類,一般放在com.xxx.domain包下。

POJO類翻譯過來就是:簡單的Java物件(Plain Ordinary Java Objects)實際就是普通JavaBeans,使用POJO名稱是為了避免和EJB混淆起來。一個POJO類應當具有:

  1. 有一個主鍵屬性,用於唯一標識該物件。(這就是為什麼hibernate設計者建議要對映的表需要一個主鍵)
  2. 有其它的屬性
  3. 有對各個屬性操作的get/set方法
  4. 屬性一般是private修飾.
  5. 一定有一個無參的建構函式(用於 hibernate 框架反射用 .)

Hibernate依賴的其他庫介紹

庫檔案 說明
antlr Java開源的語法分析器
Commons Collections Commons的集合類庫
dom4j 進行XML解析的類庫
開源的分析、編譯和建立java位元組碼的類庫
slf4j-api Simple Logging Facade for Java,日誌處理api
slf4j-simple SLF4J API的實現
JTA Java Transaction API,java中額事務處理API

Hibernate入門專案

Hibernate的三種開發方式

  1. 由Domain object -> mapping->db。(官方推薦)
  2. 由DB開始,用工具生成mapping和Domainobject。(使用較多)
  3. 由對映檔案開始。

這裡主要針對第二種開發方式進行例項操作

簡答入門例項

1.建立資料庫(MySQL)

create table employee(
    id  int(4) primary key not null auto_increment,
    name VARCHAR(64) not null,
    email VARCHAR(64) not NULL,
    hiredate TIMESTAMP not null
);

2.建立POJO,Employee類

package com.nick.domain;

import java.util.Date;

//該POJO按照規範應當序列化,目的是可以唯一的標識該物件,同時可以在網路和檔案傳輸
public class Employee implements Serializable {
    private String name;
    private Integer id;
    private String email;
    private Date hiredate;

    public Employee() {
        // TODO Auto-generated constructor stub
    }
  //這裡省略get,set方法,但是在配製時一定要寫出
    public void get(){} 
    public void set(){}
}

3.配置Employee類對應的 Employee.hbm.xml 對映檔案

注意,這裡的 Employee.hbm.xml 放在和 Employee相同路徑中。即在 package com.nick.domain 下建立並配置 Employee.hbm.xml 檔案

<? xml version="1.0" encoding="utf-8" ?>
<!-- 對映檔案需要一個 -->
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- package="com.nick.domain" 配置對映檔案所在的包 -->
<hibernate-mapping package="com.nick.domain">
    <!-- 配置在當前包下,指定類和表進行匹配 -->
    <class name="Employee" table="Employee">
        <!-- id元素用於指定主鍵屬性 -->
        <id name="id" column="id" type="java.lang.Integer">
            <!-- 該元素用於指定主鍵值生成策略 -->
            <generator class="increment" />
        </id>

        <!-- 對其他屬性配置 -->
        <property name="name" type="java.lang.String">
            <column name="name" not-null="false" />
        </property>
        <property name="email" type="java.lang.String">
            <column name="email" not-null="false" />
        </property>
        <property name="hiredate" type="java.util.Date">
            <column name="hiredate" not-null="false" />
        </property>
    </class>
</hibernate-mapping>

4.手動配置 hibernate.cfg.xml 檔案

hibernate.cfg.xml 檔案 ,主要用於配置連線的資料庫型別,資料庫驅動,使用者名稱,密碼,url等等

hibernate的原始碼包中提供了便捷配置,檔案位於 hibernate-release-5.2.10.Final\project\etc 目錄下的 hibernate,properties 檔案,該檔案中給出了各種資料庫的驅動,使用者名稱,密碼,url等,使用時複製貼上即可

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 <!-- 配置domain物件和表的對應關係 -->
<hibernate-configuration>
    <session-factory>
        <!-- 配置MySQL驅動類 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- MySQL連線埠號(3306)與資料庫(myee) -->
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
        <!-- MySQL使用者名稱 -->
        <property name="hibernate.connection.username">root</property>
        <!-- MySQL密碼 -->
        <property name="hibernate.connection.password">123456</property>
        <!-- 配置dialect方言,明確告訴hibernate連線的是哪種資料庫, Hibernate根據你選擇的“方言”,針對每種資料庫,作調整,如生成不同的SQL語句等 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- 為了便於跟蹤,該配置可以顯示出對應執行的sql語句 -->
        <property name="show_sql">true</property>

        <!-- 與實體類連線(包名com/nick/domain/實體類的xml) -->
        <mapping resource="com/nick/domain/Employee.hbm.xml"/>
    </session-factory>

</hibernate-configuration>

5.建立一個測試類,進行資料庫操作。

package com.nick.view;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.nick.domain.Employee;

public class TestMain {
    public static void main(String[] args) {
        // 使用hibernate完成crud操作,(這裡我們只見物件,不見表)
        // 1.建立configuration, 該物件用於讀取 hibernate
        // 的配置檔案,並完成初始化。configure()預設查詢讀取hibernate.cfg.xml.
        Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
        // 2.建立SessionFactory [這是一個會話工廠,是一個重量級物件,通常確保這個物件為單態]
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        // 3.建立Session [類似於 jdbc中的Connection ]
        Session session = sessionFactory.openSession();
        // 4.對hibernate而言,要求對資料庫進行 增、刪、改時使用事務提交,否則操作不成立
        Transaction transaction = session.beginTransaction();

        // 新增一個僱員
        Employee employee = new Employee();
        employee.setName("nick");
        employee.setEmail("[email protected]");
        employee.setHiredate(new Date());

        // 儲存資料
        session.save(employee); // [相當於 insert into ... , 資料庫語句被hibernate封裝]
        transaction.commit();
        session.close();
    }
}

當前例項中控制檯顯示:

Hibernate: select max(id) from Employee
Hibernate: insert into Employee (name, email, hiredate, id) values (?, ?, ?, ?)

6.對SessionFactory 進行單態封裝。

package com.nick.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * 使用hibernate開發專案,專案只是用一個數據庫時,務必保證只有一個SessionFactory
 * 
 * @author shengsheng
 *
 */
final public class MySeesionFactory {

    private static SessionFactory sessionFactory;

    static {
        Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
        sessionFactory = configuration.buildSessionFactory();
    }

    private MySeesionFactory() {
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

7.重新修改測試類

這裡為了方便演示我將增刪改的操作全部寫在了測試類,在實際專案通常會講這些操作進行封裝

package com.nick.view;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.nick.domain.Employee;
import com.nick.util.MySeesionFactory;

public class TestMain {
    public static void main(String[] args) {
         //新增
        addEmployee();
        //更新
         updateEmp();
        //刪除
        deleteEmp();
    }

    private static void deleteEmp() {
        // 刪除
        // 1.先獲取session
        Session session = MySeesionFactory.getSessionFactory().openSession();

        Transaction transaction = session.getTransaction();
        // 1.獲取僱員
        Employee employee = session.load(Employee.class, 5);
        session.delete(employee);

        transaction.commit();
        session.close();
    }

    private static void updateEmp() {
        Session session = MySeesionFactory.getSessionFactory().openSession();

        Transaction transaction = session.beginTransaction();
        // 修改使用者
        // 1.獲取要修改的使用者
        // load是通過主鍵屬性,獲取該物件例項
        Employee employee = session.load(Employee.class, 2);
        // 2.修改
        employee.setName("張老三");
        employee.setEmail("[email protected]");
        transaction.commit();
        session.close();
    }

    /*
     * 這裡給出的是進行hibernate操作的大致流程,往後會對sessionfactory進行單態處理
     */
    private static void addEmployee() {
        // 使用hibernate完成crud操作,(這裡我們只見物件,不見表)
        // 1.建立configuration, 該物件用於讀取 hibernate
        // 的配置檔案,並完成初始化。configure()預設查詢讀取hibernate.cfg.xml.
        Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
        // 2.建立SessionFactory [這是一個會話工廠,是一個重量級物件,通常確保這個物件為單態]
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        // 3.建立Session [類似於 jdbc中的Connection ]
        Session session = sessionFactory.openSession();
        // 4.對hibernate而言,要求對資料庫進行 增、刪、改時使用事務提交,否則操作不成立
        Transaction transaction = session.beginTransaction();

        // 新增一個僱員
        Employee employee = new Employee();
        employee.setName("nick");
        employee.setEmail("[email protected]");
        employee.setHiredate(new Date());

        // 儲存資料
        session.save(employee); // [相當於 insert into ... , 資料庫語句被hibernate封裝]
        transaction.commit();
        session.close();
    }
}