1. 程式人生 > >快速了解Hibernate的使用

快速了解Hibernate的使用

問題 vc開發 所有 不能 但是 大小 tor 類的屬性 prop

了解hibernate的使用

hibernate是作用於傳統的mvc開發dao層的框架

在以往的開發中我們如何的編寫dao的代碼呢

1.原始的jdbc操作,在dao中到操作Connection/Statement/ResultSet

2.自定義一個持久層的框架,對上述的crud進行了封裝。

    3.dbutils組件,是阿帕奇提供的一個輕量級的組件

    4.Hibernate技術,是一個開放源代碼的對象關系映射框架。 【hibernate最終執行的也是jdbc代碼!】

了解ORM概念

在學習hibernate之前我們必須了解orm概念

O, Object 對象

R, Realtion 關系 (關系型數據庫: MySQL, Oracle…) ---------->ORM, 對象關系映射!(說白了是類和表的一種對應關系,目的是將對象保存到表中)

M,Mapping 映射

思考:

ORM, 解決什麽問題?

存儲: 能否把對象的數據直接保存到數據庫?

  獲取: 能否直接從數據庫拿到一個對象?

  想做到上面2點,必須要有映射!

即:我們通過映射關系,將類和表相對應,對象和表中的元組(每一條記錄)相對應,類的屬性和表中的字段(列)相對應,屬性的類型和字段的類型相對應。

技術分享圖片

思考: Hibernate與ORM的關系?

Hibernate是ORM的實現!(也就是說orm是一種思想,hibernate只不過是一種實現而已,其他的實現還有 ibatise等)

第一個hibernate的案例

  首先對於一個組件/框架的學習我們一般通過以下幾個步驟完成。

1.引入相應的jar文件

2.配置

3.api的學習

hibernate的配置相對的比較麻煩,我們在這裏只做簡單的介紹,詳細的配置介紹會在後邊的學習中進行詳細的介紹

  搭建一個Hibernate環境,開發步驟:

    1. 下載源碼

    我用的版本:hibernate-distribution-3.6.0.Final (註意不同的版本你的的配置過程可能稍微有所不同,不過大同小異)

    2. 引入jar文件

  hibernate3.jar核心 + required 必須引入的(6個) + jpa 目錄 + 數據庫驅動包

  3. 寫對象以及對象的映射

  Employee.java 對象(測試對象,員工對象)

   Employee.hbm.xml 對象的映射 (映射文件,註意這是命名規範我們必須這樣寫)

  4. src/hibernate.cfg.xml 主配置文件

  -à 數據庫連接配置

  -à 加載所用的映射(*.hbm.xml)

  5. App.java 測試

首先我們寫對象和對象的映射

employee.java

public class Employee {
    private int empId;
    private String empName;
    private Date empDate;
    public int getEmpId() {
        return empId;
    }
    public void setEmpId(int empId) {
        this.empId = empId;
    }
    public String getEmpName() {
        return empName;
    }
    public void setEmpName(String empName) {
        this.empName = empName;
    }
    public Date getEmpDate() {
        return empDate;
    }
    public void setEmpDate(Date empDate) {
        this.empDate = empDate;
    }
    @Override
    public String toString() {
        return "Employee [empId=" + empId + ", empName=" + empName + ", empDate=" + empDate + "]";
    }

}

映射文件 Employee.hbm.xml
這個映射文件要寫在和employee相同的包下(有關這裏的文件怎麽寫。後續會做詳細的講解,大家可以參考我們下載的src源碼中寫好的. xml文件 直接搜 *.*.xml )

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.best.test">
    <!-- 指明類和表的對應關系 table:表名 name:類名 -->
    <class table="employee" name="Employee">
        <!-- 配置我們的映射關系 -->
        <!-- 主鍵映射關系 -->
        <id name="empId" column="id">
            <generator class="native" />
        </id>
        <!-- 配置非主鍵屬性 -->
        <property name="empName" column="name"></property>
        <property name="empDate" column="date"></property>
    </class>
</hibernate-mapping>

這裏大家會發現,我們並沒有配置屬性和字段類型的對應方式,如果我們不配置的話,默認是按照屬性中的類型進行對應。詳細我們將會後邊進行講解

接下來我麽來寫src中的主配置文件

src/hibernate.cfg.xml 主配置文件(我們可以仿照原碼src下的\project\etc 文件中的該文件來寫)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <!-- session的工廠 創造session,我們與數據庫之間的會話 -->
    <session-factory>
        <!-- 首先我們要對需要連接數據進行配置 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysqL:///hib_demo</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">yujiaming</property>
        <!-- 區別不同的sql語言,要告訴本數據庫的方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="hibernate.show_sql">true</property>

        <!-- 加載映射文件 -->
        <mapping resource="cn/hhua/test/Employee.hbm.xml" />
    </session-factory>

</hibernate-configuration>

接下來我麽拿來做一個測試案例:

 1 @Test
 2     public void test() {
 3         // 創建模擬數據對象
 4         Employee employee = new Employee();
 5         employee.setEmpName("faker");
 6         employee.setEmpDate(new Date());
 7         // 1.首先我們創建加載配置文件管理對象
 8         Configuration configuration = new Configuration();
 9         // 加載配置文件,默認加載src/hibernate.hbm.xml
10         configuration.configure();
11         // 2.創建session工廠對象
12         SessionFactory buildSessionFactory = configuration.buildSessionFactory();
13         // 創建session(代表一個回話,與數據庫連接的會話)
14         Session session = buildSessionFactory.openSession();
15         // 開啟事務
16         Transaction beginTransaction = session.beginTransaction();
17         // 執行crud
18         session.save(employee);
19         // 提交事務
20         beginTransaction.commit();
21         // 關閉session 和工廠
22         session.close();
23         buildSessionFactory.close();
24 
25     }

技術分享圖片 註意 主鍵一定是非空唯一且遞增。

Hibernate Api

|-- Configuration 配置管理類對象

1. config.configure(); 加載主配置文件的方法(hibernate.cfg.xml)

默認加載src/hibernate.cfg.xml

    public Configuration configure() throws HibernateException {
        configure( "/hibernate.cfg.xml" );
        return this;
    }

2.config.configure(“cn/config/hibernate.cfg.xml”); 加載指定路徑下指定名稱的主配置文件

3.config.buildSessionFactory(); 創建session的工廠對象

|-- SessionFactory session的工廠(或者說代表了這個hibernate.cfg.xml配置文件)

1. sf.openSession(); 創建一個sesison對象

2.sf.getCurrentSession(); 創建session或取出session對象(這個相對上邊功能更強大)

3.sf.close();關閉工廠方法

|--Session session對象維護了一個連接(Connection), 代表了與數據庫連接的會話。

是 Hibernate最重要的對象: 只要使用hibernate與數據庫操作,都用到這個對象

1. session.beginTransaction(); 開啟一個事務; hibernate要求所有的與數據庫的操作必須有事務的環境,否則報錯!

2.更新操作:

session.save(Object obj); 保存一個對象

       session.update(Object obj); 更新一個對象、註意必須是有主鍵的對象。

       session.delete(Object obj); 刪除一個對象

        session.saveOrUpdate(emp); 保存或者更新的方法:

  à沒有設置主鍵,執行保存;

                  à有設置主鍵,執行更新操作;

                  à如果設置主鍵不存在報錯!

舉例:

//模擬天更新操作
Employee employee = new Employee(); employee.setEmpId(1); employee.setEmpName("bang"); employee.setEmpDate(new Date()); openSession.update(employee); beginTransaction.commit()

3.查詢操作

主鍵查詢:

      session.get(Employee.class, 1); 主鍵查詢,返回的是一個具體的對象。

         session.load(Employee.class, 1); 主鍵查詢 (支持懶加載)。

//模擬主鍵查詢操作
    Object object = openSession.get(Employee.class, 1);
        System.out.println(object);

      HQL查詢(常用):

       HQL查詢與SQL查詢區別:

    SQL: (結構化查詢語句)查詢的是表以及字段; 不區分大小寫。

HQL: hibernate query language 即hibernate提供的面向對象的查詢語言,查詢的是對象以及對象的屬性, 區分大小寫。

方法:Query createQuery(); .穿件hql查詢語句

query.list(); 返回查詢到的集合

       query.setParameter(int index, Obejct obj); 設置查詢預處理的參數,如果知道具體的參數類型也可以用setString() .等

註意:這裏的index是從0開始的和我們的sql中的不同

//模擬hql查詢
Query createQuery = openSession.createQuery("from Employee where empId =?");
        createQuery.setParameter(0, 1);
        List list = createQuery.list();
        System.out.println(list);
//結果為[Employee [empId=1, empName=bang, empDate=2017-12-17 00:00:00.0]]

sql查詢:

hibernate也為我們提供的sql查詢,復雜的查詢,就要使用原生態的sql查詢,也可以,就是本地sql查詢的支持! (缺點: 不能跨數據庫平臺!)

方法: createSQLQuery(sql語句); 構建sql語句

setParameter(int index,Object object); 設置參數 註意這裏的index是從1開始的

//sql語句查詢
SQLQuery createSQLQuery = openSession.createSQLQuery("select * from employee where id = ?");
        createSQLQuery.setParameter(0, 1);
        List list =  createSQLQuery.list();
        System.out.println(list);
//結果為[[Ljava.lang.Object;@217ed35e]

      查詢結果並沒範返回的也是一個list,但是list中並沒有封裝一個對象,而是將對象的屬性封裝在一個數組中,將數組存到了list集合中

   SQLQuery createSQLQuery = openSession.createSQLQuery("select * from employee where id = ?");
        createSQLQuery.setParameter(0, 1);
        List list = createSQLQuery.list();
        Object[] arr = (Object[]) list.get(0);
        for (Object o : arr) {
            System.out.println(o);
        }
    //查詢結果為:1 bang 2017-12-17                        

    Criteria查詢:

    完全面向對象的查詢。也稱為QBC查詢 。

        //指定查詢的結果集的對象,其實也是在通過映射指明表 
        Criteria criteria = session.createCriteria(Employee.class);
        // 指明條件,註意是對象的屬性,映射表的字段
        criteria.add(Restrictions.eq("empId", 1));
        // 查詢全部
        List<Employee> list = criteria.list();
        System.out.println(list);
//查詢結果為:[Employee [empId=1, empName=bang, empDate=2017-12-17 00:00:00.0]]

|-- Transaction hibernate事務對象。

transaction.commit(); 表示事務的提交。

對於hibernate的初識,我們就講到這裏。這是我的第一篇博客,很高興您能看完,如果其中的點滴語句能給你幾分幫助,這再好不過,也是給我最大的鼓勵--謝謝。

   

        

快速了解Hibernate的使用