21-Java-Hibernate框架(一)

我只是一個碼農發表於2020-04-19

一、Hibernate瞭解

    Hibernate框架是Java持久層的框架,是Gavin King發明的,2001年釋出的,JBoss公司的產品,2003年進入市場。

    Hibernate是基於物件來運算元據庫的,但他最終還是被轉換為SQL去進行操作

    Hibernate對JDBC進行封裝,簡化資料庫訪問操作,採用ORM(Object Relation Mapping,物件關係對映)技術的持久層框架,自動實現表記錄和實體物件之間的對映。

    Hibernate與JDBC的區別:

      Hibernate與JDBC都應用在持久層上,但Hibernate輕量級封裝JDBC

      Hibernate是自動的,不需要手寫SQL語句的,它自動生成SQL語句,是物件導向的;

      Mybatis是半自動的;

      JDBC是手動的(需手寫程式碼與資料庫建立連線,獲取物件,寫SQL語句,執行SQL語句,返回結果,關閉連線),是程式導向的。

      

    Hibernate體系結構:

      1.框架工具包和驅動包

      2.hibernate.cfg.xml

      3.主配置檔案,用於定義資料庫連線引數

      4.實體類(以entity為例)

      5.對映描述檔案entity.hbm.xml(這一步可以用註解代替)

      6.定義類和表對應關係,屬性和欄位對應關係

      

二、Hibernate框架搭建(想要以下內容涉及的資源包的網友評論留言私聊,我百度網盤分享)

    1.載入12個Hibernate包

      dom4j-1.6.jar

      geronimo-jta_1.2_spec-1.0-alpha-1.jar

      hibernate-commons-annotations-4.0.5.Final.jar

      hibernate-core-5.0.11.specid.jar

      hibernate-jpa-2.1-api-1.0.2.Final.jar

      javassist-3.18.0-ga-sources.jar

      jboss-logging-3.3.0.Final.jar

      mysql-connector-java-5.1.46.jar

      slf4j-api-2.0.0-alpha1.jar

      slf4j-jdk14-1.7.7.jar

      slf4j-log4j12-1.7.5.jar

      ant-antlr-1.6.5.jar

      將上述12個工具包放到web專案資料夾下的WebRoot/WEB-INF/lib/下

    2.Hibernate兩個配置檔案(這一步也可以自己建xml檔案配置引數,因為我之前建過,所以直接匯入兩個配置檔案)

      (1)*.hbm.xml         對映檔案    建議放在entity/包下

      (2)hibernate.cfg.xml     主配置檔案   建議放在src/下

      第一步:配置hibernate.cfg.xml檔案(資料庫連線資訊,JDBC驅動,資料庫dialect方言等)

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 5 
 6 <hibernate-configuration>
 7 
 8 <session-factory>
 9     <!--hibernate 方言 區分身份 -->
10     <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
11     <!-- 資料庫連線資訊 -->
12     <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
13     <property name="connection.url">jdbc:mysql://127.0.0.1:3306/hibernatetest</property>
14     <property name="connection.username">root</property>
15     <property name="connection.password">root</property>
16 
17     <!-- hibernate自動生成表 -->
18 
19     <!-- hibernate在控制檯顯示SQL語句 -->
20     <property name="show_sql">true</property>
21     <!-- hibernate格式化SQL,控制檯看起來更整齊 -->
22     <property name="format_sql">true</property>
23     <!-- 設定自動提交 -->
24     <property name="connection.autocommit">true</property>
25 
26     <!-- <property name="connection.characterEncoding">UTF-8</property> -->
27     <!--載入hibernate對映  -->
28     <mapping resource="com/hibernatetest/entity/User.hbm.xml" />
29 
30 </session-factory>
31 
32 
33 
34 </hibernate-configuration>

 

      第二步:配置*hbm.xml檔案

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3                                    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 4 <hibernate-mapping>
 5     <!-- name:對應的實體類的許可權定名稱,table:對應資料庫表名稱 -->
 6  <class name="com.hibernatetest.entity.User" table="hibernateUser">
 7      <!-- id標籤用於配置主鍵屬性
 8              name:對應實體類中屬性名稱
 9              type:可以省略,如果省略預設實體類中屬性的對應型別
10       -->
11   <id name="uid" type="java.lang.Integer">
12           <!-- column用於設定對應資料庫表中欄位名
13               name:資料庫表中的欄位名
14               length:設定欄位長度
15            -->
16           <column name="u_id" length="32"></column>
17           <!-- generator用於設定主鍵生成策略 -->
18           <generator class="native"></generator>
19   </id>
20   
21   <!-- property標籤用於配置其他屬性
22              name:對應實體類中屬性名稱
23              type:可以省略,如果省略預設實體類中屬性的對應型別
24       -->
25   <property name="uname" column="u_name">
26           <!-- column用於設定對應資料庫表中欄位名
27               name:資料庫表中的欄位名
28               length:設定欄位長度
29            -->
30            <column name="u_name" ></column>
31   </property>
32   
33  </class>
34 </hibernate-mapping>

三.使用Hibernate框架運算元據庫(Hibernate有五大核心介面一個核心類)

    Configuration:從hibernate.cfg.xml檔案中載入主配置資訊(資料庫url,使用者名稱,密碼,jdbc驅動,資料庫Dialect方言,資料庫連線池,hibernate對映檔案等)

    SessionFactory:用於建立Session物件工廠,它可通過configuration建立得到,儲存了資料庫的配置資訊和所有的對映關係

    Session:用於執行資料庫增刪改查基本操作

    Query和Criteria介面:用於負責執行各種資料的查詢,它可以使用HQL語言或SQL語句兩種表達方式

    Transaction:用於事務控制(預設事務不自動提交)

    Hibernate框架執行原理:

      1.首先通過configuration去載入hibernate.cfg.xml這個配置檔案

      2.根據配置檔案的資訊去建立SessionFactory,SessionFactory是執行緒安全的,是一個session工廠

      3.用SessionFactory來建立session,session不是執行緒安全的,通過session進行資料庫的各種操作

      4.在進行增刪查改操作的時候通過Session開啟Transaction進行事務的控制

 1 public static void main(String[] args) {
 2         //1.載入主配置檔案
 3         Configuration configuration = new Configuration().configure();//此處讀取預設名稱“hibernate.cfg.xml”,想要讀取指定名稱,需.configure("xxx.xml");
 4         
 5         //2.建造Session工廠
 6         SessionFactory sessionfactory = configuration.buildSessionFactory();
 7         
 8         //3.獲取Session,這個物件中提供了一套增刪改查的方法
 9         Session sess = sessionfactory.openSession();
10         
11         //4.查詢獲取物件
12         User user = sess.get(User.class, 1);//在資料庫資料表中獲取id為1的記錄
13         System.out.println(user);
14         //5.釋放session
15         sess.close();
16     }

四、Session常用介面演示及Hibernate框架使用步驟

    第一步:編寫hibernate工具類

 1 package HibernatenateUtils;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.cfg.Configuration;
 6 
 7 public class hibernateUtils {
 8     public static Session getSession(){
 9         //1.載入主配置檔案
10         Configuration configuration = new Configuration().configure();
11         
12         //2.建造Session工廠
13         SessionFactory    sessfactory = configuration.buildSessionFactory();
14         
15         //3.獲取Session,這個物件中提供了一套增刪改查的方法
16         Session    session = sessfactory.openSession();
17         
18         return session;
19     }
20 }

    第二步:編寫實體類

 1 package com.hibernatetest.entity;
 2 
 3 public class User {
 4     private Integer uid;
 5     private String uname;
 6     public User() {
 7         super();
 8         // TODO Auto-generated constructor stub
 9     }
10     public User(Integer uid, String uname) {
11         super();
12         this.uid = uid;
13         this.uname = uname;
14     }
15     public Integer getUid() {
16         return uid;
17     }
18     public void setUid(Integer uid) {
19         this.uid = uid;
20     }
21     public String getUname() {
22         return uname;
23     }
24     public void setUname(String uname) {
25         this.uname = uname;
26     }
27     @Override
28     public int hashCode() {
29         final int prime = 31;
30         int result = 1;
31         result = prime * result + ((uid == null) ? 0 : uid.hashCode());
32         result = prime * result + ((uname == null) ? 0 : uname.hashCode());
33         return result;
34     }
35     @Override
36     public boolean equals(Object obj) {
37         if (this == obj)
38             return true;
39         if (obj == null)
40             return false;
41         if (getClass() != obj.getClass())
42             return false;
43         User other = (User) obj;
44         if (uid == null) {
45             if (other.uid != null)
46                 return false;
47         } else if (!uid.equals(other.uid))
48             return false;
49         if (uname == null) {
50             if (other.uname != null)
51                 return false;
52         } else if (!uname.equals(other.uname))
53             return false;
54         return true;
55     }
56     @Override
57     public String toString() {
58         return "User [uid=" + uid + ", uname=" + uname + "]";
59     }
60     
61     
62 }

    第三步:進行資料庫操作(此處只對Session相關常用操作進行註釋)

package com.hibernatetest.test;
import java.io.Serializable;
import org.hibernate.Session;
import com.hibernatetest.entity.User;
import HibernatenateUtils.hibernateUtils;

public class SessionTest {
    public static void main(String[] args) {
        Session    session = hibernateUtils.getSession();
        
        //4.資料庫操作
        /*save()            新增
         *Update()            修改
         *saveOrUpdate()    新增或修改
         *createQuery()        建立Query查詢物件
         *delete()            刪除
         *get()                根據id查詢,獲取物件(立即載入,不管有沒有訪問物件,都會生成對應的SQL語句並執行)
         *load()            根據id查詢,獲取物件(延遲載入,只有當訪問物件的時候,才生成對應的SQL語句並執行)
         *flush()            清理session快取,在事務提交和session關閉時都會自動執行flush()
         *beginTransaction()開啟事務
         * */
        //(4 - 1)save新增操作
        User user1 = new User(null,"lisi");
        Serializable save = session.save(user1);//將物件新增到資料庫中作為表的一條記錄,返回的是一個主鍵值
        //注意:此處我hibernate.cfg.xml設定的事務自動提交為true
        //        事務自動提交預設為false,可在hibernate.cfg.xml中修改,
        //                            也可通過session.beginTracsation()開啟事務和session2.getTransaction().commit();//提交事務 
        //        如果事務自動提交為false,此時資料並未同步到資料庫中
        //           如果事務自動提交為true,此時資料便已經同步到資料庫中
        System.out.println(save);
        
        
        //(4 - 2)Update修改操作
        session.beginTransaction();//開啟事務
        User user2 = session.get(User.class, 5);//先從資料庫中取出資料
        user2.setUname("zhangsan");//再修改資料,此處不能修改設定了主鍵自增長的id.
        session.update(user2);//最後再把資料放回去
        session.getTransaction().commit();//提交事務
        
        //(4 - 3)delete刪除操作
        //注意:使用delete操作必須保證刪除物件在資料庫中,如果資料庫中沒有則會報錯:
        //Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1;
        session.beginTransaction();//開啟事務
        User user3 = new User(null,null);
        user3.setUid(21);
        session.delete(user3);
        session.flush();
        session.getTransaction().commit();//提交事務
        
        //(4 - 4)saveOrUpdate刪除操作:如果物件中主鍵不為null(並且這個主鍵的值在資料庫中存在)做修改操作,如果為null做新增操作
        //注意:如果物件中的主鍵在資料庫中不存在,會報錯:
        //Error during managed flush [Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1]
        session.beginTransaction();//開啟事務
        User user4 = new User(17,"zhangsan");
        session.saveOrUpdate(user4);
        User user5 = new User(null,"zhangsan");
        session.saveOrUpdate(user5);
        session.getTransaction().commit();//提交事務
        
        //5.釋放Session
        session.close();//如果事務自動提交為false,此時session快取中的資料會自動同步到資料庫中,之後會自動呼叫flush清空快取。
    }
}

  

相關文章