一、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清空快取。 } }