1. 什麼是ORM
ORM(Object/Relationship Mapping):對象/關係映射
2. 寫SQL語句有什麼不好?
不同的數據庫使用的SQL語法不同。比如:PL/SQL與T/SQL。
同樣的功能在不同的數據庫中有不同的實現方式。比如分頁SQL。
程序過分依賴SQL語句對程序的移植及擴展,維護帶來很大麻煩。
3. 什麼是Hibernate
Hibernate是Java領域的一款開源的ORM框架技術。
Hibernate對JDBC進行了非常輕量級的對象封裝。
4. 編寫Hibernate例子
創建Hibernate的配置文件——hibernate.cfg.xml
創建持久化類
創建對象——關係映射文件
通過Hibernate API編寫訪問數據庫的代碼
導入Hibernate必須的jar包---hibernate-release-4.2.4.Final\lib\required
導入Mysql的jdbc驅動--mysql-connector-java-5.1.7-bin.jar
導入Junit4的jar包--junit-4.10.jar
5. 使用Junit進行測試
@Test:測試方法②
@Before:初始化方法①
@After:釋放資源③
6. hibernate.cfg.xml常用配置
7. Session
session可以理解爲操作數據庫的對象。
session與connection,是多對一關係,每個session都有一個與之對應的
connection,一個connection不同時刻可以供多個session使用。
把對象保存在關係數據庫中需要調用session的各種方法,如:save(),update(),delete(),createQuery()等。
8. Transaction簡介
hibernate對數據庫的操作都是封裝在事務中的,並且默認是非自動提交的方式。所以session保存對象時,如果不開啓事務,並且手工提交事務,對象並不會真正保存在數據庫中。
如果你想讓hibernate像jdbc那樣自動提交事務,必須調用session對象的doWork()方法,獲得jdbc的connection後,設置其爲自動提交事務模式。(注意:不推薦使用)
9. 如何獲取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>。
10. openSession與getCurrentSession的區別
getCurrentSession在事務提交或者回滾之後自動關閉,而openSession需要你手動關閉。如果使用openSession而沒有手動關閉,多次之後導致連接池溢出。
openSession每次創建新的session對象,getCurrentSession使用現有的session對象。
11. Hbm配置文件常用設置
<hibernate-mapping
schema=”schemalName”
catalog=”catalogName”
default-cascade=”cascade_style”//級聯風格
default-access=”field|property|ClassName”//訪問策略
default-lazy=”true|false”//加載策略
package=”package”/>
<class
name=”ClassName”
table=”tableName”//表明
batch-size=”N”//數據條數
where=”condition”//抓取數據條數
entity-name=”EntityName”/>
<id//主鍵
name=”propertyName”//屬性
type=”typename”//數據類型
column=”column_name”//映射的字段的名稱
length=”length”//字段的長度
<generator class=”generatorClass”/>//主鍵生成策略
</id>
12. 單一主鍵
assigned 由java應用程序負責生成(手工賦值)。
native 由底層數據庫自動生成標識符,如果是MySQL就是increment,如果是Oracle就是sequence,等等。
13. 基本類型
14. 對象類型
MySql不支持標準SQL的CLOB類型,在Mysql中,用TEXT,MEDIUMTEXT及LONGTEXT類型來表示長度超過255的長文本數據。
15. 組建屬性
實體類中的某個屬性屬於用戶自定義的類的對象
<component name=”address” class=”Address”>
<property name=”postcode” column=”POSTCODE”></property>
<property name=”phone” column=”PHONE”></property>
<property name=”address” column=”ADDRESS”></property>
</component>
16. 單表CRUD操作實例
save
update
delete
get/load(查詢單個記錄)
17. get與load的區別
①. 在不考慮緩存的情況下,get方法會在調用之後立即向數據庫發出sql句,返回持久化對象。
②. load方法會在調用後返回一個代理對象。該代理對象只保存了實體對象的id,直到使用對象的非主鍵屬性時纔會發出sql語句。
③. 查詢數據庫中不存在的數據時,get方法返回null。
④. load方法拋出異常org.hibernate.ObjectNotFoundException
18. Hibernate開發流程