1、Hibernate瞭解java
Hibernate框架是Java持久層的框架,是Gavin King發明的,2001年發佈的,JBoss公司的產品,2003年進入市場。mysql
Hibernate是基於對象來操做數據庫的,但他最終仍是被轉換爲SQL去進行操做web
Hibernate對JDBC進行封裝,簡化數據庫訪問操做,採用ORM(Object Relation Mapping,對象關係映射)技術的持久層框架,自動實現表記錄和實體對象之間的映射。sql
Hibernate與JDBC的區別:數據庫
Hibernate與JDBC都應用在持久層上,但Hibernate輕量級封裝JDBCapi
Hibernate是自動的,不須要手寫SQL語句的,它自動生成SQL語句,是面向對象的;緩存
Mybatis是半自動的;安全
JDBC是手動的(需手寫代碼與數據庫創建鏈接,獲取對象,寫SQL語句,執行SQL語句,返回結果,關閉鏈接),是面向過程的。session
Hibernate體系結構:app
1.框架工具包和驅動包
2.hibernate.cfg.xml
3.主配置文件,用於定義數據庫鏈接參數
4.實體類(以entity爲例)
5.映射描述文件entity.hbm.xml(這一步能夠用註解代替)
6.定義類和表對應關係,屬性和字段對應關係
2、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 }
4、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清空緩存。 } }