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檔案中:
改為: