Hibernate經典知識:html
1、Hibernate工做原理及爲何要用?java
1.對JDBC訪問數據庫的代碼作了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。 hibernate的性能很是好,由於它是個輕量級框架。web 1.它支持各類關係數據庫,從一對一到多對多的各類複雜關係。面試
1).讀取並解析配置文件算法
2).讀取並解析映射信息,建立SessionFactory spring
3).打開Sesssion sql
4).建立事務Transation 數據庫
5).持久化操做apache
6).提交事務編程
7).關閉Session
8).關閉SesstionFactory
|
2.什麼是Hibernate延遲加載?
延遲加載機制是爲了不一些無謂的性能開銷而提出來的,所謂延遲加載就是當在真正須要數據的時候,才真正執行數據加載操做。
答:對象關係映射(Object—Relational Mapping,簡稱 ORM)是一種爲了解決 面向對象與面向關係數據庫存在的互不匹配的現象的技術; |
3.數據庫,好比 100 用戶同時來訪,要採起什麼技術解決?
答:可採用鏈接池。 |
4.什麼是 ORM?
答:對象關係映射(Object—Relational Mapping,簡稱 ORM)是一種爲了解決 面向對象與面向關係數據庫存在的互不匹配的現象的技術; |
5.Hibernate 有哪 5 個核心接口?
Configuration 接口:配置 Hibernate,根據其啓動 hibernate,建立SessionFactory 對象 SessionFactory 接口:初始化 Hibernate,充當數據存儲源的代理,建立session 對象sessionFactory 是線程安全的. Session 接口:負責保存、更新、刪除、加載和查詢對象,是線程不安全的,避免多個線程共享同一個 session,是輕量級、一級緩存; Transaction (tr?n'z?k??n) 接口:管理事務; Query 和 Criteria([krai'ti?ri?]) 接口:執行數據庫的查詢。 |
6.關於 hibernate: 【基礎】
1)在 hibernate 中,在配置文件呈標題一對多,多對多的標籤是什麼;
2)Hibernate 的二級緩存是什麼;
Hibernate 是如何處理事務的;
答: 1)一對多的標籤爲<one-to-many> ;多對多的標籤爲<many-to-many>;
2)sessionFactory 的緩存爲 hibernate 的二級緩存;
3)Hibernate 的事務其實是底層的 JDBC Transaction 的封裝或者是 JTA Transaction 的封裝;默認狀況下使用 JDBCTransaction。 |
7.Hibernate 的應用(Hibernate 的結構)?【基礎】
答: //首先得到 SessionFactory 的對象 SessionFactory sessionFactory = new Configuration().configure(). buildSessionFactory();
//而後得到 session 的對象 Session session = sessionFactory.openSession();
//其次得到 Transaction 的對象 Transaction tx = session.beginTransaction();
//執行相關的數據庫操做:增,刪,改,查
session.save(user); //增長, user 是 User 類的對象
session.delete(user); //刪除 session.update(user); //更新
Query query = session.createQuery(「from User」); //查詢 List list = query.list();
//提交事務
tx.commit();
//若是有異常,咱們還要做事務的回滾,恢復到操做以前
tx.rollback();
//最後還要關閉 session,釋放資源
session.close(); |
8.Hibernate的查詢方式
本地SQL查詢、Criteria、Hql |
9.說說在hibernate中使用Integer作映射和使用int作映射之間有什麼差異
Integer?? code和int?? code;的區別:Integer是對象.???? code?? =?? null;?? 對象能夠爲空.? int?? 是普通類型,???? 不可能?? =?? null.????? 根據你的數據庫code是能夠空的,?? 故應該映射成Integer.? |
10.請說出Hibernate中持久化對象的生命週期以及各類狀態直接的區別,並描述相互之間是如何轉換的?
Hibernate中持久化對象的生命週期有臨時態、持久態和遊離態三種。
處於臨時態的對象主鍵值爲空,而且未與session關聯,數據未保存到數據庫中 處於持久態的對象與session關聯起來,持久化後對象中的數據被保存到數據庫中,而且主鍵值按照.hbm.xml文件中配置的生成方式生成相應的值 處於遊離態的對象脫離了session的管理,是持久化後的一種狀態,主鍵值按照.hbm.xml文件中配置的生成方式生成相應的值 當new一個新的對象時,該對象處於臨時態 當該對象被看成session的參數使用的時候,該對象處於持久態 事務提交,session關閉後,該對象處於遊離態 |
11.用Hibernate的session時要注意幾點
1).在更新數據時,要用open()
2).使用完以後,要close(),這樣鏈接池會回收該鏈接。 |
12.Spring和Hibernate的事務管理方式有什麼不一樣?
hibernate的事務管理方式僅僅就是託管給JDBC(若是用JTA那麼就是JTA),而JDBC的一切行爲包括事務是基於一個connection的. spring也是調用hibernate中事務管理的API。hibernate的事務管理,通常是編程性的。 |
13.Hibernate如何獲取指定主鍵id的某對象,請舉例,並進行可能的優劣
比較 三種方式:get(),load()和find() Get()和load()是先在緩存中查找對象,若是找不到再去數據庫中查詢; Find()是不管什麼時候都在數據庫中查詢對象。 |
14.請描述Hibernate中的緩存機制
第一級是Session的緩存。因爲Session對象的生命週期一般對應一個數據庫事務或者一個應用事務,所以它的緩存是事務範圍的緩存。
第二級緩存是一個可插拔的的緩存插件,它是由SessionFactory負責管理。因爲SessionFactory對象的生命週期和應用程序的整個過程對應,所以第二級緩存是進程範圍或者集羣範圍的緩存。 |
15.Hibernate的二級緩存策略的通常過程以下:
1) 條件查詢的時候,老是發出一條select * from table_name where …. (選擇全部字段)這樣的SQL語句查詢數據庫,一次得到全部的數據對象。
2) 把得到的全部數據對象根據ID放入到第二級緩存中。
3) 當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,若是配置了二級緩存,那麼從二級緩存中查;查不到,再查詢數據庫,把結果按照ID放入到緩存。 |
16.get與load區別
1:若是數據庫中,沒有userId的對象。若是經過get方法加載,則返回的是一個null;若是經過load加載,則返回一個代理對象,若是後面代碼若是調用user對象的某個屬性(好比user.getPassword())會拋出異常:org.hibernate.ObjectNotFoundException; 區別2:load支持延遲加載,get不支持延遲加載。 |
s1.什麼是重量級?什麼是輕量級?【基礎】
答:輕量級是指它的建立和銷燬不須要消耗太多的資源,意味着能夠在程序中經 常建立和銷燬 session 的對象;重量級意味不能隨意的建立和銷燬它的實例,會 佔用不少的資源. |
s2.事務處理?【基礎】
答:Connection 類中提供了 3 個事務處理方法: setAutoCommit(Boolean autoCommit):設置是否自動提交事務,默認爲自動 提交事務,即爲 true,經過設置 false 禁止自動提交事務; commit():提交事務; rollback():回滾事務。 |
s3.Java 中訪問數據庫的步驟?Statement 和 PreparedStatement 之間的區別?【基礎】
答:Java 中訪問數據庫的步驟以下:
1)註冊驅動;
2)創建鏈接;
3)建立 Statement;
4)執行 sql 語句;
5)處理結果集(若 sql 語句爲查詢語句);
6)關閉鏈接。
PreparedStatement 被建立時即指定了 SQL 語句,一般用於執行屢次結構相 同的 SQL 語句。 |
s4.JDBC,Hibernate 分頁怎樣實現?【中等難度】
答:方法分別爲:
1) Hibernate 的分頁:
Query query = session.createQuery("from Student");
query.setFirstResult(firstResult);
//設置每頁開始的記錄號
query.setMaxResults(resultNumber);
//設置每頁顯示的記錄數
Collection students = query.list(); |
s5.如何優化Hibernate?
1.使用雙向一對多關聯,不使用單向一對多
2.不用一對一,用多對一取代
3.配置對象緩存,不使用集合緩 |
S2SH經典面試題:
Struts2面試題 struts2工做流程
Struts 2框架自己大體能夠分爲3個部分: 核心控制器FilterDispatcher、業務控制器Action和用戶實現的企業業務邏輯組件。 核心控制器FilterDispatcher是Struts 2框架的基礎, 包含了框架內部的控制流程和處理機制。 業務控制器Action和業務邏輯組件是須要用戶來本身實現的。 用戶在開發Action和業務邏輯組件的同時,還須要編寫相關的配置文件, 供核心控制器FilterDispatcher來使用。 Struts 2的工做流程相對於Struts 1要簡單,與WebWork框架基本相同, 因此說Struts 2是WebWork的升級版本。基本簡要流程以下: 1 、客戶端初始化一個指向Servlet容器的請求; 二、 這個請求通過一系列的過濾器(Filter) (這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器, 這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMesh Plugin) 3 、接着FilterDispatcher被調用, FilterDispatcher詢問ActionMapper來決定這個請是否須要調用某個Action 四、若是ActionMapper決定須要調用某個Action, FilterDispatcher把請求的處理交給ActionProxy 五、ActionProxy經過Configuration Manager詢問框架的配置文件, 找到須要調用的Action類 六、ActionProxy建立一個ActionInvocation的實例。 七、ActionInvocation實例使用命名模式來調用, 在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用。 八、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果 。返回結果一般是(但不老是,也可 能是另外的一個Action鏈)一個須要被表示的JSP或者FreeMarker的模版。 在表示的過程當中能夠使用Struts2 框架中繼承的標籤。 在這個過程當中須要涉及到ActionMapper 九、響應的返回是經過咱們在web.xml中配置的過濾器 Struts工做機制? 工做機制: 說下Struts的設計模式 MVC模式: web應用程序啓動時就會加載並初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被建立,並被填入表單相應的數據,ActionServler根據Struts-config.xml文件配置好的設置決定是否須要表單驗證,若是須要就調用ActionForm的Validate()驗證後選擇將請求發送到哪一個Action,若是Action不存在,ActionServlet會先建立這個對象,而後調用Action的execute()方法。Execute()從ActionForm對象中獲取數據,完成業務邏輯,返回一個ActionForward對象,ActionServlet再把客戶請求轉發給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生 成動態的網頁,返回給客戶。 攔截器和過濾器的區別 一、攔截器是基於java反射機制的,而過濾器是基於函數回調的。 struts1於struts2的比較 一、Action 類: 爲何要使用Struts2 Struts2 是一個至關強大的JavaWeb開源框架,是一個基於POJO的Action的MVC Web框架。它基於當年的Webwork和XWork框架,繼承其優勢,同時作了至關的改進。 struts2有哪些優勢? 1)在軟件設計上Struts2的應用能夠不依賴於Servlet API和struts API。 Struts2的這種設計屬於無侵入式設計; 2)攔截器,實現如參數攔截注入等功能; 3)類型轉換器,能夠把特殊的請求參數轉換成須要的類型; 4)多種表現層技術,如:JSP、freeMarker、Velocity等; 5)Struts2的輸入校驗能夠對指定某個方法進行校驗; 6)提供了全局範圍、包範圍和Action範圍的國際化資源文件管理實現 struts2是如何啓動的? struts2框架是經過Filter啓動的,即StrutsPrepareAndExecuteFilter,此過濾器爲struts2的核心過濾器; StrutsPrepareAndExecuteFilter的init()方法中將會讀取類路徑下默認的配置文件struts.xml完成初始化操做。struts2讀取到struts.xml的內容後,是將內容封裝進javabean對象而後存放在內存中,之後用戶的每次請求處理將使用內存中的數據,而不是每次請求都讀取struts.xml文件。 struts2框架的核心控制器是什麼?它有什麼做用? 1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。 2)做用: 負責攔截由<url-pattern>/*</url-pattern>指定的全部用戶請求,當用戶請求到達時,該Filter會過濾用戶的請求。默認狀況下,若是用戶請求的路徑 不帶後綴或者後綴以.action結尾,這時請求將被轉入struts2框架處理,不然struts2框架將略過該請求的處理。 能夠經過常量"struts.action.extension"修改action的後綴,如: <constant name="struts.action.extension" value="do"/> 若是用戶須要指定多個請求後綴,則多個後綴之間以英文逗號(,)隔開。 <constant name="struts.action.extension" value="do,go"/> struts2配置文件的加載順序? struts.xml ——> struts.properties 常量能夠在struts.xml或struts.properties中配置,若是在多個文件中配置了同一個常量,則後一個文件中配置的常量值會覆蓋前面文件中配置的常量值. struts.xml文件的做用:通知Struts2框架加載對應的Action資源 struts2常量的修改方式? 常量能夠在struts.xml或struts.properties中配置,兩種配置方式以下: 1)在struts.xml文件中配置常量 <constant name="struts.action.extension" value="do"/> 2)在struts.properties中配置常量(struts.properties文件放置在src下): struts.action.extension=do struts2如何訪問HttpServletRequest、HttpSession、ServletContext三個域對象? 方案一: HttpServletRequestrequest =ServletActionContext.getRequest(); HttpServletResponse response =ServletActionContext.getResponse(); HttpSession session= request.getSession(); ServletContextservletContext=ServletActionContext.getServletContext(); 方案二: 類 implements ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware 注意:框架自動傳入對應的域對象 struts2是如何管理action的?這種管理方式有什麼好處? struts2框架中使用包來管理Action,包的做用和java中的類包是很是相似的。 主要用於管理一組業務功能相關的action。在實際應用中,咱們應該把一組業務功能相關的Action放在同一個包下。 struts2中的默認包struts-default有什麼做用? 1)struts-default包是由struts內置的,它定義了struts2內部的衆多攔截器和Result類型,而Struts2不少核心的功能都是經過這些內置的攔截器實現,如:從請求中 把請求參數封裝到action、文件上傳和數據驗證等等都是經過攔截器實現的。當包繼承了struts-default包才能使用struts2爲咱們提供的這些功能。 2)struts-default包是在struts-default.xml中定義,struts-default.xml也是Struts2默認配置文件。 Struts2每次都會自動加載 struts-default.xml文件。 3)一般每一個包都應該繼承struts-default包。 struts2如何對指定的方法進行驗證? 1)validate()方法會校驗action中全部與execute方法簽名相同的方法; 2)要校驗指定的方法經過重寫validateXxx()方法實現, validateXxx()只會校驗action中方法名爲Xxx的方法。其中Xxx的第一個字母要大寫; 3)當某個數據校驗失敗時,調用addFieldError()方法往系統的fieldErrors添加校驗失敗信息(爲了使用addFieldError()方法,action能夠繼承ActionSupport), 若是系統 的fieldErrors包含失敗信息,struts2會將請求轉發到名爲input的result; 4)在input視圖中能夠經過<s:fielderror/>顯示失敗信息。 5)先執行validateXxxx()->validate()->若是出錯了,會轉發<result name="input"/>所指定的頁面,若是不出錯,會直接進行Action::execute()方法 struts2默認能解決get和post提交方式的亂碼問題嗎? 不能。struts.i18n.encoding=UTF-8屬性值只能解析POST提交下的亂碼問題。 請你寫出struts2中至少5個的默認攔截器? fileUpload 提供文件上傳功能 i18n 記錄用戶選擇的locale cookies 使用配置的name,value來是指cookies checkbox 添加了checkbox自動處理代碼,將沒有選中的checkbox的內容設定爲false,而html默認狀況下不提交沒有選中的checkbox。 chain 讓前一個Action的屬性能夠被後一個Action訪問,如今和chain類型的result()結合使用。 alias 在不一樣請求之間將請求參數在不一樣名字件轉換,請求內容不變 值棧ValueStack的原理與生命週期? 1)ValueStack貫穿整個 Action 的生命週期,保存在request域中,因此ValueStack和request的生命週期同樣。當Struts2接受一個請求時,會迅速建立ActionContext, ValueStack,action。而後把action存放進ValueStack,因此action的實例變量能夠被OGNL訪問。 請求來的時候,action、ValueStack的生命開始,請求結束,action、 ValueStack的生命結束; 2)action是多例的,和Servlet不同,Servelt是單例的; 3)每一個action的都有一個對應的值棧,值棧存放的數據類型是該action的實例,以及該action中的實例變量,Action對象默認保存在棧頂; 4)ValueStack本質上就是一個ArrayList; 5)關於ContextMap,Struts 會把下面這些映射壓入 ContextMap 中: parameters : 該 Map 中包含當前請求的請求參數 request : 該 Map 中包含當前 request 對象中的全部屬性 session :該 Map 中包含當前 session 對象中的全部屬性 application :該 Map 中包含當前 application 對象中的全部屬性 attr:該 Map 按以下順序來檢索某個屬性: request, session, application 6)使用OGNL訪問值棧的內容時,不須要#號,而訪問request、session、application、attr時,須要加#號; 7)注意: Struts2中,OGNL表達式須要配合Struts標籤才能夠使用。如:<s:property value="name"/> 8)在struts2配置文件中引用ognl表達式 ,引用值棧的值 ,此時使用的"$",而不是#或者%; ActionContext、ServletContext、pageContext的區別? 1)ActionContext是當前的Action的上下文環境,經過ActionContext能夠獲取到request、session、ServletContext等與Action有關的對象的引用; 2)ServletContext是域對象,一個web應用中只有一個ServletContext,生命週期伴隨整個web應用; 3)pageContext是JSP中的最重要的一個內置對象,能夠經過pageContext獲取其餘域對象的應用,同時它是一個域對象,做用範圍只針對當前頁面,當前頁面結束時,pageContext銷燬, 生命週期是JSP四個域對象中最小的。 result的type屬性中有哪幾種結果類型? 一共10種: dispatcher struts默認的結果類型,把控制權轉發給應用程序裏的某個資源不能把控制權轉發給一個外部資源,若須要把控制權重定向到一個外部資源, 應該使用 redirect結果類型 redirect 把響應重定向到另外一個資源(包括一個外部資源) redirectAction 把響應重定向到另外一個 Action freemarker、velocity、chain、httpheader、xslt、plainText、stream 攔截器的生命週期與工做過程? 1)每一個攔截器都是實現了Interceptor接口的 Java 類; 2)init(): 該方法將在攔截器被建立後當即被調用, 它在攔截器的生命週期內只被調用一次. 能夠在該方法中對相關資源進行必要的初始化; 3)intercept(ActionInvocation invocation): 每攔截一個動做請求, 該方法就會被調用一次; 4)destroy: 該方法將在攔截器被銷燬以前被調用, 它在攔截器的生命週期內也只被調用一次; 5)struts2中有內置了18個攔截器。 爲何要用struts2 JSP、Servlet、JavaBean技術的出現給咱們構建強大的企業應用系統提供了可能。但用這些技術構建的系統很是的繁亂,因此在此之上,咱們須要一個規則、一個把這些技術組織起來的規則,這就是框架,Struts便應運而生。 基於Struts開發的應用由3類組件構成:控制器組件、模型組件、視圖組件 struts2的validate框架是如何運做的 在struts配置文件中配置具體的錯誤提示,再在FormBean中的validate()方法具體調用。 說下struts2的設計模式 MVC模式: web應用程序啓動時就會加載並初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被建立,並被填入表單相應的數據,ActionServler根據Struts-config.xml文件配置好的設置決定是否須要表單驗證,若是須要就調用ActionForm的 Validate()驗證後選擇將請求發送到哪一個Action,若是Action不存在,ActionServlet會先建立這個對象,而後調用 Action的execute()方法。Execute()從ActionForm對象中獲取數據,完成業務邏輯,返回一個ActionForward對象,ActionServlet再把客戶請求轉發給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動態的網頁,返回給客戶。 struts2如何完成文件的上傳? 一、JSP頁面: 1)JSP頁面的上傳文件的組件:<s: file name=」upload」 />,若是須要一次上傳多個文件, 就必須使用多個 file 標籤, 但它們的名字必須是相同的,即: name=「xxx」的值必須同樣; 2)必須把表單的enctype屬性設置爲:multipart/form-data; 3)表單的方法必須爲post,由於post提交的數據在消息體中,而無大小限制。 二、對應的action: 1)在 Action 中新添加 3 個和文件上傳相關的屬性; 2)若是是上傳單個文件, uploadImage屬性的類型就是 java.io.File, 它表明被上傳的文件, 第二個和第三個屬性的類型是 String, 它們分別表明上傳文 件的文件名和文件類型,定義方式是分別是: jsp頁面file組件的名稱+ContentType, jsp頁面file組件的名稱+FileName 3)若是上上傳多個文件, 能夠使用數組或 List struts2學習總結 1:在action中定義的變量,在jsp頁面中顯示用:<s:property value="變量名" /> 2:在頁面中實現自動增長的序號用iterator的statuts的index屬性 eg: <s:iterator value="#request.inOutAccountList"id="data" status="listStat"> <s:property value="#listStat.index+1"/> </s:iterator> 3:在action類中取得request和session對象的方法 Map session = ActionContext.getContext().getSession(); 設置它們的值的方法 session.put("operation", "add"); 頁面中取得它們的值: <s:property value="#session.operation"/> 4:頁面中奇偶行樣式不同的控制方法: <tr class="<s:if test='#listStat.odd == true'>tableStyle-tr1</s:if><s:else>tableStyle-tr2</s:else>"> 5:單選框和複選框的使用方法 1):能夠設置默認選中值,注意list的值的設置,經過這種方式使key和value不同,這種方法比較經常使用(checkboxlist or radio) <s:radio name="uncarInsPolicy.policyStateCode" 2):這裏的key和value的值是同樣的(checkboxlist or radio) <s:checkboxlist 6:struts2 中的標籤會生成相似由<tr><td></td></tr>構成的字串(具體什麼標籤生成什麼,能夠查看生成後的頁面的源代碼)若是不限制這些多餘代碼的生成,頁面將變得沒法控制,因此通常咱們是不但願它生成多餘的代碼的,具體的設置方法若是,在struts.xml中統一配置 7:jsp頁面中格式化日期的方法 <s:date name="unCarInsModificationInfo.createTime"format="yyyy-MM-dd" nice="false"/>這樣就能夠將日期格式化爲yyyy-MM-dd的形式 8:默認狀況下,當請求action發生時,Struts運行時(Runtime)根據struts.xml裏的Action映射集(Mapping),實例化action對應的類,並調用其execute方法。固然,咱們能夠經過如下兩種方法改變這種默認調用 1)在classes/sturts.xml中新建Action,並指明其調用的方法 public String aliasAction() { 2)(比較經常使用) 訪問Action時,在Action名後加上「!xxx」(xxx爲方法名)。 9:Struts 2.0有兩個配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。 10:在action類中取得web下某一文件夾物理路徑(絕對路徑)的方法 11:要想返回的頁面不是一個直接JSP頁面而是要先經過返回action中的方法讀取相應的數據再返回到jsp頁面,有兩種方法 1)在struts.xml中這麼設置 <result name="list"type="redirect-action">sysmanage/UserBaseInfoAction!findUserBaseInfo.action</result> 2)在action中返回時直接調用這個方法便可 return findList(); 12:設置checkboxlist中默認值的方法 <s:checkboxlist name="skills1" 13:二級級連下拉框 <s:set name="foobar" 在Struts1.*中,要想訪問request、response以及session等Servlet對象是很方便的,由於它們一直是做爲形參在各個方法之間進行傳遞的,而在Struts2中咱們就很難看到它們的芳蹤了,由於咱們得到表單中的值都是經過預先設置好了的get方法來獲得的,那麼若是有些參數咱們必須經過request.getParametre或者session.getAttribute來獲得,那麼應該怎麼作呢?按照Max的教程上的說法,能夠分爲兩種:IoC方式和非IoC方式,如何理解這兩種方式的區別呢?IoC是Spring裏面的特徵之一,字面意思是反轉控制,說白了就是依賴注入,比方說類A依賴類B,那麼就主動的給A注入一個類B的對象,下面看一下這兩種方法的具體實現。 1.非Ioc方式 這種方式主要是利用了com.opensymphony.xwork2.ActionContext類以及org.apache.struts2.ServletActionContext類,具體的方法以下所示。 得到request對象: A.HttpServletRequest request =ServletActionContext.getRequest (); B.ActionContext ct= ActionContext.getContext() HttpServletRequest request= (HttpServletRequest)ct.get(ServletActionContext.HTTP_REQUEST); 得到session對象: 在Struts2中底層的session都被封裝成了Map類型,咱們稱之爲SessionMap,而日常咱們所說的session則是指HttpSession對象,具體的得到方法以下所示。 A.Mapsession=ActionContext.getSession(); B.Mapsession=(Map)ActionContext.getContext().get(ActionContext.SESSION); 獲得這個SessionMap以後咱們就能夠對session進行讀寫了,若是咱們想獲得原始的HttpSession能夠首先獲得HttpServletRequest對象,而後經過request.getSession()來取得原始的HttpSession對象。通常狀況下SessionMap已經能夠完成全部的工做,咱們沒必要再去碰底層的session了。 2.IoC方式 這種方式相對來講變化就比較少了,具體流程以下所示。 得到request對象: 第一步:讓action實現ServletRequestAware接口 第二步:在action中聲明一個HttpServletRequest類型的實例變量 第三步:在action中實現ServletRequestAware接口的setServletRequest方法,實現方式很簡單,以下所示。 privateHttpServletRequest request; publicvoid setServletRequest(HttpServletRequestrequest) { this.request= request; } 得到Session對象(注意,此時的session是SessionMap類型): 第一步:讓action實現SessionAware接口 第二步:在action中聲明一個HttpServletRequest類型的實例變量 第三步:在action中實現SessionAware接口的setSession方法,實現方式很簡單,以下所示。
Spring 面試題 Spring框架有哪些模塊? Spring框架由七個模塊組成組成,這7個模塊(或組件)都可以單獨存在,也能夠與其它一個或多個模塊聯合使用,以下所示: (1)Spring 核心容器——IoC容器 (2) Spring AOP (3) SpringORM (4) SpringDAO (5) SpringWEB (6) Spring上下文(Context) (7) SpringMVC 爲何要使用Spring框架,它有什麼優勢? (1) 輕量級的框架 (2) 非侵入性的 (3) 能夠整合其它的框架,好比Struts, Hibernate等 (4) 能夠提供事務管理 Spring框架的工做機制是什麼? (1) Spring MVC將全部的請求都提交給DispatcherServlet,它會委託應用系統的其它模塊負責對請求進行真正的處理工做。 (2) DispatcherServlet查詢一個或多個HandlerMapping,找處處理請求的Controller。 (3) DispatcherServlet請請求提交到目標Controller。 (4) Controller進行業務邏輯處理後,會返回一個ModelAndView。 (5) Dispathcher查詢一個或多個ViewResolver(視圖解析器),找到ModelAndView對象指定的視圖對象。 (6) 視圖對象負責將結果返回給客戶端。 怎麼使用Spring配置事務 ? Spring同時支持編程式事務策略和聲明式事務策略,大部分時候都採用聲明式事務策略。 聲明式事務管理的配置方式,一般有如下4種: (1) 使用TransactionProxyFactoryBean爲目標Bean生成事務代理的配置。此方式是最傳統、配置文件最臃腫、最難以閱讀的方式。 (2) 採用Bean繼承的事務代理配置方式,比較簡潔,但依然是增量式配置。 (3) 採用BeanNameAutoProxyCreator,根據Bean Name自動生成事務代理的方式。這是直接利用Spring的AOP框架配置事務代理的方式,須要對Spring的AOP框架有所理解。但這種方式避免了增量式配置,效果很是不錯。 (4) 採用DefaultAdvisorAutoProxyCreator,直接利用Spring的AOP框架配置事務代理的方式,效果很是不錯,只是這種配置方式的可讀性不如第3種方式。 請你談談SSH整合 SSH整合: (1) Struts(表示層)+ Spring(業務層)+ Hibernate(持久層) (2) Struts: Struts是一個表示層框架,主要做用是界面展現、接收請求和分發請求。 在MVC框架中,Struts屬於VC層次,負責界面表現,負責MVC關係的分發。 View:沿用 JSP,HTTP,Form,Tag,Resourse; Controller:ActionServlet,struts-config.xml,Action。 (3) Hibernate: Hibernate是一個持久層框架,它只負責與關係數據庫的操做。 (4) Spring: Spring是一個業務層框架,是一個整合的框架,可以很好地黏合表示層與持久層。 在Spring框架中如何配置數據庫驅動? 使用org.springframework.jdbc.datasource.DriverManagerDataSource數據源來配置數據庫驅動。 示例: 在Spring框架中applicationContext.xml文件能不能改爲其它文件名? ContextLoaderListener是一個ServletContextListener,在啓動Tomcat應用服務器時,它會讀取WEB-INF目錄下的applicationContext.xml文件,初始化Spring配置。 若是你想改變applicationContext.xml文件的名字或改變它的存儲位置,能夠經過在web.xml文件中定義一個<context-param>元素來解決這個問題。 示例: <context-param> </listener-class> 如何在Web應用裏配置Spring? 在/WEB-INF/web.xml文件中,加入以下內容: <servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class><load-on-startup>1</load-on-startup> </servlet> 在啓動Web應用服務器(Tomcat)時,將加載/WEB-INF/applicationContext.xml文件中的內容。 在應用程序中,能夠經過以下方式獲取ApplicationContext實例 WebApplicationContextUtils.getWebApplicationContext Spring裏如何定義Hibernate Mapping? 添加hibernatemapping 文件到WEB-INF目錄下的applicationContext.xml文件中。 示例: 解釋一下Dependency Injection(DI,依賴注入)和IoC(Inversion of Control,控制反轉)? 依賴注入DI是一種設計模式,一般也稱做控制反轉,儘管在技術上來說,依賴注入是一個IoC的特殊實現,依賴注入是指一個對象應用另一個對象來提供一種特殊的能力。例如,把一個數據庫鏈接以參數的形式傳到一個對象的構造函數裏面而不是在那個對象內部自行建立一個鏈接。 控制反轉和依賴注入的基本思想就是把類的依賴從類內部轉化到外部以減小依賴。 應用控制反轉,對象在被建立的時候,由一個調控系統內全部對象的外界實體,將其所依賴的對象的引用,傳遞給它。也能夠說,依賴被注入到對象中。因此,控制反轉是,關於一個對象如何獲取它依賴的對象的引用,這個責任的反轉。 Spring中的BeanFactory與ApplicationContext的做用有哪些? (1) BeanFactory負責讀取Bean配置文檔,管理Bean的加載和實例化,維護Bean之間的依賴關係,負責Bean的生命週期。 (2)ApplicationContext除了提供上述BeanFactory所能提供的功能以外,還提供了更完整的框架功能: a. 國際化支持 b. 資源訪問:Resource rs = ctx. getResource(」classpath:config.properties」); c. 事件傳遞:經過實現ApplicationContextAware接口 (3) 經常使用的獲取ApplicationContext的方法: FileSystemXmlApplicationContext:從文件系統或者URL指定的xml配置文件建立,參數爲配置文件名或文件名數組 ClassPathXmlApplicationContext:從classpath的xml配置文件建立,能夠從jar包中讀取配置文件。 WebApplicationContextUtils:從web應用的根目錄讀取配置文件,須要先在web.xml中配置,能夠配置監聽器或者 servlet來實現 <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/myApplicationContext.xml</param-value> </context-param> 如何在Spring中實現國際化? 在applicationContext.xml文件中配置一個bean: Spring中的核心類有那些,各有什麼做用? BeanFactory:產生一個新的實例,能夠實現單例模式。 BeanWrapper:提供統一的get及set方法。 ApplicationContext:提供Spring框架的實現,包括BeanFactory的全部功能。 什麼是AOP,AOP的做用是什麼? 面向切面編程(AOP)提供另一種角度來思考程序結構,經過這種方式彌補了面向對象編程(OOP)的不足。 除了類(classes)之外,AOP提供了切面。切面對關注點進行模塊化,例如橫切多個類型和對象的事務管理。 Spring的一個關鍵的組件就是AOP框架,能夠自由選擇是否使用AOP,提供聲明式企業服務,特別是爲了替代EJB聲明式服務。最重要的服務是聲明性事務管理,這個服務創建在Spring的抽象事物管理之上。 容許用戶實現自定義切面,用AOP來完善OOP的使用,能夠把Spring AOP看做是對Spring的一種加強。 使用Spring有什麼好處? (1) Spring能有效地組織你的中間層對象,不管你是否選擇使用了EJB。若是你僅僅使用了Struts或其它的包含了J2EE特有APIs的 framework,你會發現Spring關注了遺留問題。 (2) Spring能消除在許多工程上對Singleton的過多使用。 (3) Spring能消除使用各類格式的屬性定製文件的須要,在整個工程中,可經過一種一致的方法來進行配置。曾經感到迷惑,一個特定類要查找迷幻般的屬性關鍵字或系統屬性,爲此不得不讀Javadoc乃至源編碼嗎?有了Spring,你可很簡單地看到類的JavaBean屬性。 (4) Spring能經過接口而不是類促進好的編程習慣,減小編程代價到幾乎爲零。 (5) Spring被設計爲讓使用它建立的應用盡量少的依賴於它的APIs。在Spring應用中的大多數業務對象沒有依賴於Spring。 (6) 使用Spring構建的應用程序易於單元測試。 (7) Spring能使EJB的使用成爲一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOs或local EJBs來實現業務接口,卻不會影響調用代碼。 (8) Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適於許多web應用。例如,Spring能使用AOP提供聲明性事務而不經過使用EJB容器,若是你僅僅須要與單個的數據庫打交道,甚至不須要JTA實現。 (9) Spring爲數據存取提供了一致的框架,不管是使用JDBC或O/Rmapping產品(如Hibernate)。 什麼是Spring,它有什麼特色? Spring是一個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架。 (1) 輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架能夠在一個大小隻有1MB多的JAR文件裏發佈,而且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴於Spring的特定類。 (2) 控制反轉——Spring經過一種稱做控制反轉(IoC)的技術促進了鬆耦合。當應用了IoC,一個對象依賴的其它對象會經過被動的方式傳遞進來,而不是這個對象本身建立或者查找依賴對象。你能夠認爲IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。 (3) 面向切面——Spring提供了面向切面編程的豐富支持,容許經過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務管理)進行內聚性的開發。應用對象只實現它們應該作的——完成業務邏輯——僅此而已。它們並不負責其它的系統級關注點,例如日誌或事務支持。 (4) 容器——Spring包含並管理應用對象的配置和生命週期,在這個意義上它是一種容器,你能夠配置你的每一個bean如何被建立——基於一個可配置原型(prototype),你的bean能夠建立一個單獨的實例或者每次須要時都生成一個新的實例——以及它們是如何相互關聯的。然而,Spring不該該被混同於傳統的重量級的EJB容器,它們常常是龐大與笨重的,難以使用。 (5) 框架——Spring能夠將簡單的組件配置、組合成爲複雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML文件裏。 Spring也提供了不少基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發留給了你。 AOP裏面幾個重要名詞概念的解釋 (1) 切面(Aspect) 一個關注點的模塊化,這個關注點可能會橫切多個對象。事務管理是J2EE應用中一個關於橫切關注點的很好的例子。 在Spring AOP中,切面能夠使用通用類(基於模式的風格)或者在普通類中以 @Aspect 註解來實現。 (2) 鏈接點(Joinpoint) 在程序執行過程當中某個特定的點,好比某方法調用的時候或者處理異常的時候。在Spring AOP中,一個鏈接點老是表明一個方法的執行。 經過聲明一個org.aspectj.lang.JoinPoint類型的參數能夠使通知(Advice)的主體部分得到鏈接點信息。 (3) 通知(Advice) 在切面的某個特定的鏈接點(Joinpoint)上執行的動做。通知有各類類型,其中包括「around」、「before」和「after」等通知。通知的類型將在後面部分進行討論。許多AOP框架,包括Spring,都是以攔截器作通知模型,並維護一個以鏈接點爲中心的攔截器鏈。 (4) 切入點(Pointcut) 匹配鏈接點(Joinpoint)的斷言。通知和一個切入點表達式關聯,並在知足這個切入點的鏈接點上運行(例如,當執行某個特定名稱的方法時)。切入點表達式如何和鏈接點匹配是AOP的核心:Spring缺省使用AspectJ切入點語法。 (5) 引入(Introduction) 也被稱爲內部類型聲明(inter-typedeclaration))。聲明額外的方法或者某個類型的字段。 Spring容許引入新的接口(以及一個對應的實現)到任何被代理的對象。例如,你能夠使用一個引入來使bean實現 IsModified 接口,以便簡化緩存機制。 (6) 目標對象(TargetObject) 被一個或者多個切面(aspect)所通知(advise)的對象。也有人把它叫作被通知(advised) 對象。 既然Spring AOP是經過運行時代理實現的,這個對象永遠是一個被代理(proxied)對象。 (7) AOP代理(AOP Proxy) AOP框架建立的對象,用來實現切面契約(aspect contract)(包括通知方法執行等功能)。 在Spring中,AOP代理能夠是JDK動態代理或者CGLIB代理。 注意:Spring 2.0最新引入的基於模式(schema-based)風格和@AspectJ註解風格的切面聲明,對於使用這些風格的用戶來講,代理的建立是透明的。 (8) 織入(Weaving) 把切面(aspect)鏈接到其它的應用程序類型或者對象上,並建立一個被通知(advised)的對象。 這些能夠在編譯時(例如使用AspectJ編譯器),類加載時和運行時完成。 Spring和其它純Java AOP框架同樣,在運行時完成織入。 spring工做機制及爲何要用? 1.spring mvc請全部的請求都提交給DispatcherServlet,它會委託應用系統的其餘模塊負責負責對請求進行真正的處理工做。 爲何用Spring: {AOP 讓開發人員能夠建立非行爲性的關注點,稱爲橫切關注點,並將它們插入到應用程序代碼中。使用 AOP 後,公共服務 (比 如日誌、持久性、事務等)就能夠分解成方面並應用到域對象上,同時不會增長域對象的對象模型的複雜性。
Hibernate 面試題
比較Hibernate的三種檢索策略優缺點 1當即檢索; 如何在控制檯看到hibernate生成並執行的sql 在定義數據庫和數據庫屬性的文件applicationConfig.xml裏面,把hibernate.show_sql 設置爲true hibernate都支持哪些緩存策略 Read-only: 這種策略適用於那些頻繁讀取卻不會更新的數據,這是目前爲止最簡單和最有效的緩存策略 hibernate裏面的sorted collection 和ordered collection有什麼區別 sorted collection是在內存中經過java比較器進行排序的 Hibernate工做原理及爲何要用? 原理: 爲何要用: 2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工做 3. hibernate使用Java反射機制,而不是字節碼加強程序來實現透明性。 4. hibernate的性能很是好,由於它是個輕量級框架。映射的靈活性很出色。它支持各類關係數據庫,從一對一到多對多的各類複雜關係。 Hibernate是如何延遲加載? 1. Hibernate2延遲加載實現:a)實體對象 b)集合(Collection) 2. Hibernate3 提供了屬性的延遲加載功能 當Hibernate在查詢數據的時候,數據並無存在與內存中,當程序真正對數據的操做時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提升了服務器的性能。 Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係) 類與類之間的關係主要體如今表與表之間的關係進行操做,它們都是對對象進行操做,咱們程序中把全部的表與類都映射在一塊兒,它們經過配置文件中的many-to-one、one-to-many、many-to-many、 說下Hibernate的緩存機制 1. 內部緩存存在Hibernate中又叫一級緩存,屬於應用事物級緩存 2. 二級緩存: Hibernate的查詢方式 Sql、Criteria,objectcomposition 如何優化Hibernate? 1.使用雙向一對多關聯,不使用單向一對多 Hibernate有哪幾種查詢數據的方式 3種:hql、條件查詢QBC(QueryBy Criteria)、原生sql (經過createSQLQuery創建) 談談Hibernate中inverse的做用 inverse屬性默認是false,就是說關係的兩端都來維護關係。 說說Hibernate中的update()和saveOrUpdate()的區別,session的load()和get()的區別。 saveOrUpdate()方法能夠實現update()的功能,但會多些步驟,具體以下: hibernate中對象的三種狀態 瞬時態(Transient)、持久態(Persistent)、脫管態(Detached)。處於持久態的對象也稱爲PO(Persistence Object),瞬時對象和脫管對象也稱爲VO(Value Object)。 瞬時態 由new命令開闢內存空間的java對象, eg. Person person =new Person(」amigo」, 「女」); 若是沒有變量對該對象進行引用,它將被java虛擬機回收。 瞬時對象在內存孤立存在,它是攜帶信息的載體,不和數據庫的數據有任何關聯關係,在Hibernate中,可經過session的save()或 saveOrUpdate()方法將瞬時對象與數據庫相關聯,並將數據對應的插入數據庫中,此時該瞬時對象轉變成持久化對象。 持久態 處於該狀態的對象在數據庫中具備對應的記錄,並擁有一個持久化標識。若是是用hibernate的delete()方法,對應的持久對象就變成瞬時對象,因數據庫中的對應數據已被刪除,該對象再也不與數據庫的記錄關聯。 當一個session執行close()或clear()、evict()以後,持久對象變成脫管對象,此時持久對象會變成脫管對象,此時該對象雖然具備數據庫識別值,但它已不在HIbernate持久層的管理之下。 持久對象具備以下特色: 1. 和session實例關聯;n 2. 在數據庫中有與之關聯的記錄。 脫管態 當與某持久對象關聯的session被關閉後,該持久對象轉變爲脫管對象。當脫管對象被從新關聯到session上時,並再次轉變成持久對象。 脫管對象擁有數據庫的識別值,可經過update()、saveOrUpdate()等方法,轉變成持久對象。 脫管對象具備以下特色: 1. 本質上與瞬時對象相同,在沒有任何變量引用它時,JVM會在適當的時候將它回收; 2. 比瞬時對象多了一個數據庫記錄標識值。4RESA3ES B Detached Object(遊離對象)有什麼好處 Detached Object(遊離對象)能夠傳遞到任何層直到表現層而不是用任何DTO(DataTransfer Objects). 而後你還能夠從新把遊離對象賦給另一個Session. JDBC hibernate 和 ibatis 的區別 jdbc:手動 hibernate如何實現數據表映射的繼承關係 一、兩個表,子類重複父類的屬性。 hibernate中Query對象的使用 1 個或多個屬性查詢: hibernate中Criteria和DetachedCriteria的做用是什麼? Criteriac=session.createCriteria(Customer.class); DetachedCriteria產生時不須要session hibernate中數據表映射關係主要有什麼類型? one-to-many hibernate的核心是什麼,他們的相互關係是什麼,重要的方法是什麼 Configuration MyEclipse加入hibernate的全過程是什麼 1.Db-browers加入配置鏈接 面試中常出現的兩個hibernate面試題及答案 1.在數據庫中條件查詢速度很慢的時候,如何優化? 2.在hibernate中進行多表查詢,每一個表中各取幾個字段,也就是說查詢出來的結果集並無一個實體類與之對應,如何解決這個問題? 若是未能發現符合條件的記錄,get方法返回null,而load方法會拋出一個ObjectNotFoundException。 首先,Hibernate中維持了兩級緩存。第一級緩存由Session實例維護,其中保持了Session當前全部關聯實體的數據,也稱爲內部緩存。而第二級緩存則存在於SessionFactory層次,由當前全部由本 SessionFactory構造的Session實例共享。出於性能考慮,避免無謂的數據庫訪問,Session在調用數據庫查詢功能以前,會先在緩存中進行查詢。首先在第一級緩存中,經過實體類型和id進行查找,若是第一級緩存查找命中,且數據狀態合法,則直接返回。 Hibernate的主鍵生成機制 1) assigned hibernate面試題:怎麼獲得一個Collection的大小而不用初始化它 Integer size = (Integer) s.createFilter( collection, "select count(*)" ).uniqueResult(); hibernate面試題:怎麼獲得查詢結果的記錄數而不用返回查詢結果 Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult(); 什麼是SessionFactory,她是線程安全麼? SessionFactory isHibernates concept of a single datastore and is threadsafe so that many threadscan access it concurrently and request for sessions and immutable cache ofcompiled mappings for a single database. A SessionFactory is usually only builtonce at startup. SessionFactory should be wrapped in some kind of singleton sothat it can be easily accessed in an application code. SessionFactorysessionFactory = new Configuration().configure().buildSessionfactory(); SessionFactory 是Hibrenate單例數據存儲和線程安全的,以致於能夠多線程同時訪問。一個SessionFactory 在啓動的時候只能創建一次。SessionFactory應該包裝各類單例以致於它能很簡單的在一個應用代碼中儲存. 如何配置Hibernate? The configurationfiles hibernate.cfg.xml (or hibernate.properties) and mapping files *.hbm.xmlare used by the Configuration class to create (i.e. configure and bootstraphibernate) the SessionFactory, which in turn creates the Session instances.Session instances are the primary interface for the persistence service. 」hibernate.cfg.xml (alternatively can use hibernate.properties): These two filesare used to configure the hibernate sevice (connection driver class, connectionURL, connection username, connection password, dialect etc). If both files arepresent in the classpath then hibernate.cfg.xml file overrides the settingsfound in the hibernate.properties file. 」 Mapping files(*.hbm.xml): These files are used to map persistent objects to a relationaldatabase. It is the best practice to store each object in an individual mappingfile (i.e mapping file per class) because storing large number of persistentclasses into one mapping file can be difficult to manage and maintain. Thenaming convention is to use the same name as the persistent (POJO) class name.For example Account.class will have a mapping file named Account.hbm.xml.Alternatively hibernate annotations can be used as part of your persistentclass code instead of the *.hbm.xml files. 優化hibernate性能的幾點建議 一、針對oracle數據庫而言,Fetch Size 是設定JDBC的Statement讀取數據的時候每次從數據庫中取出的記錄條數,通常設置爲30、50、100。Oracle數據庫的JDBC驅動默認的FetchSize=15,設置Fetch Size設置爲:30、50,性能會有明顯提高,若是繼續增大,超出100,性能提高不明顯,反而會消耗內存。 即在hibernate配製文件中進行配製: 1 <property name=」hibernateProperties」> 三、不要把全部的責任推在hibernate上,對代碼進行重構,減小對數據庫的操做,儘可能避免在數據庫查詢時使用in操做,以及避免遞歸查詢操做,代碼質量、系統設計的合理性決定系統性能的高低。 四、 對大數據量查詢時,慎用list()或者iterator()返回查詢結果, (1). 使用List()返回結果時,Hibernate會全部查詢結果初始化爲持久化對象,結果集較大時,會佔用不少的處理時間。 (2). 而使用iterator()返回結果時,在每次調用iterator.next()返回對象並使用對象時,Hibernate才調用查詢將對應的對象初始化,對於大數據量時,每調用一次查詢都會花費較多的時間。當結果集較大,可是含有較大量相同的數據,或者結果集不是所有都會使用時,使用iterator()纔有優點。 五、在一對多、多對一的關係中,使用延遲加載機制,會使很多的對象在使用時方會初始化,這樣可以使得節省內存空間以及減小數據庫的負荷,並且若PO中的集合沒有被使用時,就可減小互數據庫的交互從而減小處理時間。 六、對含有關聯的PO(持久化對象)時,若default-cascade=」all」或者 「save-update」,新增PO時,請注意對PO中的集合的賦值操做,由於有可能使得多執行一次update操做。 七、 對於大數據量新增、修改、刪除操做或者是對大數據量的查詢,與數據庫的交互次數是決定處理時間的最重要因素,減小交互的次數是提高效率的最好途徑,因此在開發過程當中,請將show_sql設置爲true,深刻了解Hibernate的處理過程,嘗試不一樣的方式,能夠使得效率提高。儘量對每一個頁面的顯示,對數據庫的操做減小到100—-150條之內。越少越好。 如何進行hibernate性能調優 大致上,對於HIBERNATE性能調優的主要考慮點以下: JDBC ,hibernate分頁顯示怎麼實現? 答:方法分別爲: Hibernate的應用(hibernate的結構) 答://首先得到SessionFactory 的對象 關於hibernate的幾個面試題 1)在hibernate 中,在配置文件呈標題一對多,多對多的標籤是什麼; Hibernate的五個核心接口 Configuration 接口:配置Hibernate,根據其啓動hibernate,建立 如何優化hibernate 1. 使用雙向一對多關聯,不使用單向一對多 說下hibernate的緩存機制 1. 內部緩存存在Hibernate中又叫一級緩存,屬於應用事物級緩存 hibernate怎麼實現類之間的關係 類與類之間的關係主要體如今表與表之間的關係進行操做,它們都是對對象進行操做,咱們程序中把全部的表與類都映射在一塊兒,它們經過配置文件中的many-to-one、one-to-many、many-to-many、 hibernate如何實現延遲加載 1. Hibernate2延遲加載實現:a)實體對象 b)集合(Collection) Hibernate數據查詢的幾種方式 1.使用主鍵id加載對象(load(),get()); 2.經過對象導航,好比經過stu.getTeam()獲得team的實例; 3 使用hql; 4使用qbc(query by criteria) 5直接使用sql語句取得記錄集; 通常都使用後面三種方式. 注意.hql是面向對象的查詢.語法和sql是基本同樣的.不區分大小寫的,可是注意的是對與對象.必須遵循對象的大小寫.由於hql是對像查詢..同時咱們必須清楚.hql只能取得對象,而不支持uid(update,insert.delete) Hibernate中:不看數據庫,不看XML文件,不看查詢語句,怎麼能知道表的結構 看錶結構對應的類文件,好比UserInfo表對應的UserInfo.java文件
S2SH部分 請你談談SSH整合 SSH:
綜合面試題 一、 簡述你對IoC(Inversion of Control)的理解,描述一下Spring中實現DI(Dependency Injection)的幾種方式。 spring的IOC有三種注入方式 第一是根據屬性注入 也叫set方法注入;第二種是根據構造方法進行注入;第三種是根據註解進行注入,這種方式我認爲比較好,方便,要是bean多的話,使用前兩種方式會使得配置文件過於臃腫。 二、 Spring的Bean有多種做用域,包括: 三、 簡單描述Spring Framework與Struts的不一樣之處,整合Spring與Struts有哪些方法,哪一種最好,爲何? 答、 Spring是完整的一站式框架,而Struts僅是MVC框架,且着重於MVC中的C。Spring有三種方式整合Struts:使用 Spring 的 ActionSupport 類整合 Struts;使用 Spring 的DelegatingRequestProcessor 覆蓋 Struts 的 RequestProcessor;將 Struts Action 管理委託給 Spring 框架,動做委託最好。(詳見使用Spring 更好地處理Struts 動做) Spring 2.0新增一種方式:AutowiringRequestProcessor。(詳見http://www.javaeye.com/topic/24239) 四、 Hibernate中的update()和saveOrUpdate()的區別 答、saveOrUpdate()方法能夠實現update()的功能,但會多些步驟,具體以下: 若是對象在該session中已經被持久化,不進行操做; 對象的標識符屬性(identifierproperty)在數據庫中不存在或者是個暫時的值,調用save()方法保存它; 若是session中的另外一個對象有相同的標識符拋出一個異常; 以上皆不符合則調用update()更新之。 五、 Spring對多種ORM框架提供了很好的支持,簡單描述在Spring中使用Hibernate的方法,並結合事務管理。 答、 在context中定義DataSource,建立SessionFactoy,設置參數;DAO類繼承HibernateDaoSupport,實現具體接口,從中得到HibernateTemplate進行具體操做。 在使用中若是遇到OpenSessionInView的問題,能夠添加OpenSessionInViewFilter或OpenSessionInViewInterceptor。(詳見Spring framework 2.0 Reference的12.2節Hibernate) 聲明式事務需聲明事務管理器,在context中設置指定屬性,用肯定和。 |