1. 程式人生 > >Hibernate(第一天)

Hibernate(第一天)

對網易雲課堂hibernate課程的文字總結:

一、javaEE的三層結構:

1、web層:檢視層;

                             用到struct2框架

2、service層:業務邏輯層;

                             用到spring框架

3、dao層:持久化層;

                              用到hibernate框架                 

                             用來對資料庫進行增刪改查crud操作;

二、MVC思想:分層

1、m:模型

2、v:檢視

3、c:控制器

三、Hibernate概述:

1、是什麼?

      1.1什麼是框架?

      寫程式,使用框架之後,幫我們實現一部分功能。使用框架好處,少寫一部分程式碼實現功能

      1.2 什麼是hibernate框架(重點記住)?

       hibernate框架應用在javaee三層結構中dao層框架

       在dao層裡面做對資料庫crud操作,使用hibernate實現crud操作,hibernate底層程式碼就是jdbc,hibernate對jdbc進行封裝。使用hibernate好處,不需要寫複雜jdbc程式碼了,不需要寫sql語句實現。

      hibernate開源輕量級的框架:免費,原始碼是開放的,不需要依賴其他東西,就可以直接來使用。

      hibernate版本:hibernate3.x;hibernate4.x:現在不去用,該版本是過度版本;hibernate5.x:現在在用;

                             其中lib:hibernate相關jar包;

      1.3hibernate思想:對db進行crud操作

         即什麼是orm思想 ?

              hibernate使用orm思想對資料庫進行crud操作;

              在web階段學習的javabean,javabean更正確的叫法,叫做實體類。

              orm:用到實體類,O:object ;R:relational;M:mapping;物件關係對映。

              即hibernate用orm物件關係對映思想來對資料庫進行crud操作;

              物件關係對映:

              (1)讓實體類和資料庫表進行一一對應關係;

                        讓實體類首先和資料庫表對應;比如:user類和user表

                        讓實體類屬性和表裡面的欄位對應;

              (2)不需要直接操作資料庫表,而操作表對應的實體類物件即可;

             畫圖說明:

                         在框架階段要用配置檔案完成很多功能;

      知識點:

            jdbc:載入驅動、建立連線,預編譯,執行.......

            javabean可以封裝資料,javabean寫法規範:屬性是私有的,私有屬性有公開的get,set方法;javabean更正確的叫法,叫做實體類。

2、能做什麼

3、怎麼來做;

4、為什麼能做

四、hibernate入門:

1、搭建hibernate環境:

hibernate用到dao層框架,可以單獨使用;所以可以建立java project;也可以建立成web project;

1.1建立java project專案

預期目錄結構:

1.2匯入hibernate的jar包:

            要知道在什麼裡面找到的hibernate的lib的require

            jpa是規範也得匯入;

 匯入其他日誌jar包,因為使用hibernate時候,有日誌資訊輸出,hibernate本身沒有日誌輸出的jar包。

1.3建立實體類,即Javabean

(1)使用hibernate時,不需自己手動建立表,hibernate幫把表建立;即只需建立資料庫即可。

完整的實體類為:

package cn.itcast.entity;

public class User {
	/*hibernate要求實體類有一個屬性唯一的*/
	private int uid;
	private String username;
	private String password;
	private String address;
	public int getUid() {
		return uid;
	}
	public void setUid(int uid) {
		this.uid = uid;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	
}

1.4配置實體類和資料庫表一一對應關係(對映關係)

(1)使用配置檔案實現對映關係

(1.1)建立xml格式的配置檔案

             對映配置檔名稱和位置沒有固定要求

             建議:在實體類所在的包裡建立,實體類名稱.hbm.xml

(2)配置檔案是xml格式,在配置檔案中首先引入xml約束;

             在hibernate裡面引入的約束dtd約束。

在目錄:hibernate-release-5.0.7.Final\hibernate-release-5.0.7.Final\project\hibernate-core\src\main\resources\org\hibernate下

找到約束,貼上到配置檔案中即可。

    (3)配置對映關係(重點

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!-- 1.配置類和表對應 
		class標籤
		name屬性:實體類的全路徑;包名
		table屬性:資料庫表名稱
	-->
	<class name="cn.itcast.entity.User" table="t_user">
		<!-- 2.配置實體類id和表id對應
			hibernate要求實體類有一個屬性唯一值
			hibernate要求表有欄位作為唯一值
		 -->
		 <!-- id標籤
		 		name屬性:實體類裡面id屬性名稱
		 		column屬性:生成的表字段名稱
		 		name和column的值可不一樣
		  -->
		 <id name="uid" column="uid">
		 	<!-- 設定資料庫表id增長策略
		 		native:生成表id值就會是主鍵自動增長
		 	 -->
		 	 <generator class="native"></generator>
		 </id>
			 <!-- 配置其他屬性和表的欄位的對應 
			 	name屬性:實體類屬性名稱
			 	column屬性:生成表字段名稱
			 -->
		 <property name="username" column="username"></property>
		 <property name="password" column="password"></property>
		 <property name="address" column="address"></property>
	</class>
</hibernate-mapping>

1.5建立hibernate的核心配置檔案

資料庫的配置

(1)核心配置檔案的格式xml,核心配置檔名稱和位置固定的

位置:必須在src下

名稱:必須hibernate.cfg.xml

(2)引入dtd約束

(3)核心配置檔案中做些相關配置

hibernate操作過程中,只會載入核心配置檔案,其他配置檔案不會載入;所以要想載入其他配置檔案,只能將其他配置檔案新增到核心配置檔案中。

(3.1)配置資料庫的資訊

properties檔案路徑:hibernate-release-5.0.7.Final\hibernate-release-5.0.7.Final\project\hibernate-spatial\databases\postgis\resources

(3.2)配置hibernate的資訊

(3.3)把對映檔案放到核心配置檔案中

ddl:資料定義語言;建表create,就是資料定義語言;

完整 的配置檔案內容為:

<?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-factory>
	<!-- 第一部分:配置資料庫資訊 必須要有的-->
	<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
	<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
	<property name="hibernate.connection.username">root</property>
	<property name="hibernate.connection.password">root</property>
	
	<!-- 第二部分:配置hibernate的資訊 可選的-->
	<!-- 輸出底層SQL語句 -->
	<property name="hibernate.show_sql">true</property>
	<!-- 輸出底層SQL語句 進行格式化 -->
	<property name="hibernate.format_sql">true</property>
	<!-- hibernate幫 建立表,需要配置之後
			update:如果已經有表,更新,如果沒有,建立表
	-->
	<property name="hibernate.hbm2ddl.auto">update</property>
	<!--配置資料庫方言
			在MySQL中實現分頁,關鍵字limit,只能使用在mysql中
			在oracle資料庫,實現分頁rownum
			讓hibernate框架識別不同資料庫自己特有的關鍵字或者語句
	 -->
	<property name="hibernate。dialect">org.hibernate.dialect.MySQLDialect</property>
	
	<!-- 第三部分:把對映檔案放到核心配置檔案中 必須的-->
	<mapping resource="cn/itcast/entity/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

1.6實現新增操作,測試

(1)載入hibernate核心配置檔案

(2)建立SessionFactory物件

Session的工廠,為了建立Session;

(3)使用SessionFactory來建立Session物件

注意:此時的Session跟http中的Session是沒有任何關係的

(4)開啟事務

建議,手動做事務的操作

(5)寫具體邏輯crud操作

(6)提交事務

(7)關閉資源(有連線)

(1-4是固定的,5是變化的,6-7是固定的)

執行:在單元測試方法名上右擊滑鼠--->Run As---->JUnit Test

觀察:console

package cn.itcast.hibernatetest;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import cn.itcast.entity.User;

public class HibernateDemo {
	@Test
	public void testAdd() {
		/*(1)載入hibernate核心配置檔案
		在hibernate裡面封裝物件
		到src下面找到名稱是hibernate.cfg.xml檔案,
		載入到下面Configuration物件中去。
		*
		*/
		Configuration cfg=new Configuration();
		cfg.configure();
		
    	/*(2)建立SessionFactory物件
    	 * 讀hibernate核心配置檔案內容,建立SessionFactory
    	 * 在過程中,根據對映關係,在配置資料庫裡面把表建立
    	 */
		SessionFactory sessionFactory=cfg.buildSessionFactory();
		
		/*(3)使用SessionFactory來建立Session物件
		 * 類似於jdbc連線
		 */
		Session session=sessionFactory.openSession();
		
		/*(4)開啟事務
		 * 
		 */
		Transaction tx=session.beginTransaction();
		
		/*(5)寫具體邏輯crud操作
		 * 新增功能
		 */
		User user=new User();
		user.setUsername("小王");
		user.setPassword("250");
		user.setAddress("日本");
		//呼叫session物件完成新增
		session.save(user);
		
		/*(6)提交事務
		 * 
		 */
		tx.commit();
		
		/*(7)關閉資源(有連線)
		 * 
		 */
		session.close();
		sessionFactory.close();
	}
}

看到效果:

(1)是否生成表

(2)表裡面是否有記錄

知識點:

xml約束有哪些?有,dtd、schema。在hibernate裡面引入的約束dtd約束。

ctrl+shift+t:搜尋某個類

事務:操作中的基本單元,多個操作要麼都成功,要麼都失敗。

JUnit是java中的單元測試;

五、hibernate配置檔案的詳解:

1、對映配置檔案hibernate.hbm.xml

(1)對映配置檔案和位置沒有固定格式

(2)對映配置檔案中,標籤name屬性值寫實體類相關內容

(2.1)class標籤name屬性值實體類全路徑

(2.2)id標籤和property標籤name屬性值實體類屬性名稱

(3)id標籤和property標籤中,column屬性是可以省略的,其值預設為name屬性值

(4)property標籤type屬性,設定生成表的欄位的型別,hibernate自動生成對應的型別。

2、核心配置檔案hibernate.cfg.xml

(1)配置寫位置要求

(2)配置三部分要求

(2.1)資料庫部分是必須的

(2.2)hibernate部分是可選的

(2.3)對映檔案必須的

(3)核心配置檔名稱和位置固定的

(3.1)位置:src下面

(3.2)名稱:hibernate.cfg.xml

六、hibernate的api

1、Configuration

到src下面找到名稱是hibernate.cfg.xml配置檔案,建立物件,把配置檔案放到物件裡面(載入核心配置檔案)。

2、SessionFactory(重點

(1)使用Configuration物件來建立SessionFactory物件

在建立SessionFactory物件過程中做事情:

      根據核心配置檔案中,有資料庫配置,有對映檔案部分,到資料庫裡面根據對映關係把表建立。

(2)建立SessionFactory過程中,這個過程特別耗資源

(2.1)在hibernate操作中,建議一個專案一般建立一個SessionFactory物件。所有人用的都是統一的這個物件。

(3)具體實現

(3.1)寫工具類,寫靜態程式碼塊實現,(類載入時執行,執行一次)

靜態程式碼塊在類載入時候執行,執行一次

注意:web專案中,不需要關閉session,因為第一次關閉session後,第二次再用就會得不到session。

3、Session(重點)

(1)session類似於jdbc中的connection

(2)呼叫session裡面不同的方法來實現crud操作

(2.1)新增save方法

(2.2)修改update方法

(2.3)刪除delete方法

(2.4)根據id查詢get方法

(3)session物件最大特點:單執行緒物件(該物件只能自己用,別人不能跟我共用)

(3.1)session物件不能共用,只能自己使用。

比如360安全衛士開啟是個程序,其中的電腦清理、優化加速都是每個執行緒,當優化加速在執行時,不能接著再點選優化加速;即單執行緒

4、Transaction

(1)事務物件

(2)事務提交和回滾方法

tx.commit()

tx.rollback();

(3)事務概念

事務特性:原子性,一組操作要麼都成功,有一個失敗,就都失敗;一致性:操作之前之後資料總量沒變化;隔離性:多個事務同時操作同條記錄;他們之間不受影響;永續性,當提交資料庫中是否生效了;

七、實驗過程中出現的錯誤:

Attribute "column" must be declared for element type "properties".

在hibernate.hbm.xml檔案中:

改為: