hibernate的作用及優缺點
hibernate是一個對象關係映射框架,他是對JDBC進行了輕量級的對象封裝,使得程序員可以使用面相對象的思維來操作數據庫,把以往的操作數據庫記錄換成操作對象,還實現了對象的持久化
優點
hibernate使用反射機制而不是字節碼增強程序來實現透明性
hibernate的性能非常好,因爲他是一個輕量級框架,映射靈活
他支持各種關係的數據庫,從一對一到多對多的各種複雜關係
缺點:
大量的多表,複雜的查詢級聯關係難以駕馭,對於複雜的查詢需要配置的比較多,效率還不高(不過他提供了HQL語句也可)
而且對數據庫的要求高
ORM - Hibernate設計原理
hibernate框架是以款ORM工具,依據ORM設計思想開發出來的
Object--Relation--Mapping 對象是java的entity,關係是關係數據庫,思想就是將程序中的對象和數據庫表實現自動映射,利用ORM工具在查詢的時候返回的就是對象,在更新、插入的時候也會將對象自動寫入到數據庫表,hibernate就是封裝了SQL+JDBC操作細節
類似的框架還有JPA,ibatiS
hibernate 核心API
org.hibernate.cfg.Configuration類
configure():加載hibernate.cfg.xml配置文件並且解析處理【Configuration cfg = new Configuration().configure(); 先調用無參數的構造:
public Configuration() {
this(new SettingsFactory());//創建SessionFactory
}
然後調用:
protected Configuration(SettingsFactory settingsFactory) {
System.out.println("Configuration(SettingsFactory settingsFactory)");
this.settingsFactory = settingsFactory;
reset();//初始化很多變量
}
然後調用configure()
public Configuration configure() throws HibernateException {
configure("/hibernate.cfg.xml");//加載hibernate主配置文件
return this;
}
默認是調用的hibernate.cfg.xml文件,如果想調用自定義的文件可以調用如下方法:
public Configuration configure(String resource) throws HibernateException {
log.debug("configuring from resource: " + resource);
InputStream stream = getConfigurationInputStream(resource);
return doConfigure(stream, resource);
}
根據getConfigurationInputStream(resource)得到文件流,getConfigurationInputStream(resource)調用ConfigHelper.getResourceAsStream(resource)。
public static InputStream getResourceAsStream(String resource) {
String stripped = resource.startsWith("/") ?
resource.substring(1) : resource;
InputStream stream = null;
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if (classLoader!=null) {
stream = classLoader.getResourceAsStream( stripped );
}//加載文件dom4j解析文件
】
buildSessionFactory():創建SessionFactory
setProperty(String key,Object value):通過代碼給hibernate設置屬性
這裏的設置參數和一般的在hibernate配置文件裏配置效果是一樣的Configuration configuration = new Configuration(); configuration.configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); configuration.setProperty("hibernate.connection.url", myConnectionUrl); configuration.setProperty("key", value); sessionFactory = configuration.buildSessionFactory(); Session s = sessionFactory.openSession(); Transaction tx =session.beginTransaction();
org.hibernate.SessionFactory接口
作用:初始化Hibernate,負責創建Session,使用了工廠模式
Configuration config = new Configuration(); config.configure(); SessionFactory sessionFactory = config.builSessionFactory();
SessionFactory是線程安全的,一個數據對應一個Sessionfactory,生命週期長,一般在整個生命週期中有效;
Sessionfactory緩存了生成的SQL和數據庫連接的相關信息(url,user,password)和映射信息,以及hibernate運行時要用到的一些信息
- openSession():創建數據庫連接,並且返回一個Session
- getCurrentSession():獲得當前線程的Session
org.hibernate.Session接口
作用:執行對象持久化對象的CRUD操作
beginTransaction():開始一個事物,並且返回一個事物實例
save(Object):用於保存持對象,並保存數據的方法;執行save方法之後並不會立即操作數據庫來進行保存數據,而是在事物提交的時候纔會保存數據;
persist(Object):
saveOrUpdate(Object):創建或更新一條記
merge(Object):
get(Class,Serializable):根據id(主鍵)查詢某個類型的對象
load(Object,Serializable):根據id查詢,查詢返回的是一個代理對象,不會立刻訪問數據庫,而是延遲加載的,當真的調用到這個對象的屬性或方法的時候纔會查詢數據庫
以上兩者的區別:load()和get()在未找到符合條件的持久化對象的時候,load()會拋出一個異常,而get()方法會返回null;另外兩者對緩存對象的讀取也不同,load()方法會先從hibernate的一級緩存中查找符合條件的對象,找不到的話就去hibernate的二級緩存中去查找對象,仍未找到的話纔會去數據庫中去查找,但是get方法不會去查找hibernate的二級緩存;
delete(Object):刪除記錄
flush():把以及緩存和數據庫同步
clear():清空Sessiono,清除所有保存在當前session緩存中的實體對象,終止所有正在執行的方法(eg:save,updae,delete)
createSQLQuery(“select * from tablename”):執行純sql語句的查詢,Hibernate中不建議使用SQL查詢
getNameQuery(“名字”):命名查詢,查詢語句配置在hbm.xml配置文件中
org.hibernate.Transaction接口
org.hibernate.Query接口
list():返回查詢結果集
uniqueResult():查詢唯一的結果,返回結果是Object
executeUpdate():批量更新
setFirst(int):設置分頁時開始的位置,從0開始
setMaxResult(int):設置一次抓取多少條
org.hibernate.Criteria接口
作用:條件擦汗下,比Query更加面向對象
org.hibernate.criterion.Restrictions類
org.hibernate.StatelessSession接口
hibernate框架的基本特性
hibernate關係映射
hibernate關聯操作
hibernate查詢
hibernate高級特性
主鍵生成策略
作用:配置並啓動Hibernate,讀取配置文件、讀取映射文件,創建單實例的SessionFactory(一個數據庫一個SessionFactory)
Session 也稱爲持久化器,Session是非線程安全的,生命週期短,代表程序和數據庫的一次連接,如果session長時間打開,會長時間佔用內存和數據庫連接;
獲取Session對象後,Hibernate內部並不會獲取操作數據庫的Connection對象,而是等Session對象真正需要對數據庫進行CRUD等操作時,纔會從數據庫連接池中獲取Connection對象;
關閉Session對象時,則是將Connection對象返回到連接池中,而不是關閉Connection對象
每個session對象內部都有一個緩存,他存放當前工作單元中加載的對象,session緩存被稱爲hibernate的一級緩存,sessionFactory緩存被稱爲hibernate的二級緩存,這兩個緩存都位於持久層,他們存放的都是數據庫數據的拷貝,sessionFactory的內置緩存存放元數據和預定義SQL,sessionFactory內置緩存是隻讀緩存
Hibernate緩存的三大優點:
1.減少數據庫的訪問頻率,提高訪問性能
2.保證緩存中的對象與數據庫同步,位於緩存中的對象在事物提交的時候會自動同步到數據庫
3.當持久化對象之間在關聯時Session保證不出現對象圖的死鎖
4.Session如何判斷持久化對象的狀態的改變呢?
Session加載對象後爲對象值類型的屬性複製一份快照,當Session清理緩存時,比較當前對象和他的快照就可以知道哪些屬性發生了變化;
5.session什麼時候清理緩存?
(1)commit()方法被調用時
(2)查詢時會清理緩存,保證查詢結果能反映對象的最新狀態
(3)顯示的調用session的flsh()方法
當對象使用native生成器時會立刻清理緩存想數據庫中插入記錄
作用:負責事物的操作
commit():事物提交
rollback():事物回滾
作用:Query可以使用HQL語言查詢數據庫
無狀態session,不和一級緩存、二級緩存打交道,通過使用該接口會把數據立刻寫到數據庫
StatelessSession s = sessionFactory.openStatelessSession();