Hibernate工作原理及為什么要用?
原理:
1.通過Configuration().configure();讀取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>讀取并解析映射信息
3.通過config.buildSessionFactory();//創建SessionFactory
4.sessionFactory.openSession();//打開Sesssion
5.session.beginTransaction();//創建事務Transation
6.persistent operate持久化操作
7.session.getTransaction().commit();//提交事務
8.關閉Session
9.關閉SesstionFactory
為什么要用:
1. 對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的反復性代碼。
2. Hibernate是一個基于JDBC的主流持久化框架,是一個優秀的ORM實現。他非常大程度的簡化DAO層的編碼工作
3. hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。
4. hibernate的性能非常好,由于它是個輕量級框架。映射的靈活性非常出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。
?
2. Hibernate是怎樣延遲載入?
1. Hibernate2延遲載入實現:a)實體對象 b)集合(Collection)
2. Hibernate3 提供了屬性的延遲載入功能
當Hibernate在查詢數據的時候,數據并沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲載入,他節省了server的內存開銷,從而提高了server的性能。
3.Hibernate中如何實現類之間的關系?(如:一對多、多對多的關系)
類與類之間的關系主要體如今表與表之間的關系進行操作,它們都市對對象進行操作,我們程序中把全部的表與類都映射在一起,它們通過配置文件里的many-to-one、one-to-many、many-to-many、
4. 說下Hibernate的緩存機制
1. 內部緩存存在Hibernate中又叫一級緩存,屬于應用事物級緩存
2. 二級緩存:
a) 應用及緩存
b) 分布式緩存
條件:數據不會被第三方改動、數據大小在可接受范圍、數據更新頻率低、同一數據被系統頻繁使用、非 重要數據
c) 第三方緩存的實現
一級緩存:session級的緩存也叫事務級的緩存,僅僅緩存實體,生命周期和session一致。不能對其進行管理。
不用顯示的調用。
二級緩存:sessionFactory緩存,也叫進程級的緩存,使用第3方插件實現的,也值緩存實體,生命周期和sessionFactory一致,能夠進行管理。
首先配置第3放插件,我們用的是EHCache,在hibernate.cfg.xml文件里增加
<property name="hibernate.cache.user_second_level_cache">true</property>
在映射中也要顯示的調用,<cache usage="read-only"/>
二級緩存之查詢緩存:對普通屬性進行緩存。假設關聯的表發生了改動,那么查詢緩存的生命周期也結束了。
在程序中必須手動啟用查詢緩存:query.setCacheable(true);/
5. Hibernate的查詢方式
Sql、Criteria,object comptosition
Hql:
1、 屬性查詢
2、 參數查詢、命名參數查詢
3、 關聯查詢
4、 分頁查詢
5、 統計函數
6. 怎樣優化Hibernate?
1.使用雙向一對多關聯,不使用單向一對多
2.靈活使用單向一對多關聯
3.不用一對一,用多對一代替
4.配置對象緩存,不使用集合緩存
5.一對多集合使用Bag,多對多集合使用Set
6. 繼承類使用顯式多態
7. 表字段要少,表關聯不要怕多,有二級緩存撐腰
1.Hibernate有哪幾種查詢數據的方式
???????? (1)導航對象圖查詢
????? (2)OID查詢
????? (3)HQL
????? (4)QBC
????? (5)本地SQL
2.load()和get()的差別
?
load載入方法:
Java代碼
Users user = (Users)session.load(Users.class, userId);????
Users user = (Users)session.load(Users.class, userId);
get載入方法:
Java代碼
Users user = (Users)session.get(Users.class, userId);??
Users user = (Users)session.get(Users.class, userId);
?
兩載入方法差別:
差別1:假設數據庫中,沒有userId的對象。假設通過get方法載入,則返回的是一個null;假設通過load載入,則返回一個代理對象,假設后面代碼假設調用user對象的某個屬性(比方user.getPassword())會拋出異常:org.hibernate.ObjectNotFoundException;
差別2:load支持延遲載入,get不支持延遲載入。
也就是說:
Java代碼
Users user = (Users)session.load(Users.class, userId);??
Users user = (Users)session.load(Users.class, userId);
這句代碼不會去運行數據庫查詢,僅僅實用到user時才會去運行數據庫查詢。
而:
Java代碼
Users user = (Users)session.get(Users.class, userId);??
Users user = (Users)session.get(Users.class, userId);
則馬上去運行數據庫查詢。 所以Users user = (Users)session.load(Users.class, userId);不會運行不論什么sql。
注意:
Java代碼
Users user = (Users)session.load(Users.class, userId);???
System.out.println(user.getId());??
Users user = (Users)session.load(Users.class, userId);
System.out.println(user.getId());
上面這2句代碼,不會去運行數據庫操作。由于load后會在hibernate的一級緩存里存放一個map對象,該map的key就是userId的值,可是當你getId()時,它會去一級緩存里拿map的key值,而不去運行數據庫查詢。所以不會報不論什么錯。不會運行不論什么數據庫操作。
?
闡述struts2的運行流程。Struts 2框架本身大致能夠分為3個部分:核心控制器FilterDispatcher、業務控制器Action和用戶實現的企業業務邏輯組件。核心控制器FilterDispatcher是Struts 2框架的基礎,包括了框架內部的控制流程和處理機制。業務控制器Action和業務邏輯組件是須要用戶來自己實現的。用戶在開發Action和業務邏輯組件的同一時候,還須要編寫相關的配置文件,供核心控制器FilterDispatcher來使用。 Struts 2的工作流程相對于Struts 1要簡單,與WebWork框架基本同樣,所以說Struts 2是WebWork的升級版本號。基本簡要流程例如以下:1、client瀏覽器發出HTTP請求。2、依據web.xml配置,該請求被FilterDispatcher接收。3、依據struts.xml配置,找到須要調用的Action類和方法, 并通過IoC方式,將值注入給Aciton。4、Action調用業務邏輯組件處理業務邏輯,這一步包括表單驗證。5、Action運行完成,依據struts.xml中的配置找到相應的返回結果result,并跳轉到相應頁面。6、返回HTTP響應到client瀏覽器。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/alli0968/archive/2009/06/01/4231237.aspx
?
?
. Struts工作機制?為什么要使用Struts?
工作機制:
Struts的工作流程:
在web應用啟動時就會載入初始化ActionServlet,ActionServlet從
struts-config.xml文件里讀取配置信息,把它們存放到各種配置對象
當ActionServlet接收到一個客戶請求時,將運行例如以下流程.
-(1)檢索和用戶請求匹配的ActionMapping實例,假設不存在,就返回請求路徑無效信息;
-(2)假設ActionForm實例不存在,就創建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中;
-(3)依據配置信息決定是否須要表單驗證.假設須要驗證,就調用ActionForm的validate()方法;
-(4)假設ActionForm的validate()方法返回null或返回一個不包括ActionMessage的ActuibErrors對象, 就表示表單驗證成功;
-(5)ActionServlet依據ActionMapping所包括的映射信息決定將請求轉發給哪個Action,假設對應的 Action實例不存在,就先創建這個實例,然后調用Action的execute()方法;
-(6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉發給 ActionForward對象指向的JSP組件;
-(7)ActionForward對象指向JSP組件生成動態網頁,返回給客戶;
為什么要用:
JSP、Servlet、JavaBean技術的出現給我們構建強大的企業應用系統提供了可能。但用這些技術構建的系統很的繁亂,所以在此之上,我們須要一個規則、一個把這些技術組織起來的規則,這就是框架,Struts便應運而生。
基于Struts開發的應用由3類組件構成:控制器組件、模型組件、視圖組件
8. Struts的validate框架是怎樣驗證的?
在struts配置文件里配置詳細的錯誤提示,再在FormBean中的validate()方法詳細調用。
9. 說下Struts的設計模式
MVC模式: web應用程序啟動時就會載入并初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被創建,并被填入表單對應的數據,ActionServler依據Struts-config.xml文件配置好的設置決定是否須要表單驗證,假設須要就調用ActionForm的 Validate()驗證后選擇將請求發送到哪個Action,假設Action不存在,ActionServlet會先創建這個對象,然后調用 Action的execute()方法。Execute()從ActionForm對象中獲取數據,完畢業務邏輯,返回一個ActionForward對象,ActionServlet再把客戶請求轉發給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動態的網頁,返回給客戶。
10. spring工作機制及為什么要用?
1.spring mvc請全部的請求都提交給DispatcherServlet,它會托付應用系統的其它模塊負責負責對請求進行真正的處理工作。
2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.
3.DispatcherServlet請請求提交到目標Controller
4.Controller進行業務邏輯處理后,會返回一個ModelAndView
5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象
6.視圖對象負責渲染返回給client。
為什么用:
{AOP 讓開發者能夠創建非行為性的關注點,稱為橫切關注點,并將它們插入到應用程序代碼中。使用 AOP 后,公共服務 (比方日志、持久性、事務等)就能夠分解成方面并應用到域對象上,同一時候不會添加域對象的對象模型的復雜性。
IOC 同意創建一個能夠構造對象的應用環境,然后向這些對象傳遞它們的協作對象。正如單詞 倒置 所表明的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每個對象都是用其協作對象構造的。因此是由容器管理協作對象(collaborator)。
Spring即使一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替換對象。有了 Spring,僅僅要用 JavaBean 屬性和配置文件增加依賴性(協作對象)。然后能夠非常easy地在須要時替換具有類似接口的協作對象。}
?
Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。Spring 模塊構建在核心容器之上,核心容器定義了創建、配置和管理 bean 的方式,如圖 1 所看到的。
組成 Spring 框架的每一個模塊(或組件)都能夠單獨存在,或者與其它一個或多個模塊聯合實現。每一個模塊的功能例如以下:
☆ 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC)模式將應用程序的配置和依賴性規范與實際的應用程序代碼分開。
☆ Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包含企業服務,比如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。
☆ Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,能夠非常easy地使 Spring 框架管理的不論什么對象支持 AOP。Spring AOP 模塊為基于 Spring 的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就能夠將聲明性事務管理集成到應用程序中。
☆ Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,而且極大地減少了須要編寫的異常代碼數量(比如打開和關閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。
☆ Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關系工具,當中包含 JDO、Hibernate 和 iBatis SQL Map。全部這些都遵從 Spring 的通用事務和 DAO 異常層次結構。
☆ Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,為基于 Web 的應用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。
☆ Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術,當中包含 JSP、Velocity、Tiles、iText 和 POI。
Spring 框架的功能能夠用在不論什么 J2EE server中,大多數功能也適用于不受管理的環境。Spring 的核心要點是:支持不綁定到特定 J2EE 服務的可重用業務和數據訪問對象。毫無疑問,這種對象能夠在不同 J2EE 環境 (Web 或 EJB)、獨立應用程序、測試環境之間重用。
IOC 和 AOP
控制反轉模式(也稱作依賴性介入)的基本概念是:不創建對象,可是描寫敘述創建它們的方式。在代碼中不直接與對象和服務連接,但在配置文件里描寫敘述哪一個組件須要哪一項服務。容器(在 Spring 框架中是 IOC 容器) 負責將這些聯系在一起。
在典型的 IOC 場景中,容器創建了全部對象,并設置必要的屬性將它們連接在一起,決定什么時間調用方法。下表列出了 IOC 的一個實現模式。
?
Spring 框架的 IOC 容器採用類型 2 和類型3 實現。
面向方面的編程
面向方面的編程,即 AOP,是一種編程技術,它同意程序猿對橫切關注點或橫切典型的職責分界線的行為(比如日志和事務管理)進行模塊化。AOP 的核心構造是方面,它將那些影響多個類的行為封裝到可重用的模塊中。
AOP 和 IOC 是補充性的技術,它們都運用模塊化方式解決企業應用程序開發中的復雜問題。在典型的面向對象開發方式中,可能要將日志記錄語句放在全部方法和 Java 類中才干實現日志功能。在 AOP 方式中,能夠反過來將日志服務模塊化,并以聲明的方式將它們應用到須要日志的組件上。當然,優勢就是 Java 類不須要知道日志服務的存在,也不須要考慮相關的代碼。所以,用 Spring AOP 編寫的應用程序代碼是松散耦合的。
AOP 的功能全然集成到了 Spring 事務管理、日志和其它各種特性的上下文中。
IOC 容器
Spring 設計的核心是 org.springframework.beans 包,它的設計目標是與 JavaBean 組件一起使用。這個包通常不是由用戶直接使用,而是由server將其用作其它多數功能的底層中介。下一個最高級抽象是 BeanFactory 接口,它是工廠設計模式的實現,同意通過名稱創建和檢索對象。BeanFactory 也能夠管理對象之間的關系。
BeanFactory 支持兩個對象模型。
□ 單態 模型提供了具有特定名稱的對象的共享實例,能夠在查詢時對其進行檢索。Singleton 是默認的也是最經常使用的對象模型。對于無狀態服務對象非常理想。
□ 原型 模型確保每次檢索都會創建單獨的對象。在每一個用戶都須要自己的對象時,原型模型最適合。
bean 工廠的概念是 Spring 作為 IOC 容器的基礎。IOC 將處理事情的責任從應用程序代碼轉移到框架。正如我將在下一個演示樣例中演示的那樣,Spring 框架使用 JavaBean 屬性和配置數據來指出必須設置的依賴關系。
BeanFactory 接口
由于 org.springframework.beans.factory.BeanFactory 是一個簡單接口,所以能夠針對各種底層存儲方法實現。最經常使用的 BeanFactory 定義是 XmlBeanFactory,它依據 XML 文件里的定義裝入 bean,如清單 1 所看到的。
清單 1. XmlBeanFactory
BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml"));
在 XML 文件里定義的 Bean 是被消極載入的,這意味在須要 bean 之前,bean 本身不會被初始化。要從 BeanFactory 檢索 bean,僅僅需調用 getBean() 方法,傳入將要檢索的 bean 的名稱就可以,如清單 2 所看到的。
清單 2. getBean()
MyBean mybean = (MyBean) factory.getBean("mybean");
每一個 bean 的定義都能夠是 POJO (用類名和 JavaBean 初始化屬性定義) 或 FactoryBean。FactoryBean 接口為使用 Spring 框架構建的應用程序加入了一個間接的級別。
IOC 演示樣例
理解控制反轉最簡單的方式就是看它的實際應用。在對由三部分組成的 Spring 系列 的第 1 部分進行總結時,我使用了一個演示樣例,演示了怎樣通過 Spring IOC 容器注入應用程序的依賴關系(而不是將它們構建進來)。
我用開啟在線信用帳戶的用例作為起點。對于該實現,開啟信用帳戶要求用戶與下面服務進行交互:
☆ 信用級別評定服務,查詢用戶的信用歷史信息。
☆ 遠程信息鏈接服務,插入客戶信息,將客戶信息與信用卡和銀行信息連接起來,以進行自己主動借記(假設須要的話)。
☆ 電子郵件服務,向用戶發送有關信用卡狀態的電子郵件。
三個接口
對于這個演示樣例,我如果服務已經存在,理想的情況是用松散耦合的方式把它們集成在一起。下面清單顯示了三個服務的應用程序接口。
清單 3. CreditRatingInterface
public interface CreditRatingInterface {
public boolean getUserCreditHistoryInformation(ICustomer iCustomer);
}
清單 3 所看到的的信用級別評定接口提供了信用歷史信息。它須要一個包括客戶信息的 Customer 對象。該接口的實現是由 CreditRating 類提供的。
清單 4. CreditLinkingInterface
public interface CreditLinkingInterface {
public String getUrl();
public void setUrl(String url);
public void linkCreditBankAccount() throws Exception ;
}
信用鏈接接口將信用歷史信息與銀行信息(假設須要的話)連接在一起,并插入用戶的信用卡信息。信用鏈接接口是一個遠程服務,它的查詢是通過 getUrl() 方法進行的。URL 由 Spring 框架的 bean 配置機制設置,我稍后會討論它。該接口的實現是由 CreditLinking 類提供的。
清單 5. EmailInterface
public interface EmailInterface {
public void sendEmail(ICustomer iCustomer);
public String getFromEmail();
public void setFromEmail(String fromEmail) ;
public String getPassword();
public void setPassword(String password) ;
public String getSmtpHost() ;
public void setSmtpHost(String smtpHost);
public String getUserId() ;
public void setUserId(String userId);