ORM(Object Relationship Mapping 對象關係映射)
寫SQL的不便之處:
1.不同的數據庫使用的SQL語句不同,如PL/SQL和T/SQL
2.同樣的功能在不同的數據庫中有不同的實現方式,如分頁。
3.程序過分依賴SQL將對程序的移植、拓展和維護帶來極大的不便
Hibernate對JDBC進行了非常輕量化的封裝
在Eclipse上安裝Hibernate Tools插件
使用Hibernate步驟
1.創建Hibernate配置文檔(Hibernate.cfg.xml)
2.創建持久化類
3.創建對象-關係映射文件
4.通過Hibernate API編寫訪問數據庫代碼
(準備工作導入Hibernate相關jar包和mysql的jdbc相關jar包)
Hibernate.cfg.xml常用配置
1.hibernate.show_sql是否把Hibernate運行時的sql語句輸出到控制檯
2.hibernate.format_sql輸出到控制檯的sql是否排版,建議設爲true
3.hbm2ddl.auto可以幫助由java代碼生成數據庫腳本,進而生成具體的表結構。create | update | create-drop | validate
//謹慎使用create,因爲會刪除原有表
4.hibernate.default_scheme默認的數據庫
5.hibernate.dialect方言
Session簡介
因爲Hibernate不建議直接使用jdbc的connection操作數據庫,而是通過使用session來操作數據庫
session可以理解爲操作數據庫的對象
session與connection是多對一的關係,每個session都有一個與之對應的connection對象,一個connection不同時刻可以供多個session使用
操作數據庫就需要調用session的各種方法,如save() update() delete() createQuery()等
Transaction(事務)簡介
hibernate對數據庫的操作都是封裝在事務當中的,並且是默認是非自動提交的方式。所以用Session保存對象時,如果不開啓事務,數據是不會寫到數據庫中的
,所以要執行transaction.commit();
Session詳解
如何獲得Session對象?
1.openSession();
2.getCurrentSession();
如果使用的是getCurrentSession需要在hibernate.cfg.xml文件中進行配置:
如果是本地事務(jdbc事務)
<property name = "hibernate.current_session_context_class">thread</property>
如果是全局事務(jta事務)
<property name = "hibernate.current_session_context_class">jta</property>
openSession()與getCurrentSession()的區別:
1.getCurrentSession()在事務提交或回滾之後會自動關閉,openSession()需要手工關閉,如果不關閉,多次連接之後會導致連接池溢出
2.getCurrentSession()使用現有的session對象(單例模式),而openSession()每次創建新的session
hbm配置文件常用設置
單一主鍵
1.assigned 由java應用程序負責生成,即手工賦值
2.native由底層數據庫自動生成標識符,如果是Mysql就是increment,如果是oracle就是sequence,等等
基本類型
對象類型
組件屬性
單表操作:save delete update get/load
get/load 的區別:
1.在不考慮緩存的情況下,get方法是立即發送sql語句,返回持久化對象;load方法返回的是代理對象,該代理對象只保存了實體對象的id
,在使用對象的非主鍵屬性時纔會發sql語句
2.get方法在查詢到數據庫不存在的對象時,返回的是null;而load返回的是orh.hibernate.ObjectNotFoundException
單向一對多映射:
1.在一方定義一個多方的集合;
2.創建了相應的類之後,還要創建相應的關係映射文件:XXX.hbm.xml
3.在映射文件中配置各個屬性,以及配置一對多關聯關係。例如一個班級對多個學生:
<set name="students" table="student">
<!--指定關聯的外鍵列-->
<key column="gid"></key>
<one-to-many class="XXX.XXX.XXX.Student"></one-to-many>
</set>
4.在hibernate核心配置文件Hibernate.cfg.xml當中指定映射文件的路徑
<mapping resourse="XXX.XXX.XXX.Grade.hbm.xml">
<mapping resourse="XXX.XXX.XXX.Student.hbm.xml">
5.進行一對多操作時,就相當於對集合操作
單向多對一映射
1.在多方定義一個一方引用;
2.在映射文件中配置多對一關聯關係,如多個學生對一個班級:
<many-to-one
name="grade" class="XXX.XXX.XXX.Grade" column="gid"></many-to-one>
3.使用時就在多方中使用一方的引用
雙向多對一映射
1.在一方映射文件中配置一對多關聯關係:
<set name="students" table="student">
<!--指定關聯的外鍵列-->
<key column="gid"></key>
<one-to-many class="XXX.XXX.XXX.Student"></one-to-many>
</set>
與此同時在多方映射文件中配置多對一關聯關係:<many-to-one
name="grade" class="XXX.XXX.XXX.Grade" column="gid"></many-to-one>
2.在代碼中操作時,也要同時一方通過集合設置多方,多方通過引用設置一方
3.爲了性能考慮設置inverse屬性
<set>節點的inverse指定關聯關係的控制方向,默認爲由one方來維護
關聯關係中,inverse = “false”爲主動方,由主動方負責維護關聯關係
在一對多關聯中,只能把one方的inverse設置爲true,則由many方爲主動方
4.如不想在代碼操作時即操作一方又操作多方,則可在<many-to-one> 或 <one-to-many>
設置cascade屬性,此時系統會自動判斷,如:如果給學生關聯班級,沒有該學生,則會自動添加學生
上述學習來自慕課網及網上學習感想。