快速瞭解Hibernate的使用

瞭解hibernate的使用

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

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

               1.原始的jdbc操做,在dao中到操做Connection/Statement/ResultSetsql

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

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

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

瞭解ORM概念

在學習hibernate以前咱們必須瞭解orm概念session

O,  Object  對象mvc

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

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 
這裏的package表示的是映射的實體類所在的包名(有關這裏的文件怎麼寫。後續會作詳細的講解,你們能夠參考咱們下載的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的初識,咱們就講到這裏。這是個人第一篇博客,很高興您能看完,若是其中的點滴語句能給你幾分幫助,這再好不過,也是給我最大的鼓勵--謝謝。

相關文章
相關標籤/搜索