1.Hibernate工做原理及爲何要用? 原理: 1.讀取並解析配置文件 2.讀取並解析映射信息,建立SessionFactory3.打開Session 4.建立事務Transation 5.持久化操做 6.提交事務 7.關閉Session 8.關閉SesstionFactory 爲何要用: 1. 對JDBC訪問數據庫的代碼作了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。 2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工做 3. hibernate使用Java反射機制,而不是字節碼加強程序來實現透明性。 4. hibernate的性能很是好,由於它是個輕量級框架。映射的靈活性很出色。它支持各類關係數據庫,從一對一到多對多的各類複雜關係。 2.Hibernate是如何延遲加載? 1. Hibernate2延遲加載實現:a)實體對象 b)集合(Collection) 2. Hibernate3 提供了屬性的延遲加載功能當Hibernate在查詢數據的時候,數據並無存在與內存中,當程序真正對數據的操做時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提升了服務器的性能。 3.Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係) 類與類之間的關係主要體如今表與表之間的關係進行操做,它們都是對對象進行操做,咱們程序中把全部的表與類都映射在一塊兒,它們經過配置文件中的many-to-one、one-to-many、many-to-many 4.Struts1流程: 一、客戶端瀏覽器發出HTTP請求。二、根據web.xml配置,該請求被ActionServlet接收。三、根據struts-config.xml配置, ActionServlet先將請求中的參數填充到ActionForm中,而後ActionServlet再將請求發送到Action 進行處理。四、是否驗證,須要驗證則調用ActionForm的validate方法,驗證失敗則跳轉到input,成功則繼續。五、Action從ActionForm得到數據,調用javabean 中的業務方法處理數據。六、Action返回ActionForward對象,跳轉到相應JSP頁面或Action。7、返回HTTP響應到客戶端瀏覽器。 MVC設計模式:modal:「模型」 也稱業務邏輯,是正真完成任務的代碼,至關與JavaBeanview:視圖,其實就是顯示界面,至關於JSPcontroller:控制器,他控制模型和視圖的交互過程,至關於servletstruts1是基於MVC設計模式hibernate是基於ORM對象關係映射 5.struts是什麼? struts1是基於JSP和servlet的一個開源的Web應用框架,使用的是MVC的設計模式struts2是基於webwork技術的框架,是sun和webwork公司聯手開發的一個功能很是齊全的框架,struts2和struts1沒有任何關係,是一個全新的框架 6.spring是什麼? spring是一個集成了許多第三方框架的大雜燴,其核心技術是IOC(控制反轉,也稱依賴注入)和AOP(面向切面編程) 7.hibernate是什麼? hibernate是基於ORM對象關係映射(完成對象數據到關係數據映射的機制)實現的,作數據持久化的工具 8.JSF是什麼? JavaServer Face是基於組件的web開發框架,跟sturts差很少的框架 9.數據庫裏面的索引和約束是什麼? 索引是爲了提升數據的檢索速度,索引是創建在數據表上,根據一個或多個字段創建的約束是爲了保持數據的完整性,約束有非空約束,主鍵約束,外鍵約束等等。 10.spring是什麼 這個問題,每每能夠經過咱們爲何要使用spring這個問題來切入:AOP 讓開發人員能夠建立非行爲性的關注點,稱爲橫切關注點,並將它們插入到應用程序代碼中。使用 AOP 後,公共服務 (比 如日誌、持久性、事務等)就能夠分解成方面並應用到域對象上,同時不會增長域對象的對象模型的複雜性。 IOC 容許建立一個能夠構造對象的應用環境,而後向這些對象傳遞它們的協做對象。正如單詞 倒置所代表的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每個對象都是用其協做對象構造的。所以是由容器管理協做對象(collaborator)。 Spring即便一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助於您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協做對象)。而後能夠很容易地在須要時替換具備相似接口的協做對象。 11.用本身的話簡要闡述struts2的執行流程。 Struts 2框架自己大體能夠分爲3個部分:核心控制器FilterDispatcher、業務控制器Action和用戶實現的企業業務邏輯組件。核心控制器FilterDispatcher是Struts 2框架的基礎,包含了框架內部的控制流程和處理機制。業務控制器Action和業務邏輯組件是須要用戶來本身實現的。用戶在開發Action和業務邏輯組件的同時,還須要編寫相關的配置文件,供核心控制器FilterDispatcher來使用。 Struts 2的工做流程相對於Struts 1要簡單,與WebWork框架基本相同,因此說Struts 2是WebWork的升級版本。基本簡要流程以下:一、客戶端瀏覽器發出HTTP請求。二、根據web.xml配置,該請求被FilterDispatcher接收。三、根據struts.xml配置,找到須要調用的Action類和方法,並經過IoC方式,將值注入給Aciton。四、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。五、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面。6、返回HTTP響應到客戶端瀏覽器。 1 Action是否是線程安全的?若是不是有什麼方式能夠保證Action的線程安全?若是是,說明緣由 不是 聲明局部變量,或者擴展RequestProcessor,讓每次都建立一個Action,或者在spring中用scope="prototype"來管理 2.MVC,分析一下struts是如何實現MVC的 m:JavaBean 或結合 EJB 組件或者pojo構成 c:Action 來實現 v:一組 JSP 文件及其標籤構成。 3.struts中的幾個關鍵對象的做用(說說幾個關鍵對象的做用) Action:控制器類,ActionForm:表單對象,DynaValidatorForm:動態form,ActonMapping:配置文件中action節點的信息...... 4.說說AOP和IOC的概念以及在spring中是如何應用的 AOP:面向方面編程,ioc:依賴注入;聲明式事務和編程式事務積極一些通用部分 5.Hibernate有哪幾種查詢數據的方式 hql查詢,sql查詢,條件查詢 6.load()和get()的區別 hibernate對於load方法認爲該數據在數據庫中必定存在,能夠放心的使用代理來延遲加載,load默認支持延遲加載,在用到對象中的其餘屬性數 據時才查詢數據庫,可是萬一數據庫中不存在該記錄,只能拋異常ObjectNotFoundEcception;所說的load方法拋異常是指在使用該對 象的數據時,數據庫中不存在該數據時拋異常,而不是在建立這個對象時。因爲session中的緩存對於hibernate來講是個至關廉價的資源,因此在 load時會先查一下session緩存看看該id對應的對象是否存在,不存在則建立代理(load時候之查詢一級緩存,不存在則建立代理)。get() 如今一級緩存找,沒有就去二級緩存找,沒有就去數據庫找,沒有就返回null ;而對於get方法,hibernate必定要獲取到真實的數據,不然返回null。 7.談談hibernate的延遲加載和openSessionInView 延遲加載要在session範圍內,用到的時候再加載;opensessioninview是在web層寫了一個 filter來打開和關閉session,這樣就表示在一次request過程當中session一直開着,保證了延遲 加載在session中的這個前提。 8.spring的事務有幾種方式?談談spring事務的隔離級別和傳播行爲。 聲明事務和編程事務 隔離級別: - DEFAULT使用數據庫默認的隔離級別 - READ_UNCOMMITTED會出現髒讀,不可重複讀和幻影讀問題 - READ_COMMITTED會出現重複讀和幻影讀 - REPEATABLE_READ會出現幻影讀 - SERIALIZABLE最安全,可是代價最大,性能影響極其嚴重 和傳播行: - REQUIRED存在事務就融入該事務,不存在就建立事務 - SUPPORTS存在事務就融入事務,不存在則不建立事務 - MANDATORY存在事務則融入該事務,不存在,拋異常 - REQUIRES_NEW老是建立新事務 - NOT_SUPPORTED存在事務則掛起,一直執行非事務操做 - NEVER老是執行非事務,若是當前存在事務則拋異常 - NESTED嵌入式事務 9.Hibernate中的update()和saveOrUpdate()的區別. 摘自hibernate說明文檔: saveOrUpdate()作下面的事: 若是對象已經在本session中持久化了,不作任何事 若是另外一個與本session關聯的對象擁有相同的持久化標識(identifier),拋出一個異常 若是對象沒有持久化標識(identifier)屬性,對其調用save() 若是對象的持久標識(identifier)代表其是一個新實例化的對象,對其調用save() 若是對象是附帶版本信息的(經過<version>或 <timestamp>)而且版本屬性的值代表其是一個新實例化的對象,save()它。不然update() 這個對象 10.Spring對多種ORM框架提供了很好的支持,簡單描述在Spring中使用Hibernate的方法,並結合事務管理。 getHiberanteTemplate裏面提供了save,update,delete,find等方法。 簡單說一個:若是配置了聲明式事務,當執行getHibernateTemplate的各類方法的時候,事務會 自動被加載 若是沒有配置事務,那麼以上操做不會真正的被同步到數據庫,除非配置了hibernate的 autocommit=true 8.spring的事務有幾種方式?談談spring事務的隔離級別和傳播行爲。 spring事務分兩種形式,聲明式事務和編程式事務,spring提供了一個事務的接口 PaltformTractionManager接口,針對不一樣的事務,spring進行了不一樣的實現,對hibernate事務 的實現HIbernateTractionManager,對JDBC的JdbcTractionManager, DataSourceTractionManager以及JdoTractionManager。接口platformTractionManager提供了三 個方法,獲取事務,提交和回滾的方法。 ****************************************************************************** 分享面試題二】Spring,hibernate,struts的面試筆試題(含答案) (聲明:這裏不是爲其餘商業利益,是爲學習討論使用) 【鄭重聲明】:單純接分將被刪帖,但願你們有本身的感觸 Hibernate工做原理及爲何要用? 原理: 1.讀取並解析配置文件 2.讀取並解析映射信息,建立SessionFactory 3.打開Sesssion 4.建立事務Transation 5.持久化操做 6.提交事務 7.關閉Session 8.關閉SesstionFactory 爲何要用: 1. 對JDBC訪問數據庫的代碼作了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。 2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工做 3. hibernate使用Java反射機制,而不是字節碼加強程序來實現透明性。 4. hibernate的性能很是好,由於它是個輕量級框架。映射的靈活性很出色。它支持各類關係數據庫,從一對一到多對多的各類複雜關係。 2. Hibernate是如何延遲加載? 1. Hibernate2延遲加載實現:a)實體對象 b)集合(Collection) 2. Hibernate3 提供了屬性的延遲加載功能 當Hibernate在查詢數據的時候,數據並無存在與內存中,當程序真正對數據的操做時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提升了服務器的性能。 3.Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係) 類與類之間的關係主要體如今表與表之間的關係進行操做,它們都市對對象進行操做,咱們程序中把全部的表與類都映射在一塊兒,它們經過配置文件中的many-to-one、one-to-many、many-to-many、 4. 說下Hibernate的緩存機制 1. 內部緩存存在Hibernate中又叫一級緩存,屬於應用事物級緩存 2. 二級緩存: a) 應用及緩存 b) 分佈式緩存 條件:數據不會被第三方修改、數據大小在可接受範圍、數據更新頻率低、同一數據被系統頻繁使用、非 關鍵數據 c) 第三方緩存的實現 5. Hibernate的查詢方式 Sql、Criteria,object comptosition Hql: 1、 屬性查詢 2、 參數查詢、命名參數查詢 3、 關聯查詢 4、 分頁查詢 5、 統計函數 6. 如何優化Hibernate? 1.使用雙向一對多關聯,不使用單向一對多 2.靈活使用單向一對多關聯 3.不用一對一,用多對一取代 4.配置對象緩存,不使用集合緩存 5.一對多集合使用Bag,多對多集合使用Set 6. 繼承類使用顯式多態 7. 表字段要少,表關聯不要怕多,有二級緩存撐腰 7. 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.視圖對象負責渲染返回給客戶端。 爲何用: {AOP 讓開發人員能夠建立非行爲性的關注點,稱爲橫切關注點,並將它們插入到應用程序代碼中。使用 AOP 後,公共服務 (比 如日誌、持久性、事務等)就能夠分解成方面並應用到域對象上,同時不會增長域對象的對象模型的複雜性。 IOC 容許建立一個能夠構造對象的應用環境,而後向這些對象傳遞它們的協做對象。正如單詞 倒置所代表的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每個對象都是用其協做對象構造的。所以是由容器管理協做對象(collaborator)。 Spring即便一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助於您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協做對象)。而後能夠很容易地在須要時替換具備相似接口的協做對象。} Struts,Spring,Hibernate優缺點 Struts跟Tomcat、Turbine等諸多Apache項目同樣,是開源軟件,這是它的一大優勢。使開發者能更深刻的瞭解其內部實現機制。 Struts開放源碼框架的建立是爲了使開發者在構建基於Java Servlet和JavaServerPages(JSP)技術的Web應用時更加容易。Struts框架爲開放者提供了一個統一的標準框架,經過使用Struts做爲基礎,開發者可以更專一 於應用程序的商業邏輯。Struts框架自己是使用Java Servlet和JavaServer Pages技術的一種Model-View-Controller(MVC)實現. 具體來說, Struts的優勢有: 1. 實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現. 2. 有豐富的tag能夠用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提升開發效率。另外,就目前國內的JSP開發者而言,除了使用JSP自帶的經常使用標記外,不多開發本身的標記,或許Struts是一個很好的起點。 3. 頁面導航.頁面導航將是從此的一個發展方向,事實上,這樣作,使系統的脈絡更加清晰。經過一個配置文件,便可把握整個系統各部分之間的聯繫,這對於後期的維護有着莫大的好處。尤爲是當另外一批開發者接手這個項目時,這種優點體現得更加明顯。 4. 提供Exception處理機制 . 5. 數據庫連接池管理 6. 支持I18N 缺點: 1、轉到展現層時,須要配置forward,每一次轉到展現層,相信大多數都是直接轉到jsp,而涉及到轉向, 須要配置forward,若是有十個展現層的jsp,須要配置十次struts,並且還不包括有時候目錄、文件變動,須要從新修改forward,注意,每次修改配置以後,要求從新部署整個項目,而tomcate這樣的服務器,還必須從新啓動服務器,若是業務變動複雜頻繁的系統,這樣的操做簡單不可想象。如今就是這樣,幾十上百我的同時在線使用咱們的系統,你們能夠想象一下,個人煩惱有多大。 2、 Struts 的Action必需是thread-safe方式,它僅僅容許一個實例去處理全部的請求。因此action用到的全部的資源都必需統一同步,這個就引發了線程安全的問題。 3、 測試不方便. Struts的每一個Action都同Web層耦合在一塊兒,這樣它的測試依賴於Web容器,單元測試也很難實現。不過有一個Junit的擴展工具Struts TestCase能夠實現它的單元測試。 4、 類型的轉換. Struts的FormBean把全部的數據都做爲String類型,它能夠使用工具Commons-Beanutils進行類型轉化。但它的轉化都是在Class級別,並且轉化的類型是不可配置的。類型轉化時的錯誤信息返回給用戶也是很是困難的。 5、 對Servlet的依賴性過強. Struts處理Action時必須要依賴ServletRequest 和ServletResponse,全部它擺脫不了Servlet容器。 6、前端表達式語言方面.Struts集成了JSTL,因此它主要使用JSTL的表達式語言來獲取數據。但是JSTL的表達式語言在Collection和索引屬性方面處理顯得很弱。 7、 對Action執行的控制困難. Struts建立一個Action,若是想控制它的執行順序將會很是困難。甚至你要從新去寫Servlet來實現你的這個功能需求。 8、 對Action 執行前和後的處理. Struts處理Action的時候是基於class的hierarchies,很難在action處理前和後進行操做。 9、 對事件支持不夠. 在struts中,實際是一個表單Form對應一個Action類(或DispatchAction),換一句話說:在Struts中實際是一個表單只能 對應一個事件,struts這種事件方式稱爲applicationevent,application event和component event相比是一種粗粒度的事件。 Struts重要的表單對象ActionForm是一種對象,它表明了一種應用,這個對象中至少包含幾個字段, 這些字段是Jsp頁面表單中的input字段,由於一個表單對應一個事件,因此,當咱們須要將事件粒度細化到表單中這些字段時,也就是說,一個字段對應一個事件時,單純使用Struts就不太可能,固然經過結合JavaScript也是能夠轉彎實現的。 2.Hibernate Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了很是輕量級的對象封裝,使得Java程序員能夠爲所欲爲的使用對象編程思惟來操縱數據庫。 Hibernate能夠應用在任何使用JDBC的場合,既能夠在Java的客戶端程序實用,也能夠在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate能夠在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。 大多數開發機構常常採起建立各自獨立的數據持久層。一旦底層的數據結構發生改變,那麼修改應用的其他部分使之適應這種改變的代價將是十分巨大的。 Hibernate適時的填補了這一空白,它爲Java應用提供了一個易用的、高效率的對象關係映射框架。hibernate是個輕量級的持久性框架,功 能卻很是豐富。 優勢: a.Hibernate 使用 Java 反射機制而不是字節碼加強程序來實現透明性。 b.Hibernate 的性能很是好,由於它是個輕量級框架。映射的靈活性很出色。 c.它支持各類關係數據庫,從一對一到多對多的各類複雜關係。 缺點: 它限制您所使用的對象模型。(例如,一個持久性類不能映射到多個表)其獨有的界面和可憐的市場份額也讓人不安,儘管如此,Hibernate 仍是以其強大的發展動力減輕了這些風險。其餘的開源持久性框架也有一些,不過都沒有 Hibernate 這樣有市場衝擊力。 上面回貼情緒有點激動,但願諒解,我不是由於有人批評Hibernate而感到不快,而是由於帖子裏面的觀點實在讓我以爲荒謬。無論以爲 Hibernate好也吧,很差也吧,我惟一以爲遺憾的是,在中文論壇裏面找不到一個對Hibernate的真正高水平的評價。在TSS上有一個關於 Hibernate的hot thread,跟了幾百貼,其中包括Hibernate做者Gavin和LiDO JDO的CTO,對於JDO和Hibernate有過一些激烈的爭論,我曾經耐心的看了一遍,仍然沒有發現針對Hibernate真正有力的攻擊,那些所 謂的攻擊無非針對Hibernate沒有一個GUI的配置工具,沒有商業公司支持,沒有標準化等等這些站不住腳的理由。 補充幾點個人意見: 1、Hibernate是JDBC的輕量級的對象封裝,它是一個獨立的對象持久層框架,和App Server,和EJB沒有什麼必然的聯繫。Hibernate能夠用在任何JDBC能夠使用的場合,例如Java應用程序的數據庫訪問代碼,DAO接口的實現類,甚至能夠是BMP裏面的訪問數據庫的代碼。從這個意義上來講,Hibernate和EB不是一個範疇的東西,也不存在非此即彼的關係。 2、Hibernate是一個和JDBC密切關聯的框架,因此Hibernate的兼容性和JDBC驅動,和數據庫都有必定的關係,可是和使用它的Java程序,和App Server沒有任何關係,也不存在兼容性問題。 3、Hibernate不能用來直接和Entity Bean作對比,只有放在整個J2EE項目的框架中才能比較。而且即便是放在軟件總體框架中來看,Hibernate也是作爲JDBC的替代者出現的,而不是Entity Bean的替代者出現的,讓我再列一次我已經列n次的框架結構: 傳統的架構: 1) Session Bean <-> Entity Bean<-> DB 爲了解決性能障礙的替代架構: 2) Session Bean <-> DAO <->JDBC <-> DB 使用Hibernate來提升上面架構的開發效率的架構: 3) Session Bean <-> DAO <->Hibernate <-> DB 就上面3個架構來分析: 1、內存消耗:採用JDBC的架構2無疑是最省內存的,Hibernate的架構3次之,EB的架構1最差。 2、運行效率:若是JDBC的代碼寫的很是優化,那麼JDBC架構運行效率最高,可是實際項目中,這一點幾乎作不到,這須要程序員很是精通JDBC,運用 Batch語句,調整PreapredStatement的Batch Size和Fetch Size等參數,以及在必要的狀況下采用結果集cache等等。而通常狀況下程序員是作不到這一點的。所以Hibernate架構表現出最快的運行效率。 EB的架構效率會差的很遠。 3、開發效率:在有JBuilder的支持下以及簡單的項目,EB架構開發效率最高,JDBC次之,Hibernate最差。可是在大的項目,特別是持久層關係映射很複雜的狀況下,Hibernate效率高的驚人,JDBC次之,而EB架構極可能會失敗。 4、分佈式,安全檢查,集羣,負載均衡的支持 因爲有SB作爲Facade,3個架構沒有區別。 4、EB和Hibernate學習難度在哪裏? EB的難度在哪裏?不在複雜的XML配置文件上,而在於EB運用稍微不慎,就有嚴重的性能障礙。因此難在你須要學習不少EJB設計模式來避開性能問題,需 要學習App Server和EB的配置來優化EB的運行效率。作EB的開發工做,程序員的大部分精力都被放到了EB的性能問題上了,反而沒有更多的精力關注自己就主要 投入精力去考慮的對象持久層的設計上來。 Hibernate難在哪裏?不在Hibernate自己的複雜,實際上Hibernate很是的簡單,難在Hibernate太靈活了。 當你用EB來實現持久層的時候,你會發現EB實在是太笨拙了,笨拙到你根本沒有什麼能夠選擇的餘地,因此你根本就不用花費精力去設計方案,去平衡方案的好壞,去費腦筋考慮選擇哪一個方案,由於只有惟一的方案擺在你面前,你只能這麼作,沒得選擇。 Hibernate相反,它太靈活了,相同的問題,你至少能夠設計出十幾種方案來解決,因此特別的犯難,究竟用這個,仍是用那個呢?這些方案之間到底有什麼區別呢?他們的運行原理有什麼不一樣?運行效率哪一個比較好?光是主鍵生成,就有七八種方案供你選擇,你爲難不爲難?集合屬性能夠用Set,能夠用 List,還能夠用Bag,到底哪一個效率高,你爲難不爲難?查詢能夠用iterator,能夠用list,哪一個好,有什麼區別?你爲難不爲難?複合主鍵你 能夠直接在hbm裏面配置,也能夠自定義CustomerType,哪一種比較好些?你爲難不爲難?對於一個表,你能夠選擇單一映射一個對象,也能夠映射成父子對象,還能夠映射成兩個1:1的對象,在什麼狀況下用哪一種方案比較好,你爲難不爲難? 這個列表能夠一直開列下去,直到你不想再看下去爲止。當你面前擺着無數的眼花繚亂的方案的時候,你會以爲幸福呢?仍是悲哀呢?若是你是一個負責的程序員,那麼你必定會仔細研究每種方案的區別,每種方案的效率,每種方案的適用場合,你會以爲你已經陷入進去拔不出來了。若是是用EB,你第一秒種就已經作出了決 定,根本沒得選擇,好比說集合屬性,你只能用Collection,若是是Hibernate,你會在Bag,List和Set之間來回猶豫不決,甚至搞 不清楚的話,程序都沒有辦法寫。 3. Spring 它是一個開源的項目,並且目前很是活躍;它基於IoC(Inversion of Control,反向控制)和AOP的構架多層j2ee系統的框架,但它不強迫你必須在每一層中必須使用Spring,由於它模塊化的很好,容許你根據本身的須要選擇使用它的某一個模塊;它實現了很優雅的MVC,對不一樣的數據訪問技術提供了統一的接口,採用IoC使得能夠很容易的實現bean的裝配,提供了簡潔的AOP並據此實現Transcation Managment,等等 優勢: a. Spring能有效地組織你的中間層對象,無論你是否選擇使用了EJB。若是你僅僅使用了Struts或其餘爲J2EE的 API特製的framework,Spring致力於解決剩下的問題。 b. Spring能消除在許多工程中常見的對Singleton的過多使用。根據個人經驗,這是一個很大的問題,它下降了系統的可測試性和麪向對象的程度。 c. 經過一種在不一樣應用程序和項目間一致的方法來處理配置文件,Spring能消除各類各樣自定義格式的屬性文件的須要。曾經對某個類要尋找的是哪一個魔法般的 屬性項或系統屬性感到不解,爲此不得不去讀Javadoc甚至源編碼?有了Spring,你僅僅須要看看類的JavaBean屬性。Inversion ofControl的使用(在下面討論)幫助完成了這種簡化。 d.經過把對接口編程而不是對類編程的代價幾乎減小到沒有,Spring可以促進養成好的編程習慣。 e. Spring被設計爲讓使用它建立的應用盡量少的依賴於他的APIs。在Spring應用中的大多數業務對象沒有依賴於Spring。 f. 使用Spring構建的應用程序易於單元測試。 g.Spring能使EJB的使用成爲一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOs或local EJBs來實現業務接口,卻不會影響調用代碼。 h. Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適用於許多web應用。例如,Spring能使用AOP提供聲明性事務管理而不經過EJB容器,若是你僅僅須要與單個數據庫打交道,甚至不須要一個JTA實現。 i. Spring爲數據存取提供了一個一致的框架,不管是使用的是JDBC仍是O/R mapping產品(如Hibernate)。 Spring確實使你能經過最簡單可行的解決辦法來解決你的問題。而這是有有很大價值的。 缺點: 使用人數很少、jsp中要寫不少代碼、控制器過於靈活,缺乏一個公用控制器。 6. Java Web部分 1、Tomcat的優化經驗 答:去掉對web.xml的監視,把jsp提早編輯成Servlet。 有富餘物理內存的狀況,加大tomcat使用的jvm的內存 1、HTTP請求的GET與POST方式的區別 (1)get是從服務器上獲取數據,post是向服務器傳送數據。 在客戶端,Get方式在經過URL提交數據,數據在URL中能夠看到;POST方式,數據放置在HTML HEADER內提交。 (2)對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。 (3) GET方式提交的數據最多隻能有1024字節,而POST則沒有此限制。 (4)安全性問題。正如在(1)中提到,使用 Get 的時候,參數會顯示在地址欄上,而 Post 不會。因此,若是這些數據是中文數據並且是非敏感數據,那麼使用 get;若是用戶輸入的數據不是中文字符並且包含敏感數據,那麼仍是使用 post爲好。 62、解釋一下什麼是servlet; 答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。 一、說一說Servlet的生命週期? 答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。 Servlet被服務器實例化後,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷燬的時候調用其destroy方法。 web容器加載servlet,生命週期開始。經過調用servlet的init()方法進行servlet的初始化。經過調用service()方法實現,根據請求的不一樣調用不一樣的do***()方法。結束服務,web容器調用servlet的destroy()方法。 4、Servlet的基本架構 public class ServletName extendsHttpServlet { public void doPost(HttpServletRequestrequest, HttpServletResponse response) throws ServletException, IOException { } public void doGet(HttpServletRequestrequest, HttpServletResponse response) throws ServletException, IOException { } } 3、SERVLET API中forward() 與redirect()的區別? 答:前者僅是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向後的地址;後者則是徹底的跳轉,瀏覽器將會獲得跳轉的地址,並從新發送請求連接。這樣,從瀏覽器的地址欄中能夠看到跳轉後的連接地址。因此,前者更加高效,在前者能夠知足須要時,儘可能使用forward()方法,而且,這樣也有助於隱藏實際的連接。在有些狀況下,好比,須要跳轉到一個其它服務器上的資源,則必須使用 sendRedirect()方法。 60、什麼狀況下調用doGet()和doPost()? Jsp頁面中的FORM標籤裏的method屬性爲get時調用doGet(),爲post時調用doPost()。 66、Request對象的主要方法: setAttribute(String name,Object):設置名字爲name的request的參數值 getAttribute(String name):返回由name指定的屬性值 getAttributeNames():返回request對象全部屬性的名字集合,結果是一個枚舉的實例 getCookies():返回客戶端的全部Cookie對象,結果是一個Cookie數組 getCharacterEncoding():返回請求中的字符編碼方式 getContentLength():返回請求的Body的長度 getHeader(String name):得到HTTP協議定義的文件頭信息 getHeaders(String name):返回指定名字的request Header的全部值,結果是一個枚舉的實例 getHeaderNames():返回因此request Header的名字,結果是一個枚舉的實例 getInputStream():返回請求的輸入流,用於得到請求中的數據 getMethod():得到客戶端向服務器端傳送數據的方法 getParameter(String name):得到客戶端傳送給服務器端的有name指定的參數值 getParameterNames():得到客戶端傳送給服務器端的全部參數的名字,結果是一個枚舉的實例 getParametervalues(String name):得到有name指定的參數的全部值 getProtocol():獲取客戶端向服務器端傳送數據所依據的協議名稱 getQueryString():得到查詢字符串 getRequestURI():獲取發出請求字符串的客戶端地址 getRemoteAddr():獲取客戶端的IP地址 getRemoteHost():獲取客戶端的名字 getSession([Boolean create]):返回和請求相關Session getServerName():獲取服務器的名字 getServletPath():獲取客戶端所請求的腳本文件的路徑 getServerPort():獲取服務器的端口號 removeAttribute(String name):刪除請求中的一個屬性 19、forward 和redirect的區別 forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,因此它的地址欄中仍是原來的地址。 redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址,通常來講瀏覽器會用剛纔請求的全部參數從新請求,因此session,request參數均可以獲取。 四、request.getAttribute() 和 request.getParameter() 有何區別? 1.getAttribute是取得jsp中 用setAttribute設定的attribute 2.parameter獲得的是string;attribute獲得的是object 3.request.getParameter ()方法傳遞的數據,會從Web客戶端傳到Web服務器端,表明HTTP請求數據;request.setAttribute()和 getAttribute()方法傳遞的數據只會存在於Web容器內部,在具備轉發關係的Web組件之間共享。即request.getAttribute()方法返回request範圍內存在的對象,而request.getParameter()方法是獲取 http提交過來的數據。 1. jsp有哪些內置對象?做用分別是什麼? 分別有什麼方法? 答:JSP共有如下9個內置的對象: request 用戶端請求,此請求會包含來自GET/POST請求的參數 response 網頁傳回用戶端的迴應 pageContext 網頁的屬性是在這裏管理 session 與請求有關的會話期 application servlet 正在執行的內容 out 用來傳送回應的輸出 config servlet的構架部件 page JSP網頁自己 exception 針對錯誤網頁,未捕捉的例外 request表示HttpServletRequest對象。它包含了有關瀏覽器請求的信息,而且提供了幾個用於獲取cookie, header, 和session數據的有用的方法。 response表示HttpServletResponse對象,並提供了幾個用於設置送回瀏覽器的響應的方法(如cookies,頭信息等) out對象是javax.jsp.JspWriter的一個實例,並提供了幾個方法使你能用於向瀏覽器回送輸出結果。 pageContext表示一個javax.servlet.jsp.PageContext對象。它是用於方便存取各類範圍的名字空間、servlet相關的對象的API,而且包裝了通用的servlet相關功能的方法。 session表示一個請求的javax.servlet.http.HttpSession對象。Session能夠存貯用戶的狀態信息 applicaton 表示一個javax.servle.ServletContext對象。這有助於查找有關servlet引擎和servlet環境的信息 config表示一個javax.servlet.ServletConfig對象。該對象用於存取servlet實例的初始化參數。 page表示從該頁面產生的一個servlet實例 2. jsp有哪些動做?做用分別是什麼? (這個問題彷佛不重要,不明白爲什麼有此題) 答:JSP共有如下6種基本動做 jsp:include:在頁面被請求的時候引入一個文件。 jsp:useBean:尋找或者實例化一個JavaBean。 jsp:setProperty:設置JavaBean的屬性。 jsp:getProperty:輸出某個JavaBean的屬性。 jsp:forward:把請求轉到一個新的頁面。 jsp:plugin:根據瀏覽器類型爲Java插件生成OBJECT或EMBED標記 59、JSP的經常使用指令 isErrorPage(是否能使用Exception對象),isELIgnored(是否忽略表達式) 3. JSP中動態INCLUDE與靜態INCLUDE的區別? 答:動態INCLUDE用jsp:include動做實現 <jsp:include page=included.jspflush=true />它老是會檢查所含文件中的變化,適合用於包含動態頁面,而且能夠帶參數 靜態INCLUDE用include僞碼實現,定不會檢查所含文件的變化,適用於包含靜態頁面<%@ include file=included.htm %> 四、兩種跳轉方式分別是什麼?有什麼區別? (下面的回答嚴重錯誤,應該是想問forward和sendRedirect 的區別,畢竟出題的人不是專業搞文字藝術的人,可能表達能力並不見得很強,用詞不必定精準,加之其自身的技術面也可能存在一些問題,不必定真正將他的意思表達清楚了,嚴格意思上來說,一些題目可能根本就無人能答,因此,答題時要掌握主動,只要把本身知道的表達清楚就夠了,而不要去推敲原始題目的具體含義是什麼,不要一味想着是在答題) 答:有兩種,分別爲: <jsp:include page=included.jspflush=true> <jsp:forward page= nextpage.jsp/> 前者頁面不會轉向include所指的頁面,只是顯示該頁的結果,主頁面仍是原來的頁面。執行完後還會回來,至關於函數調用。而且能夠帶參數.後者徹底轉向新頁面,不會再回來。至關於go to語句。 63、頁面間對象傳遞的方法 request,session,application,cookie等 64、JSP和Servlet有哪些相同點和不一樣點,他們之間的聯繫是什麼? JSP是Servlet技術的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯後是"類servlet"。Servlet和JSP最主要的不一樣點在於,Servlet的應用邏輯是在Java文件中,而且徹底從表示層中的HTML裏分離開來。而JSP的狀況是Java和HTML能夠組合成一個擴展名爲.jsp的文件。JSP側重於視圖,Servlet主要用於控制邏輯。 一、MVC的各個部分都有那些技術來實現?如何實現? 答:MVC是Model-View-Controller的簡寫。Model 表明的是應用的業務邏輯(經過JavaBean,EJB組件實現), View 是應用的表示面(由JSP頁面產生),Controller 是提供應用的處理過程控制(通常是一個Servlet),經過這種設計模型把應用邏輯,處理過程和顯示邏輯分紅不一樣的組件實現。這些組件能夠進行交互和重用。 6八、咱們在web應用開發過程當中常常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個某種編碼的字符串? Public String translate (String str) { String tempStr = ""; try { tempStr = new String(str.getBytes("ISO-8859-1"),"GBK"); tempStr = tempStr.trim(); } catch (Exception e) { System.err.println(e.getMessage()); } return tempStr; } 1.如今輸入n個數字,以逗號,分開;而後可選擇升或者降序排序;按提交鍵就在另外一頁面顯示按什麼排序,結果爲,提供reset 7. 實際項目開發 1、在eclipse中調試時,怎樣查看一個變量的值? 在要查看的變量前先設置斷點,而後選中變量,右鍵選debugas-->Java Application,打開debug透視圖,這時在Variables窗口中能夠看到變量當前的值。 若是是局部變量,也能夠在局部變量窗口中查看。 要知道一個方法被調用的方法調用鏈,能夠在方法棧中查看。 2、大家公司使用的代碼配置管理工具是什麼? 除了說之前使用cvs,如今新項目使用svn了,還簡要說一下使用的過程,若是有可能,還說說倉庫的概念和如何使用鎖之類的細節。 3、大家的項目總金額多少,多少人開發,總共花了多少個月? 像巴巴運動網這種規模的項目,能夠說是四、5我的、開發了四、5個月,費用則是四、50萬。按每人每個月兩萬收入去計算,就差很少了。 7. 數據庫部分 1、用兩種方式根據部門號從高到低,工資從低到高列出每一個員工的信息。 employee: eid,ename,salary,deptid; select * from employee order by deptiddesc,salary 2、列出各個部門中工資高於本部門的平均工資的員工數和部門號,並按部門號排序 建立表: MySQL> create table employee921(id int primary keyauto_increment,name varchar(5 0),salary bigint,deptid int); 插入實驗數據: mysql> insert into employee921values(null,'zs',1000,1),(null,'ls',1100,1),(null ,'ww',1100,1),(null,'zl',900,1),(null,'zl',1000,2), (null,'zl',900,2) ,(null,'z l',1000,2) , (null,'zl',1100,2); 編寫sql語句: ()select avg(salary)from employee921 group by deptid; ()mysql> selectemployee921.id,employee921.name,employee921.salary,employee921.dep tid tid from employee921 where salary > (selectavg(salary) from employee921 where deptid = tid); 效率低的一個語句,僅供學習參考使用(在group by以後不能使用where,只能使用having,在group by以前能夠使用where,即表示對過濾後的結果分組): mysql> selectemployee921.id,employee921.name,employee921.salary,employee921.dep tid tid from employee921 where salary > (selectavg(salary) from employee921 group by deptid having deptid = tid); ()select count(*) ,tid from( selectemployee921.id,employee921.name,employee921.salary,employee921.deptid tid from employee921 wheresalary > (selectavg(salary) from employee921 where deptid = tid) )as t groupby tid ; 另一種方式:關聯查詢 select a.ename,a.salary,a.deptid fromemp a, (select deptd,avg(salary) avgsal from emp group by deptid ) b where a.deptid=b.deptid anda.salary>b.avgsal; 一、存儲過程與觸發器必須講,常常被面試到? create procedure insert_Student (_namevarchar(50),_age int ,out _id int) begin insertinto student value(null,_name,_age); selectmax(stuId) into _id from student; end; call insert_Student('wfz',23,@id); select @id; mysql> create trigger update_StudentBEFORE update on student FOR EACH ROW -> select * from student; 觸發器不容許返回結果 create trigger update_Student BEFORE updateon student FOR EACH ROW insert into student value(null,'zxx',28); mysql的觸發器目前不能對當前表進行操做 create trigger update_Student BEFORE updateon student FOR EACH ROW delete from articles where id=8; 這個例子不是很好,最好是用刪除一個用戶時,順帶刪除該用戶的全部帖子 這裏要注意使用OLD.id 觸發器用處仍是不少的,好比校內網、開心網、Facebook,你發一個日誌,自動通知好友,其實就是在增長日誌時作一個後觸發,再向通知表中寫入條目。由於觸發器效率高。而UCH沒有用觸發器,效率和數據處理能力都很低。 存儲過程的實驗步驟: mysql> delimiter | mysql> create procedureinsertArticle_Procedure (pTitle varchar(50),pBid int,out pIdint) -> begin -> insert into article1 value(null,pTitle,pBid); -> select max(id) into pId from article1; -> end; -> | Query OK, 0 rows affected (0.05 sec) mysql> call insertArticle_Procedure('傳智播客',1,@pid); -> | Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> select @pid; +------+ | @pid | +------+ | 3 | +------+ 1 row in set (0.00 sec) mysql> select * from article1; +----+--------------+------+ | id | title | bid | +----+--------------+------+ | 1 | test | 1 | | 2 | chuanzhiboke | 1 | | 3 | 傳智播客 | 1 | +----+--------------+------+ 3 rows in set (0.00 sec) 觸發器的實驗步驟: create table board1(id int primary keyauto_increment,name varchar(50),ar ticleCount int); create table article1(id int primary keyauto_increment,title varchar(50) ,bid int references board1(id)); delimiter | create trigger insertArticle_Trigger afterinsert on article1 for each ro w begin -> update board1 set articleCount=articleCount+1 where id= NEW.bid; -> end; -> | delimiter ; insert into board1 value (null,'test',0); insert into article1 value(null,'test',1); 還有,每插入一個帖子,都但願將版面表中的最後發帖時間,帖子總數字段進行同步更新,用觸發器作效率就很高。下次課設計這樣一個案例,寫觸發器時,對於最後發帖時間可能須要用declare方式聲明一個變量,或者是用NEW.posttime來生成。 一、數據庫三範式是什麼? 第一範式(1NF):字段具備原子性,不可再分。全部關係型數據庫系統都知足第一範式) 數據庫表中的字段都是單一屬性的,不可再分。例如,姓名字段,其中的姓和名必須做爲一個總體,沒法區分哪部分是姓,哪部分是名,若是要區分出姓和名,必須設計成兩個獨立的字段。 第二範式(2NF): 第二範式(2NF)是在第一範式(1NF)的基礎上創建起來的,即知足第二範式(2NF)必須先知足第一範式(1NF)。 要求數據庫表中的每一個實例或行必須能夠被唯一地區分。一般須要爲表加上一個列,以存儲各個實例的唯一標識。這個唯一屬性列被稱爲主關鍵字或主鍵。 第二範式(2NF)要求實體的屬性徹底依賴於主關鍵字。所謂徹底依賴是指不能存在僅依賴主關鍵字一部分的屬性,若是存在,那麼這個屬性和主關鍵字的這一部分應該分離出來造成一個新的實體,新實體與原實體之間是一對多的關係。爲實現區分一般須要爲表加上一個列,以存儲各個實例的唯一標識。簡而言之,第二範式就是非主屬性非部分依賴於主關鍵字。 第三範式的要求以下: 知足第三範式(3NF)必須先知足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。 因此第三範式具備以下特徵: 1,每一列只有一個值 2,每一行都能區分。 3,每個表都不包含其餘表已經包含的非主關鍵字信息。 例如,帖子表中只能出現發帖人的id,而不能出現發帖人的id,還同時出現發帖人姓名,不然,只要出現同一發帖人id的全部記錄,它們中的姓名部分都必須嚴格保持一致,這就是數據冗餘。 一、說出一些數據庫優化方面的經驗? 用PreparedStatement 通常來講比Statement性能高:一個sql 發給服務器去執行,涉及步驟:語法檢查、語義分析,編譯,緩存 「inert into uservalues(1,1,1)」-?二進制 「inert into uservalues(2,2,2)」-?二進制 「inert into uservalues(?,?,?)」-?二進制 有外鍵約束會影響插入和刪除性能,若是程序可以保證數據的完整性,那在設計數據庫時就去掉外鍵。(比喻:就比如免檢產品,就是爲了提升效率,充分相信產品的製造商) (對於hibernate來講,就應該有一個變化:empleyee->Deptment對象,如今設計時就成了employee?deptid) 看mysql幫助文檔子查詢章節的最後部分,例如,根據掃描的原理,下面的子查詢語句要比第二條關聯查詢的效率高: 1. select e.name,e.salary where e.managerid=(select id from employee wherename='zxx'); 2. select e.name,e.salary,m.name,m.salary from employees e,employees mwhere e.managerid = m.id and m.name='zxx'; 表中容許適當冗餘,譬如,主題帖的回覆數量和最後回覆時間等 將姓名和密碼單獨從用戶表中獨立出來。這能夠是很是好的一對一的案例喲! sql語句所有大寫,特別是列名和表名都大寫。特別是sql命令的緩存功能,更加須要統一大小寫,sql語句?發給oracle服務器?語法檢查和編譯成爲內部指令?緩存和執行指令。根據緩存的特色,不要拼湊條件,而是用?和PreparedStatment 還有索引對查詢性能的改進也是值得關注的。 備註:下面是關於性能的討論舉例 4航班 3個城市 m*n select * from flight,city whereflight.startcityid=city.cityid and city.name='beijing'; m + n select * from flight where startcityid =(select cityid from city where cityname='beijing'); selectflight.id,'beijing',flight.flightTime from flight where startcityid = (selectcityid from city where cityname='beijing') 二、union和union all有什麼不一樣? 假設咱們有一個表Student,包括如下字段與數據: drop table student; create table student ( id int primary key, name nvarchar2(50) not null, score number not null ); insert into student values(1,'Aaron',78); insert into student values(2,'Bill',76); insert into student values(3,'Cindy',89); insert into student values(4,'Damon',90); insert into student values(5,'Ella',73); insert into student values(6,'Frado',61); insert into student values(7,'Gill',99); insert into student values(8,'Hellen',56); insert into student values(9,'Ivan',93); insert into student values(10,'Jay',90); commit; Union和Union All的區別。 select * from student where id < 4 union select * from student where id > 2 and id < 6 結果將是 1 Aaron 78 2 Bill 76 3 Cindy 89 4 Damon 90 5 Ella 73 若是換成Union All鏈接兩個結果集,則返回結果是: 1 Aaron 78 2 Bill 76 3 Cindy 89 3 Cindy 89 4 Damon 90 5 Ella 73 能夠看到,Union和Union All的區別之一在於對重複結果的處理。 UNION在進行表連接後會篩選掉重複的記錄,因此在表連接後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。實際大部分應用中是不會產生重複的記錄,最多見的是過程表與歷史表UNION。如: select * from gc_dfys union select * from ls_jg_dfys 這個SQL在運行時先取出兩個表的結果,再用排序空間進行排序刪除重複的記錄,最後返回結果集,若是表數據量大的話可能會致使用磁盤進行排序。 而UNION ALL只是簡單的將兩個結果合併後就返回。這樣,若是返回的兩個結果集中有重複的數據,那麼返回的結果集就會包含重複的數據了。 從效率上說,UNION ALL 要比UNION快不少,因此,若是能夠確認合併的兩個結果集中不包含重複的數據的話,那麼就使用UNION ALL, 3.分頁語句 取出sql表中第31到40的記錄(以自動增加ID爲主鍵) sql server方案1: selecttop 10 * from t where id not in (select top 30 id from t order by id ) orde byid sql server方案2: selecttop 10 * from t where id in (select top 40 id from t order by id) order by iddesc mysql方案:select * from t order by id limit 30,10 oracle方案:select * from (select rownum r,* from t where r<=40) wherer>30 --------------------待整理進去的內容------------------------------------- pageSize=20; pageNo = 5; 1.分頁技術1(直接利用sql語句進行分頁,效率最高和最推薦的) mysql:sql = "select * from articleslimit " + (pageNo-1)*pageSize + "," + pageSize; oracle: sql = "select * from " + "(selectrownum r,* from " + "(select* from articles order by postime desc)" + "whererownum<= " + pageNo*pageSize +") tmp " + "wherer>" + (pageNo-1)*pageSize; 註釋:第7行保證rownum的順序是肯定的,由於oracle的索引會形成rownum返回不一樣的值 簡洋提示:沒有order by時,rownum按順序輸出,一旦有了order by,rownum不按順序輸出了,這說明rownum是排序前的編號。若是對order by從句中的字段創建了索引,那麼,rownum也是按順序輸出的,由於這時候生成原始的查詢結果集時會參照索引表的順序來構建。 sqlserver:sql = "select top 10 * fromid not id(select top " + (pageNo-1)*pageSize + "id fromarticles)" DataSource ds = newInitialContext().lookup(jndiurl); Connection cn = ds.getConnection(); //"select * from user whereid=?" --->binary directive PreparedStatement pstmt =cn.prepareSatement(sql); ResultSet rs = pstmt.executeQuery() while(rs.next()) { out.println(rs.getString(1)); } 2.不可滾動的遊標 pageSize=20; pageNo = 5; cn = null stmt = null; rs = null; try { sqlserver:sql = "select * from articles"; DataSource ds = newInitialContext().lookup(jndiurl); Connection cn = ds.getConnection(); //"select * from user whereid=?" --->binary directive PreparedStatement pstmt =cn.prepareSatement(sql); ResultSet rs = pstmt.executeQuery() for(int j=0;j<(pageNo-1)*pageSize;j++) { rs.next(); } int i=0; while(rs.next() && i<10) { i++; out.println(rs.getString(1)); } } cacth(){} finnaly { if(rs!=null)try{rs.close();}catch(Exceptione){} if(stm......... if(cn............ } 3.可滾動的遊標 pageSize=20; pageNo = 5; cn = null stmt = null; rs = null; try { sqlserver:sql = "select * from articles"; DataSource ds = newInitialContext().lookup(jndiurl); Connection cn = ds.getConnection(); //"select * from user whereid=?" --->binary directive PreparedStatement pstmt =cn.prepareSatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,...); //根據上面這行代碼的異常SQLFeatureNotSupportedException,就可判斷驅動是否支持可滾動遊標 ResultSet rs = pstmt.executeQuery() rs.absolute((pageNo-1)*pageSize) int i=0; while(rs.next() && i<10) { i++; out.println(rs.getString(1)); } } cacth(){} finnaly { if(rs!=null)try{rs.close();}catch(Exceptione){} if(stm......... if(cn............ } 3.用一條SQL語句 查詢出每門課都大於80分的學生姓名 name kecheng fenshu 張三 語文 81 張三 數學 75 李四 語文 76 李四 數學 90 王五 語文 81 王五 數學 100 王五 英語 90 準備數據的sql代碼: create table score(id int primary keyauto_increment,name varchar(20),subject varchar(20),score int); insert into score values (null,'張三','語文',81), (null,'張三','數學',75), (null,'李四','語文',76), (null,'李四','數學',90), (null,'王五','語文',81), (null,'王五','數學',100), (null,'王五 ','英語',90); 提示:當百思不得其解時,請理想思惟,把小變成大作,把大變成小作, 答案: A: select distinct name from score where name not in (select distinct name from score where score<=80) B:select distince name t1 from score where80< all (select score from score where name=t1); 4.全部部門之間的比賽組合 一個叫department的表,裏面只有一個字段name,一共有4條紀錄,分別是a,b,c,d,對應四個球對,如今四個球對進行比賽,用一條sql語句顯示全部可能的比賽組合. 答:select a.name, b.name from team a, team b where a.name < b.name 4.每月份的發生額都比101科目多的科目 請用SQL語句實現:從TestDB數據表中查詢出全部月份的發生額都比101科目相應月份的發生額高的科目。請注意:TestDB中有不少科目,都有1-12月份的發生額。 AccID:科目代碼,Occmonth:發生額月份,DebitOccur:發生額。 數據庫名:JcyAudit,數據集:Select * from TestDB 準備數據的sql代碼: drop table if exists TestDB; create table TestDB(id int primary keyauto_increment,AccID varchar(20), Occmonth date, DebitOccur bigint); insert into TestDB values (null,'101','1988-1-1',100), (null,'101','1988-2-1',110), (null,'101','1988-3-1',120), (null,'101','1988-4-1',100), (null,'101','1988-5-1',100), (null,'101','1988-6-1',100), (null,'101','1988-7-1',100), (null,'101','1988-8-1',100); --複製上面的數據,故意把第一個月份的發生額數字改小一點 insert into TestDB values (null,'102','1988-1-1',90), (null,'102','1988-2-1',110), (null,'102','1988-3-1',120), (null,'102','1988-4-1',100), (null,'102','1988-5-1',100), (null,'102','1988-6-1',100), (null,'102','1988-7-1',100), (null,'102','1988-8-1',100); --複製最上面的數據,故意把全部發生額數字改大一點 insert into TestDB values (null,'103','1988-1-1',150), (null,'103','1988-2-1',160), (null,'103','1988-3-1',180), (null,'103','1988-4-1',120), (null,'103','1988-5-1',120), (null,'103','1988-6-1',120), (null,'103','1988-7-1',120), (null,'103','1988-8-1',120); --複製最上面的數據,故意把全部發生額數字改大一點 insert into TestDB values (null,'104','1988-1-1',130), (null,'104','1988-2-1',130), (null,'104','1988-3-1',140), (null,'104','1988-4-1',150), (null,'104','1988-5-1',160), (null,'104','1988-6-1',170), (null,'104','1988-7-1',180), (null,'104','1988-8-1',140); --複製最上面的數據,故意把第二個月份的發生額數字改小一點 insert into TestDB values (null,'105','1988-1-1',100), (null,'105','1988-2-1',80), (null,'105','1988-3-1',120), (null,'105','1988-4-1',100), (null,'105','1988-5-1',100), (null,'105','1988-6-1',100), (null,'105','1988-7-1',100), (null,'105','1988-8-1',100); 答案: select distinct AccID from TestDB where AccID not in (selectTestDB.AccIDfrom TestDB, (select * from TestDB where AccID='101') asdb101 whereTestDB.Occmonth=db101.Occmonth and TestDB.DebitOccur<=db101.DebitOccur ); 4.統計每一年每個月的信息 year month amount 1991 1 1.1 1991 2 1.2 1991 3 1.3 1991 4 1.4 1992 1 2.1 1992 2 2.2 1992 3 2.3 1992 4 2.4 查成這樣一個結果 year m1 m2 m3 m4 1991 1.1 1.2 1.3 1.4 1992 2.1 2.2 2.3 2.4 提示:這個與工資條很是相似,與學生的科目成績也很類似。 準備sql語句: drop table if exists sales; create table sales(id int auto_incrementprimary key,year varchar(10), month varchar(10), amount float(2,1)); insert into sales values (null,'1991','1',1.1), (null,'1991','2',1.2), (null,'1991','3',1.3), (null,'1991','4',1.4), (null,'1992','1',2.1), (null,'1992','2',2.2), (null,'1992','3',2.3), (null,'1992','4',2.4); 答案1、 select sales.year , (select t.amount from sales t wheret.month='1' and t.year= sales.year) '1', (select t.amount from sales t wheret.month='1' and t.year= sales.year) '2', (select t.amount from sales t wheret.month='1' and t.year= sales.year) '3', (select t.amount from sales t wheret.month='1' and t.year= sales.year) as '4' from sales group by year; 5.顯示文章標題,發帖人、最後回覆時間 表:id,title,postuser,postdate,parentid 準備sql語句: drop table if exists articles; create table articles(id int auto_incrementprimary key,title varchar(50), postuser varchar(10), postdate datetime,parentidint references articles(id)); insert into articles values (null,'第一條','張三','1998-10-1012:32:32',null), (null,'第二條','張三','1998-10-1012:34:32',null), (null,'第一條回覆1','李四','1998-10-1012:35:32',1), (null,'第二條回覆1','李四','1998-10-1012:36:32',2), (null,'第一條回覆2','王五','1998-10-1012:37:32',1), (null,'第一條回覆3','李四','1998-10-1012:38:32',1), (null,'第二條回覆2','李四','1998-10-1012:39:32',2), (null,'第一條回覆4','王五','1998-10-1012:39:40',1); 答案: select a.title,a.postuser, (selectmax(postdate) from articles where parentid=a.id) reply from articles a where a.parentid is null; 註釋:子查詢能夠用在選擇列中,也可用於where的比較條件中,還能夠用於from從句中。 3.刪除除了id號不一樣,其餘都相同的學生冗餘信息 2.學生表 以下: id號 學號 姓名課程編號 課程名稱 分數 1 2005001 張三 0001 數學 69 2 2005002 李四 0001 數學 89 3 2005001 張三 0001 數學 69 A: delete from tablename where id號 not in(select min(id號) fromtablename group by 學號,姓名,課程編號,課程名稱,分數) 實驗: create table student2(id int auto_incrementprimary key,code varchar(20),name varchar(20)); insert into student2values(null,'2005001','張三'),(null,'2005002','李四'),(null,'2005001','張三'); //以下語句,mysql報告錯誤,可能刪除依賴後面統計語句,而刪除又致使統計語句結果不一致。 delete from student2 where id not in(selectmin(id) from student2 group by name); //可是,以下語句沒有問題: select * from student2 where id not in(select min(id) from student2 group by name); //因而,我想先把分組的結果作成虛表,而後從虛表中選出結果,最後再將結果做爲刪除的條件數據。 delete from student2 where id not in(selectmid from (select min(id) mid from student2 group by name) as t); 或者: delete from student2 where id not in(selectmin(id) from (select * from s tudent2) as t group by t.name); 4.航空網的幾個航班查詢題: 表結構以下: flight{flightID,StartCityID,endCityID,StartTime} city{cityID, CityName) 實驗環境: create table city(cityID int auto_incrementprimary key,cityName varchar(20)); create table flight (flightID intauto_increment primary key, StartCityIDint references city(cityID), endCityID int references city(cityID), StartTimetimestamp); //航班原本應該沒有日期部分纔好,可是下面的題目當中涉及到了日期 insert into city values(null,'北京'),(null,'上海'),(null,'廣州'); insert into flight values (null,1,2,'9:37:23'),(null,1,3,'9:37:23'),(null,1,2,'10:37:23'),(null,2,3,'10:37:23'); 1、查詢起飛城市是北京的全部航班,按到達城市的名字排序 參與運算的列是我起碼可以顯示出來的那些列,但最終我不必定把它們顯示出來。各個表組合出來的中間結果字段中必須包含全部運算的字段。 select * from flight f,city c wheref.endcityid = c.cityid and startcityid = (selectc1.cityid from city c1 where c1.cityname = "北京") orderby c.cityname asc; mysql> select flight.flightid,'北京' startcity, e.cityname from flight,city e wh ere flight.endcityid=e.cityid andflight.startcityid=(select cityid from city wh ere cityname='北京'); mysql> selectflight.flightid,s.cityname,e.cityname from flight,city s,city e wh ere flight.startcityid=s.cityid ands.cityname='北京' andflight.endCityId=e.cit yID order by e.cityName desc; 2、查詢北京到上海的全部航班紀錄(起飛城市,到達城市,起飛時間,航班號) select c1.CityName,c2.CityName,f.StartTime,f.flightID from city c1,city c2,flight f where f.StartCityID=c1.cityID and f.endCityID=c2.cityID and c1.cityName='北京' and c2.cityName='上海' 三、查詢具體某一天(2005-5-8)的北京到上海的的航班次數 select count(*) from (select c1.CityName,c2.CityName,f.StartTime,f.flightID from city c1,city c2,flight f where f.StartCityID=c1.cityID and f.endCityID=c2.cityID and c1.cityName='北京' and c2.cityName='上海' and 查幫助得到的某個日期處理函數(startTime) like '2005-5-8%' mysql中提取日期部分進行比較的示例代碼以下: select * from flight where date_format(starttime,'%Y-%m-%d')='1998-01-02' 5.查出比經理薪水還高的員工信息: Drop table if not exists employees; create table employees(id int primary keyauto_increment,name varchar(50) ,salary int,managerid int referencesemployees(id)); insert into employees values (null,'lhm',10000,null), (null,' zxx',15000,1 ),(null,'flx',9000,1),(null,'tg',10000,2),(null,'wzg',10000,3); Wzg大於flx,lhm大於zxx 解題思路: 根據sql語句的查詢特色,是逐行進行運算,不可能兩行同時參與運算。 涉及了員工薪水和經理薪水,全部,一行記錄要同時包含兩個薪水,全部想到要把這個表自關聯組合一下。 首先要組合出一個包含有各個員工及該員工的經理信息的長記錄,譬如,左半部分是員工,右半部分是經理。而迪卡爾積會組合出不少垃圾信息,先去除這些垃圾信息。 select e.* from employees e,employees mwhere e.managerid=m.id and e.sala ry>m.salary; 6、求出小於45歲的各個老師所帶的大於12歲的學生人數 數據庫中有3個表 teacher 表,student表,tea_stu關係表。 teacher 表 teaID name age student 表 stuID name age teacher_student表 teaID stuID 要求用一條sql查詢出這樣的結果 1.顯示的字段要有老師name, age 每一個老師所帶的學生人數 2 只列出老師age爲40如下,學生age爲12以上的記錄 預備知識: 1.sql語句是對每一條記錄依次處理,條件爲真則執行動做(select,insert,delete,update) 2.只要是迪卡爾積,就會產生「垃圾」信息,因此,只要迪卡爾積了,咱們首先就要想到清除「垃圾」信息 實驗準備: droptable if exists tea_stu; droptable if exists teacher; droptable if exists student; create table teacher(teaID int primary key,name varchar(50),age int); create table student(stuID int primary key,name varchar(50),age int); create table tea_stu(teaID int references teacher(teaID),stuID intreferences student(stuID)); insert into teacher values(1,'zxx',45),(2,'lhm',25) , (3,'wzg',26) , (4,'tg',27); insert into student values(1,'wy',11),(2,'dh',25) , (3,'ysq',26) , (4,'mxc',27); insert into tea_stu values(1,1), (1,2),(1,3); insert into tea_stu values(2,2), (2,3),(2,4); insert into tea_stu values(3,3), (3,4), (3,1); insert into tea_stu values(4,4), (4,1),(4,2) , (4,3); 結果:2?3,3?2,4?3 解題思路:(真實面試答題時,也要寫出每一個分析步驟,若是紙張不夠,就找別人要) 1要會統計分組信息,統計信息放在中間表中: select teaid,count(*) from tea_stu group byteaid; 2接着其實應該是篩除掉小於12歲的學生,而後再進行統計,中間表必須與student關聯才能獲得12歲如下學生和把該學生記錄從中間表中剔除,代碼是: select tea_stu.teaid,count(*) total fromstudent,tea_stu where student.stuid=tea_stu.stuid andstudent.age>12 group by tea_stu.teaid 3.接着把上面的結果作成虛表與teacher進行關聯,並篩除大於45的老師 select teacher.teaid,teacher.name,totalfrom teacher ,(select tea_stu.tea id,count(*) total from student,tea_stuwhere student.stuid=tea_stu.stuid and stu dent.age>12 group by tea_stu.teaid) astea_stu2 where teacher.teaid=tea_stu2.tea id and teacher.age<45; 7.求出發帖最多的人: select authorid,count(*) total fromarticles group by authorid having total= (select max(total2) from (select count(*)total2 from articles group by authorid) as t); select t.authorid,max(t.total) from (selectauthorid,count(*) total from articles )as t 這條語句不行,由於max只有一列,不能與其餘列混淆。 select authorid,count(*) total fromarticles group by authorid having total=max(total)也不行。 十、一個用戶表中有一個積分字段,假如數據庫中有100多萬個用戶,若要在每一年第一天凌晨將積分清零,你將考慮什麼,你將想什麼辦法解決? alter table drop column score; alter table add colunm score int; 可能會很快,可是須要試驗,試驗不能拿真實的環境來操刀,而且要注意, 這樣的操做時沒法回滾的,在個人印象中,只有inertupdate delete等DML語句才能回滾, 對於create table,droptable ,alter table等DDL語句是不能回滾。 解決方案一,update user setscore=0; 解決方案二,假設上面的代碼要執行好長時間,超出咱們的容忍範圍,那我就alter table user drop column score;alter table user add column scoreint。 下面代碼實現每一年的那個凌晨時刻進行清零。 Runnable runnable = newRunnable(){ publicvoid run(){ clearDb(); schedule(this,newDate(new Date().getYear()+1,0,0)); } }; schedule(runnable, newDate(new Date().getYear()+1,0,1)); 10、一個用戶具備多個角色,請查詢出該表中具備該用戶的全部角色的其餘用戶。 select count(*) as num,tb.id from tb, (select role from tb where id=xxx) as t1 where tb.role = t1.role and tb.id != t1.id group by tb.id having num= select count(role) from tb where id=xxx; 8. xxx公司的sql面試 Table EMPLOYEES Structure: EMPLOYEE_ID NUMBER Primary Key, FIRST_NAME VARCHAR2(25), LAST_NAME VARCHAR2(25), Salary number(8,2), HiredDate DATE, Departmentid number(2) Table Departments Structure: Departmentid number(2) Primary Key, DepartmentName VARCHAR2(25). (2)基於上述EMPLOYEES表寫出查詢:寫出僱用日期在今年的,或者工資在[1000,2000]之間的,或者員工姓名(last_name)以’Obama’打頭的全部員工,列出這些員工的所有我的信息。(4分) select * from employees where Year(hiredDate) = Year(date()) or(salary between 1000 and 200) orleft(last_name,3)='abc'; (3) 基於上述EMPLOYEES表寫出查詢:查出部門平均工資大於1800元的部門的全部員工,列出這些員工的所有我的信息。(4分) mysql> select id,name,salary,deptid didfrom employee1 where (select avg(salary) fromemployee1 where deptid = did) > 1800; (4) 基於上述EMPLOYEES表寫出查詢:查出我的工資高於其所在部門平均工資的員工,列出這些員工的所有我的信息及該員工工資高出部門平均工資百分比。(5分) selectemployee1.*,(employee1.salary-t.avgSalary)*100/employee1.salary from employee1, (selectdeptid,avg(salary) avgSalary from employee1 group by deptid) as t where employee1.deptid = t.deptid andemployee1.salary>t.avgSalary; 1、註冊Jdbc驅動程序的三種方式 1、用JDBC如何調用存儲過程 代碼以下: package com.huawei.interview.lym; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Types; public class JdbcTest { /** * @param args */ publicstatic void main(String[] args) { //TODO Auto-generated method stub Connectioncn = null; CallableStatementcstmt = null; try{ //這裏最好不要這麼幹,由於驅動名寫死在程序中了 Class.forName("com.mysql.jdbc.Driver"); //實際項目中,這裏應用DataSource數據,若是用框架, //這個數據源不須要咱們編碼建立,咱們只需Datasource ds = context.lookup() //cn= ds.getConnection(); cn=DriverManager.getConnection("jdbc:mysql:///test","root","root"); cstmt= cn.prepareCall("{call insert_Student(?,?,?)}"); cstmt.registerOutParameter(3,Types.INTEGER); cstmt.setString(1,"wangwu"); cstmt.setInt(2,25); cstmt.execute(); //get第幾個,不一樣的數據庫不同,建議不寫 System.out.println(cstmt.getString(3)); }catch (Exception e) { //TODO Auto-generated catch block e.printStackTrace(); } finally { /*try{cstmt.close();}catch(Exceptione){} try{cn.close();}catch(Exceptione){}*/ try{ if(cstmt!= null) cstmt.close(); if(cn!= null) cn.close(); }catch (SQLException e) { //TODO Auto-generated catch block e.printStackTrace(); } } } 1、JDBC中的PreparedStatement相比Statement的好處 答:一個sql命令發給服務器去執行的步驟爲:語法檢查,語義分析,編譯成內部指令,緩存指令,執行指令等過程。 select * from student where id =3----緩存--?xxxxx二進制命令 select * from student where id =3----直接取-?xxxxx二進制命令 select * from student where id =4--- -?會怎麼幹? 若是當初是select * fromstudent where id =?--- -?又會怎麼幹? 上面說的是性能提升 能夠防止sql注入。 1. 寫一個用jdbc鏈接並訪問oracle數據的程序代碼 二、Class.forName的做用?爲何要用? 答:按參數中指定的字符串形式的類名去搜索並加載相應的類,若是該類字節碼已經被加載過,則返回表明該字節碼的Class實例對象,不然,按類加載器的委託機制去搜索和加載該類,若是全部的類加載器都沒法加載到該類,則拋出ClassNotFoundException。加載完這個Class字節碼後,接着就能夠使用Class字節碼的newInstance方法去建立該類的實例對象了。 有時候,咱們程序中全部使用的具體類名在設計時(即開發時)沒法肯定,只有程序運行時才能肯定,這時候就須要使用Class.forName去動態加載該類,這個類名一般是在配置文件中配置的,例如,spring的ioc中每次依賴注入的具體類就是這樣配置的,jdbc的驅動類名一般也是經過配置文件來配置的,以便在產品交付使用後不用修改源程序就能夠更換驅動類名。 3、大數據量下的分頁解決方法。 答:最好的辦法是利用sql語句進行分頁,這樣每次查詢出的結果集中就只包含某頁的數據內容。再sql語句沒法實現分頁的狀況下,能夠考慮對大的結果集經過遊標定位方式來獲取某頁的數據。 sql語句分頁,不一樣的數據庫下的分頁方案各不同,下面是主流的三種數據庫的分頁sql: sql server: Stringsql = "selecttop " + pageSize + " * from students where id not in" + "(select top " + pageSize *(pageNumber-1) + " id from students order by id)" + "order by id"; mysql: Stringsql = "select* from students order by id limit " + pageSize*(pageNumber-1) +"," + pageSize; oracle: Stringsql = "select * from " + (select *,rownum rid from (select * fromstudents order by postime desc) where rid<=" + pagesize*pagenumber +") as t" + "where t>" +pageSize*(pageNumber-1); 4、用 JDBC 查詢學生成績單, 把主要代碼寫出來(考試機率極大). Connection cn = null; PreparedStatement pstmt =null; Resultset rs = null; try { Class.forname(driveClassName); cn= DriverManager.getConnection(url,username,password); pstmt= cn.prepareStatement(「select score.*from score ,student 「 + 「wherescore.stuId = student.id and student.name = ?」); pstmt.setString(1,studentName); Resultsetrs = pstmt.executeQuery(); while(rs.next()) { system.out.println(rs.getInt(「subject」) + 「 」 + rs.getFloat(「score」) ); } }catch(Exception e){e.printStackTrace();} finally { if(rs!= null) try{ rs.close() }catch(exception e){} if(pstmt!= null) try{pstmt.close()}catch(exception e){} if(cn!= null) try{ cn.close() }catch(exception e){} } 五、這段代碼有什麼不足之處? try { Connection conn = ...; Statement stmt = ...; ResultSet rs =stmt.executeQuery("select * from table1"); while(rs.next()) { } } catch(Exception ex) { } 答:沒有finally語句來關閉各個對象,另外,使用finally以後,要把變量的定義放在try語句塊的外面,以便在try語句塊以外的finally塊中仍能夠訪問這些變量。 3六、說出數據鏈接池的工做機制是什麼? J2EE服務器啓動時會創建必定數量的池鏈接,並一直維持很多於此數目的池鏈接。客戶端程序須要鏈接時,池驅動程序會返回一個未使用的池鏈接並將其表記爲忙。若是當前沒有空閒鏈接,池驅動程序就新建必定數量的鏈接,新建鏈接的數量有配置參數決定。當使用的池鏈接調用完成後,池驅動程序將此鏈接表記爲空閒,其餘調用就能夠使用這個鏈接。 實現方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正關鏈接,而是把它代理的Connection對象還回到鏈接池中。 四、爲何要用 ORM? 和 JDBC 有何不同? orm是一種思想,就是把object轉變成數據庫中的記錄,或者把數據庫中的記錄轉變成objecdt,咱們能夠用jdbc來實現這種思想,其實,若是咱們的項目是嚴格按照oop方式編寫的話,咱們的jdbc程序無論是有意仍是無心,就已經在實現orm的工做了。 如今有許多orm工具,它們底層調用jdbc來實現了orm工做,咱們直接使用這些工具,就省去了直接使用jdbc的繁瑣細節,提升了開發效率,如今用的較多的orm工具是hibernate。也據說一些其餘orm工具,如toplink,ojb等。 8. XML部分 一、xml有哪些解析技術?區別是什麼? 答:有DOM,SAX,STAX等 DOM:處理大型文件時其性能降低的很是厲害。這個問題是由DOM的樹結構所形成的,這種結構佔用的內存較多,並且DOM必須在解析文件以前把整個文檔裝入內存,適合對XML的隨機訪問SAX:不現於DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不須要一次所有裝載整個文件。當遇到像文件開頭,文檔結束,或者標籤開頭與標籤結束時,它會觸發一個事件,用戶經過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問 STAX:Streaming API for XML (StAX) 講解這些區別是不須要特別去比較,就像說傳智播客與其餘培訓機構的區別時,咱們只需說清楚傳智播客有什麼特色和優勢就好了,這就已經間接回答了彼此的區別。 二、你在項目中用到了xml技術的哪些方面?如何實現的? 答:用到了數據存貯,信息配置兩方面。在作數據交換平臺時,將不能數據源的數據組裝成XML文件,而後將XML文件壓縮打包加密後經過網絡傳送給接收者,接收解密與解壓縮後再同XML文件中還原相關信息進行處理。在作軟件配置時,利用XML能夠很方便的進行,軟件的各類配置參數都存貯在XML文件中。 三、用jdom解析xml文件時如何解決中文問題?如何解析? 答:看以下代碼,用編碼方式加以解決 package test; import java.io.*; public class DOMTest { private String inFile ="c:\\people.xml" private String outFile ="c:\\people.xml" public static void main(String args[]) { new DOMTest(); } public DOMTest() { try { javax.xml.parsers.DocumentBuilder builder = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder(); org.w3c.dom.Document doc =builder.newDocument(); org.w3c.dom.Element root = doc.createElement("老師"); org.w3c.dom.Element wang =doc.createElement("王"); org.w3c.dom.Element liu =doc.createElement("劉"); wang.appendChild(doc.createTextNode("我是王老師")); root.appendChild(wang); doc.appendChild(root); javax.xml.transform.Transformer transformer= javax.xml.transform.TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING,"gb2312"); transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT,"yes"); transformer.transform(newjavax.xml.transform.dom.DOMSource(doc), new javax.xml.transform.stream.StreamResult(outFile)); } catch (Exception e) { System.out.println (e.getMessage()); } } } 4、編程用JAVA解析XML的方式. 答:用SAX方式解析XML,XML文件以下: <?xml version=1.0 encoding=gb2312?> <person> <name>王小明</name> <college>信息學院</college> <telephone>6258113</telephone> <notes>男,1955年生,博士,95年調入海南大學</notes> </person> 事件回調類SAXHandler.java import java.io.*; import java.util.Hashtable; import org.xml.sax.*; public class SAXHandler extends HandlerBase { private Hashtable table = new Hashtable(); private String currentElement = null; private String currentValue = null; public void setTable(Hashtable table) { this.table = table; } public Hashtable getTable() { return table; } public void startElement(String tag,AttributeList attrs) throws SAXException { currentElement = tag; } public void characters(char[] ch, intstart, int length) throws SAXException { currentValue = new String(ch, start,length); } public void endElement(String name) throwsSAXException { if (currentElement.equals(name)) table.put(currentElement, currentValue); } } JSP內容顯示源碼,SaxXml.jsp: <HTML> <HEAD> <TITLE>剖析XML文件people.xml</TITLE> </HEAD> <BODY> <%@ page errorPage=ErrPage.jsp contentType=text/html;charset=GB2312 %> <%@ page import=java.io.* %> <%@ page import=java.util.Hashtable%> <%@ page import=org.w3c.dom.* %> <%@ page import=org.xml.sax.* %> <%@ pageimport=javax.xml.parsers.SAXParserFactory %> <%@ page import=javax.xml.parsers.SAXParser%> <%@ page import=SAXHandler %> <% File file = new File(c:\people.xml); FileReader reader = new FileReader(file); Parser parser; SAXParserFactory spf =SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); SAXHandler handler = new SAXHandler(); sp.parse(new InputSource(reader), handler); Hashtable hashTable = handler.getTable(); out.println(<TABLEBORDER=2><CAPTION>教師信息表</CAPTION>); out.println(<TR><TD>姓名</TD> + <TD> + (String)hashTable.get(new String(name)) +</TD></TR>); out.println(<TR><TD>學院</TD> + <TD> + (String)hashTable.get(newString(college))+</TD></TR>); out.println(<TR><TD>電話</TD> + <TD> + (String)hashTable.get(newString(telephone)) + </TD></TR>); out.println(<TR><TD>備註</TD> + <TD> + (String)hashTable.get(new String(notes)) +</TD></TR>); out.println(</TABLE>); %> </BODY> </HTML> 70、XML文檔定義有幾種形式?它們之間有何本質區別?解析XML文檔有哪幾種方式? a: 兩種形式 dtd schema,b: 本質區別:schema自己是xml的,能夠被XML解析器解析(這也是從DTD上發展schema的根本目的),c:有DOM,SAX,STAX等 DOM:處理大型文件時其性能降低的很是厲害。這個問題是由DOM的樹結構所形成的,這種結構佔用的內存較多,並且DOM必須在解析文件以前把整個文檔裝入內存,適合對XML的隨機訪問 SAX:不現於DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不須要一次所有裝載整個文件。當遇到像文件開頭,文檔結束,或者標籤開頭與標籤結束時,它會觸發一個事件,用戶經過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問 STAX:Streaming API for XML (StAX) 9. 流行的框架與新技術 1、談談你對Struts的理解。 答: 1. struts是一個按MVC模式設計的Web層框架,其實它就是一個大大的servlet,這個Servlet名爲ActionServlet,或是ActionServlet的子類。咱們能夠在web.xml文件中將符合某種特徵的全部請求交給這個Servlet處理,這個Servlet再參照一個配置文件(一般爲/WEB-INF/struts-config.xml)將各個請求分別分配給不一樣的action去處理。 一個擴展知識點:struts的配置文件能夠有多個,能夠按模塊配置各自的配置文件,這樣能夠防止配置文件的過分膨脹; 2. ActionServlet把請求交給action去處理以前,會將請求參數封裝成一個formbean對象(就是一個java類,這個類中的每一個屬性對應一個請求參數),封裝成一個什麼樣的formbean對象呢?看配置文件。 3.要說明的是, ActionServlet把formbean對象傳遞給action的execute方法以前,可能會調用formbean的validate方法進行校驗,只有校驗經過後纔將這個formbean對象傳遞給action的execute方法,不然,它將返回一個錯誤頁面,這個錯誤頁面由input屬性指定,(看配置文件)做者爲何將這裏命名爲input屬性,而不是error屬性,咱們後面結合實際的運行效果進行分析。 4.action執行完後要返回顯示的結果視圖,這個結果視圖是用一個ActionForward對象來表示的,actionforward對象經過struts-config.xml配置文件中的配置關聯到某個jsp頁面,由於程序中使用的是在struts-config.xml配置文件爲jsp頁面設置的邏輯名,這樣能夠實現action程序代碼與返回的jsp頁面名稱的解耦。 你對struts可能還有本身的應用方面的經驗,那也要一併說出來。 2、談談你對Hibernate的理解。 答: 1. 面向對象設計的軟件內部運行過程能夠理解成就是在不斷建立各類新對象、創建對象之間的關係,調用對象的方法來改變各個對象的狀態和對象消亡的過程,無論程序運行的過程和操做怎麼樣,本質上都是要獲得一個結果,程序上一個時刻和下一個時刻的運行結果的差別就表如今內存中的對象狀態發生了變化。 2.爲了在關機和內存空間不夠的情況下,保持程序的運行狀態,須要將內存中的對象狀態保存到持久化設備和從持久化設備中恢復出對象的狀態,一般都是保存到關係數據庫來保存大量對象信息。從Java程序的運行功能上來說,保存對象狀態的功能相比系統運行的其餘功能來講,應該是一個很不起眼的附屬功能,java採用jdbc來實現這個功能,這個不起眼的功能卻要編寫大量的代碼,而作的事情僅僅是保存對象和恢復對象,而且那些大量的jdbc代碼並無什麼技術含量,基本上是採用一套例行公事的標準代碼模板來編寫,是一種苦活和重複性的工做。 3.經過數據庫保存java程序運行時產生的對象和恢復對象,其實就是實現了java對象與關係數據庫記錄的映射關係,稱爲ORM(即Object RelationMapping),人們能夠經過封裝JDBC代碼來實現了這種功能,封裝出來的產品稱之爲ORM框架,Hibernate就是其中的一種流行ORM框架。使用Hibernate框架,不用寫JDBC代碼,僅僅是調用一個save方法,就能夠將對象保存到關係數據庫中,僅僅是調用一個get方法,就能夠從數據庫中加載出一個對象。 4.使用Hibernate的基本流程是:配置Configuration對象、產生SessionFactory、建立session對象,啓動事務,完成CRUD操做,提交事務,關閉session。 5.使用Hibernate時,先要配置hibernate.cfg.xml文件,其中配置數據庫鏈接信息和方言等,還要爲每一個實體配置相應的hbm.xml文件,hibernate.cfg.xml文件中須要登記每一個hbm.xml文件。 6.在應用Hibernate時,重點要了解Session的緩存原理,級聯,延遲加載和hql查詢。 3、AOP的做用。 3、你對Spring的理解。 1.Spring實現了工廠模式的工廠類(在這裏有必要解釋清楚什麼是工廠模式),這個類名爲BeanFactory(其實是一個接口),在程序中一般BeanFactory的子類ApplicationContext。Spring至關於一個大的工廠類,在其配置文件中經過<bean>元素配置用於建立實例對象的類名和實例對象的屬性。 2. Spring提供了對IOC良好支持,IOC是一種編程思想,是一種架構藝術,利用這種思想能夠很好地實現模塊之間的解耦。IOC也稱爲DI(Depency Injection),什麼叫依賴注入呢? 譬如,Class Programmer { Computercomputer = null; publicvoid code() { //Computercomputer = new IBMComputer(); //Computercomputer = beanfacotry.getComputer(); computer.write(); } publicvoid setComputer(Computer computer) { this.computer= computer; } } 另外兩種方式都由依賴,第一個直接依賴於目標類,第二個把依賴轉移到工廠上,第三個完全與目標和工廠解耦了。在spring的配置文件中配置片斷以下: <bean id=」computer」class=」cn.itcast.interview.Computer」> </bean> <bean id=」programmer」class=」cn.itcast.interview.Programmer」> <propertyname=」computer」 ref=」computer」></property> </bean> 3. Spring提供了對AOP技術的良好封裝, AOP稱爲面向切面編程,就是系統中有不少各不相干的類的方法,在這些衆多方法中要加入某種系統功能的代碼,例如,加入日誌,加入權限判斷,加入異常處理,這種應用稱爲AOP。實現AOP功能採用的是代理技術,客戶端程序再也不調用目標,而調用代理類,代理類與目標類對外具備相同的方法聲明,有兩種方式能夠實現相同的方法聲明,一是實現相同的接口,二是做爲目標的子類在,JDK中採用Proxy類產生動態代理的方式爲某個接口生成實現類,若是要爲某個類生成子類,則能夠用CGLI B。在生成的代理類的方法中加入系統功能和調用目標類的相應方法,系統功能的代理以Advice對象進行提供,顯然要建立出代理對象,至少須要目標類和Advice類。spring提供了這種支持,只須要在spring配置文件中配置這兩個元素便可實現代理和aop功能,例如, <bean id=」proxy」type=」org.spring.framework.aop.ProxyBeanFactory」> <propertyname=」target」 ref=」」></property> <propertyname=」advisor」 ref=」」></property> </bean> 11、談談Struts中的Action servlet。 12、Struts優缺點 優勢: 1. 實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現. 2.有豐富的tag能夠用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提升開發效率 3. 頁面導航 使系統的脈絡更加清晰。經過一個配置文件,便可把握整個系統各部分之間的聯繫,這對於後期的維護有着莫大的好處。尤爲是當另外一批開發者接手這個項目時,這種優點體現得更加明顯。 4. 提供Exception處理機制 . 5. 數據庫連接池管理 6. 支持I18N 缺點 1、 轉到展現層時,須要配置forward,若是有十個展現層的jsp,須要配置十次struts,並且還不包括有時候目錄、文件變動,須要從新修改forward,注意,每次修改配置以後,要求從新部署整個項目,而tomcate這樣的服務器,還必須從新啓動服務器 2、 2、 Struts 的Action必需是thread-safe方式,它僅僅容許一個實例去處理全部的請求。因此action用到的全部的資源都必需統一同步,這個就引發了線程安全的問題。 3、 測試不方便. Struts的每一個Action都同Web層耦合在一塊兒,這樣它的測試依賴於Web容器,單元測試也很難實現。不過有一個Junit的擴展工具Struts TestCase能夠實現它的單元測試。 4、 類型的轉換. Struts的FormBean把全部的數據都做爲String類型,它能夠使用工具Commons-Beanutils進行類型轉化。但它的轉化都是在Class級別,並且轉化的類型是不可配置的。類型轉化時的錯誤信息返回給用戶也是很是困難的。 5、 對Servlet的依賴性過強. Struts處理Action時必須要依賴ServletRequest 和ServletResponse,全部它擺脫不了Servlet容器。 6、 前端表達式語言方面.Struts集成了JSTL,因此它主要使用JSTL的表達式語言來獲取數據。但是JSTL的表達式語言在Collection和索引屬性方面處理顯得很弱。 7、 對Action執行的控制困難. Struts建立一個Action,若是想控制它的執行順序將會很是困難。甚至你要從新去寫Servlet來實現你的這個功能需求。 8、 對Action 執行前和後的處理. Struts處理Action的時候是基於class的hierarchies,很難在action處理前和後進行操做。 9、 對事件支持不夠. 在struts中,實際是一個表單Form對應一個Action類(或DispatchAction),換一句話說:在Struts中實際是一個表單只能 對應一個事件,struts這種事件方式稱爲applicationevent,application event和component event相比是一種粗粒度的事件 119、STRUTS的應用(如STRUTS架構) Struts是採用Java Servlet/JavaServer Pages技術,開發Web應用程序的開放源碼的framework。採用Struts能開發出基於MVC(Model-View-Controller)設計模式的應用構架。 Struts有以下的主要功能: 一.包含一個controller servlet,能將用戶的請求發送到相應的Action對象。 二.JSP自由tag庫,而且在controller servlet中提供關聯支持,幫助開發員建立交互式表單應用。 三.提供了一系列實用對象:XML處理、經過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息。 110、說說struts1與struts2的區別。 1.都是MVC的WEB框架, 2 struts1的老牌框架,應用很普遍,有很好的羣衆基礎,使用它開發風險很小,成本更低!struts2雖然基於這個框架,可是應用羣衆並多,相對不成熟,未知的風險和變化不少,開發人員相對很差招,使用它開發項目的風險係數更大,用人成本更高! 3.struts2畢竟是站在前輩的基礎設計出來,它會改善和完善struts1中的一些缺陷,struts1中一些懸而未決問題在struts2獲得瞭解決。 4.struts1的前端控制器是一個Servlet,名稱爲ActionServlet,struts2的前端控制器是一個filter,在struts2.0中叫FilterDispatcher,在struts2.1中叫StrutsPrepareAndExecuteFilter。 5.struts1的action須要繼承Action類,struts2的action能夠不繼承任何類;struts1對同一個路徑的全部請求共享一個Action實例,struts2對同一個路徑的每一個請求分別使用一個獨立Action實例對象,全部對於struts2的Action不用考慮線程安全問題。 6.在struts1中使用formbean封裝請求參數,在struts2中直接使用action的屬性來封裝請求參數。 7.struts1中的多個業務方法放在一個Action中時(即繼承DispatchAction時),要麼都校驗,要麼都不校驗;對於struts2,能夠指定只對某個方法進行校驗,當一個Action繼承了ActionSupport且在這個類中只編寫了validateXxx()方法,那麼則只對Xxx()方法進行校驗。 (一個請求來了的執行流程進行分析,struts2是自動支持分模塊開發,並能夠不一樣模塊設置不一樣的url前綴,這是經過package的namespace來實現的;struts2是支持多種類型的視圖;struts2的視圖地址能夠是動態的,即視圖的名稱是支持變量方式的,舉例,論壇發帖失敗後回來還要傳遞boardid。視圖內容顯示方面:它的標籤用ognl,要el強大不少,在國際化方面支持分模塊管理,兩個模塊用到一樣的key,對應不一樣的消息;) 與Struts1不一樣,Struts2對用戶的每一次請求都會建立一個Action,因此Struts2中的Action是線程安全的。 給我印象最深入的是:struts配置文件中的redirect視圖的url不能接受參數,而struts2配置文件中的redirect視圖能夠接受參數。 110、hibernate中的update()和saveOrUpdate()的區別,session的load()和get()的區別。 1十、簡述 Hibernate 和 JDBC 的優缺點? 如何書寫一個 one to many 配置文件. 七、iBatis與Hibernate有什麼不一樣? 相同點:屏蔽jdbc api的底層訪問細節,使用咱們不用與jdbc api打交道,就能夠訪問數據。 jdbc api編程流程固定,還將sql語句與java代碼混雜在了一塊兒,常常須要拼湊sql語句,細節很繁瑣。 ibatis的好處:屏蔽jdbc api的底層訪問細節;將sql語句與java代碼進行分離;提供了將結果集自動封裝稱爲實體對象和對象的集合的功能,queryForList返回對象集合,用queryForObject返回單個對象;提供了自動將實體對象的屬性傳遞給sql語句的參數。 Hibernate是一個全自動的orm映射工具,它能夠自動生成sql語句,ibatis須要咱們本身在xml配置文件中寫sql語句,hibernate要比ibatis功能負責和強大不少。由於hibernate自動生成sql語句,咱們沒法控制該語句,咱們就沒法去寫特定的高效率的sql。對於一些不太複雜的sql查詢,hibernate能夠很好幫咱們完成,可是,對於特別複雜的查詢,hibernate就很難適應了,這時候用ibatis就是不錯的選擇,由於ibatis仍是由咱們本身寫sql語句。 七、寫Hibernate的一對多和多對一雙向關聯的orm配置? 九、hibernate的inverse屬性的做用? 解決方案一,按照Object[]數據取出數據,而後本身組bean 解決方案二,對每一個表的bean寫構造函數,好比表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1filed1,type2 field2) ,而後在hql裏面就能夠直接生成這個bean了。 十、在DAO中如何體現DAO設計模式? 解決方案一,按照Object[]數據取出數據,而後本身組bean 解決方案二,對每一個表的bean寫構造函數,好比表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1filed1,type2 field2) ,而後在hql裏面就能夠直接生成這個bean了。 十、spring+Hibernate中委託方案怎麼配置? 解決方案一,按照Object[]數據取出數據,而後本身組bean 解決方案二,對每一個表的bean寫構造函數,好比表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1filed1,type2 field2) ,而後在hql裏面就能夠直接生成這個bean了。 十、spring+Hibernate中委託方案怎麼配置? 解決方案一,按照Object[]數據取出數據,而後本身組bean 解決方案二,對每一個表的bean寫構造函數,好比表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1filed1,type2 field2) ,而後在hql裏面就能夠直接生成這個bean了。 8. hibernate進行多表查詢每一個表中各取幾個字段,也就是說查詢出來的結果集沒有一個實體類與之對應如何解決; 解決方案一,按照Object[]數據取出數據,而後本身組bean 解決方案二,對每一個表的bean寫構造函數,好比表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1filed1,type2 field2) ,而後在hql裏面就能夠直接生成這個bean了。 8.介紹一下Hibernate的二級緩存 按照如下思路來回答:(1)首先說清楚什麼是緩存,(2)再說有了hibernate的Session就是一級緩存,即有了一級緩存,爲何還要有二級緩存,(3)最後再說如何配置Hibernate的二級緩存。 (1)緩存就是把之前從數據庫中查詢出來和使用過的對象保存在內存中(一個數據結構中),這個數據結構一般是或相似Hashmap,當之後要使用某個對象時,先查詢緩存中是否有這個對象,若是有則使用緩存中的對象,若是沒有則去查詢數據庫,並將查詢出來的對象保存在緩存中,以便下次使用。下面是緩存的僞代碼: 引出hibernate的第二級緩存,用下面的僞代碼分析了Cache的實現原理 Dao { hashmapmap = new map(); UsergetUser(integer id) { Useruser = map.get(id) if(user== null) { user= session.get(id); map.put(id,user); } returnuser; } } Dao { Cachecache = null setCache(Cachecache) { this.cache= cache } UsergetUser(int id) { if(cache!=null) { Useruser = cache.get(id); if(user==null) { user= session.get(id); cache.put(id,user); } returnuser; } returnsession.get(id); } } (2)Hibernate的Session就是一種緩存,咱們一般將之稱爲Hibernate的一級緩存,當想使用session從數據庫中查詢出一個對象時,Session也是先從本身內部查看是否存在這個對象,存在則直接返回,不存在纔去訪問數據庫,並將查詢的結果保存在本身內部。因爲Session表明一次會話過程,一個Session與一個數據庫鏈接相關連,因此Session最好不要長時間保持打開,一般僅用於一個事務當中,在事務結束時就應關閉。而且Session是線程不安全的,被多個線程共享時容易出現問題。一般只有那種全局意義上的緩存纔是真正的緩存應用,纔有較大的緩存價值,所以,Hibernate的Session這一級緩存的緩存做用並不明顯,應用價值不大。Hibernate的二級緩存就是要爲Hibernate配置一種全局緩存,讓多個線程和多個事務均可以共享這個緩存。咱們但願的是一我的使用過,其餘人也能夠使用,session沒有這種效果。 (3)二級緩存是獨立於Hibernate的軟件部件,屬於第三方的產品,多個廠商和組織都提供有緩存產品,例如,EHCache和OSCache等等。在Hibernate中使用二級緩存,首先就要在hibernate.cfg.xml配置文件中配置使用哪一個廠家的緩存產品,接着須要配置該緩存產品本身的配置文件,最後要配置Hibernate中的哪些實體對象要歸入到二級緩存的管理中。明白了二級緩存原理和有了這個思路後,很容易配置起Hibernate的二級緩存。擴展知識:一個SessionFactory能夠關聯一個二級緩存,也即一個二級緩存只能負責緩存一個數據庫中的數據,當使用Hibernate 的二級緩存後,注意不要有其餘的應用或SessionFactory來更改當前數據庫中的數據,這樣緩存的數據就會與數據庫中的實際數據不一致。 1十一、Spring 的依賴注入是什麼意思? 給一個 Bean 的 message 屬性, 字符串類型, 注入值爲 "Hello" 的 XML 配置文件該怎麼寫? 120、Jdo是什麼? JDO是Java對象持久化的新的規範,爲java dataobject的簡稱,也是一個用於存取某種數據倉庫中的對象的標準化API。JDO提供了透明的對象存儲,所以對開發人員來講,存儲數據對象徹底不須要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工做已經轉移到JDO產品提供商身上,使開發人員解脫出來,從而集中時間和精力在業務邏輯上。另外,JDO很靈活,由於它能夠在任何數據底層上運行。JDBC只是面向關係數據庫(RDBMS)JDO更通用,提供到任何數據底層的存儲功能,好比關係數據庫、文件、XML以及對象數據庫(ODBMS)等等,使得應用可移植性更強。 什麼是spring的IOC AOP STRUTS的工做流程! spring 與EJB的區別!! Hibernate工做原理及爲何要用? 原理: 1.讀取並解析配置文件 2.讀取並解析映射信息,建立SessionFactory 3.打開Sesssion 4.建立事務Transation 5.持久化操做 6.提交事務 7.關閉Session 8.關閉SesstionFactory 爲何要用: 1. 對JDBC訪問數據庫的代碼作了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。 2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工做 3. hibernate使用Java反射機制,而不是字節碼加強程序來實現透明性。 4. hibernate的性能很是好,由於它是個輕量級框架。映射的靈活性很出色。它支持各類關係數據庫,從一對一到多對多的各類複雜關係。 2. Hibernate是如何延遲加載? 1. Hibernate2延遲加載實現:a)實體對象 b)集合(Collection) 2. Hibernate3 提供了屬性的延遲加載功能 當Hibernate在查詢數據的時候,數據並無存在與內存中,當程序真正對數據的操做時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提升了服務器的性能。 3.Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係) 類與類之間的關係主要體如今表與表之間的關係進行操做,它們都市對對象進行操做,咱們程序中把全部的表與類都映射在一塊兒,它們經過配置文件中的many-to-one、one-to-many、many-to-many、 4. 說下Hibernate的緩存機制 1. 內部緩存存在Hibernate中又叫一級緩存,屬於應用事物級緩存 2. 二級緩存: a) 應用及緩存 b) 分佈式緩存 條件:數據不會被第三方修改、數據大小在可接受範圍、數據更新頻率低、同一數據被系統頻繁使用、非關鍵數據 c) 第三方緩存的實現 5. Hibernate的查詢方式 Sql、Criteria,object comptosition Hql: 1、 屬性查詢 2、 參數查詢、命名參數查詢 3、 關聯查詢 4、 分頁查詢 5、 統計函數 6. 如何優化Hibernate? 1.使用雙向一對多關聯,不使用單向一對多 2.靈活使用單向一對多關聯 3.不用一對一,用多對一取代 4.配置對象緩存,不使用集合緩存 5.一對多集合使用Bag,多對多集合使用Set 6. 繼承類使用顯式多態 7. 表字段要少,表關聯不要怕多,有二級緩存撐腰 7. 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.視圖對象負責渲染返回給客戶端。 爲何用: {AOP 讓開發人員能夠建立非行爲性的關注點,稱爲橫切關注點,並將它們插入到應用程序代碼中。使用 AOP 後,公共服務 (好比日誌、持久性、事務等)就能夠分解成方面並應用到域對象上,同時不會增長域對象的對象模型的複雜性。 IOC 容許建立一個能夠構造對象的應用環境,而後向這些對象傳遞它們的協做對象。正如單詞倒置 所代表的,IOC 就像反過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straightconstruction),每個對象都是用其協做對象構造的。所以是由容器管理協做對象(collaborator)。 Spring即便一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助於您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協做對象)。而後能夠很容易地在須要時替換具備相似接口的協做對象。} Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。Spring 模塊構建在覈心容器之上,核心容器定義了建立、配置和管理 bean 的方式,如圖 1 所示。 組成 Spring 框架的每一個模塊(或組件)均可以單獨存在,或者與其餘一個或多個模塊聯合實現。每一個模塊的功能以下: ☆ 核心容器:核心容器提供Spring 框架的基本功能。核心容器的主要組件是BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉(IOC)模式將應用程序的配置和依賴性規範與實際的應用程序代碼分開。 ☆ Spring 上下文:Spring 上下文是一個配置文件,向Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。 ☆ Spring AOP:經過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。因此,能夠很容易地使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 服務器中,大多數功能也適用於不受管理的環境。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 組件一塊兒使用。這個包一般不是由用戶直接使用,而是由服務器將其用做其餘多數功能的底層中介。下一個最高級抽象是 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(newFileInputSteam("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 booleangetUserCreditHistoryInformation(ICustomer iCustomer); } 清單 3 所示的信用級別評定接口提供了信用歷史信息。它須要一個包含客戶信息的 Customer 對象。該接口的實現是由CreditRating 類提供的。 清單 4.CreditLinkingInterface public interface CreditLinkingInterface { public String getUrl(); public void setUrl(String url); public void linkCreditBankAccount() throwsException ; } 信用連接接口將信用歷史信息與銀行信息(若是須要的話)鏈接在一塊兒,並插入用戶的信用卡信息。信用連接接口是一個遠程服務,它的查詢是經過 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); 10. 軟件工程與設計模式 111、UML方面 標準建模語言UML。用例圖,靜態圖(包括類圖、對象圖和包圖),行爲圖,交互圖(順序圖,合做圖),實現圖。 112. 軟件開發的 92、j2ee經常使用的設計模式?說明工廠模式。 總共23種,分爲三大類:建立型,結構型,行爲型 我只記得其中經常使用的六、7種,分別是: 建立型(工廠、工廠方法、抽象工廠、單例) 結構型(包裝、適配器,組合,代理) 行爲(觀察者,模版,策略) 而後再針對你熟悉的模式談談你的理解便可。 Java中的23種設計模式: Factory(工廠模式), Builder(建造模式), Factory Method(工廠方法模式), Prototype(原始模型模式),Singleton(單例模式), Facade(門面模式), Adapter(適配器模式), Bridge(橋樑模式), Composite(合成模式), Decorator(裝飾模式), Flyweight(享元模式), Proxy(代理模式), Command(命令模式), Interpreter(解釋器模式), Visitor(訪問者模式), Iterator(迭代子模式), Mediator(調停者模式), Memento(備忘錄模式), Observer(觀察者模式), State(狀態模式), Strategy(策略模式), Template Method(模板方法模式), Chain Of Responsibleity(責任鏈模式) 工廠模式:工廠模式是一種常常被使用到的模式,根據工廠模式實現的類能夠根據提供的數據生成一組類中某一個類的實例,一般這一組類有一個公共的抽象父類而且實現了相同的方法,可是這些方法針對不一樣的數據進行了不一樣的操做。首先須要定義一個基類,該類的子類經過不一樣的方法實現了基類中的方法。而後須要定義一個工廠類,工廠類能夠根據條件生成不一樣的子類實例。當獲得子類的實例後,開發人員能夠調用基類中的方法而沒必要考慮到底返回的是哪個子類的實例。 11三、開發中都用到了那些設計模式?用在什麼場合? 每一個模式都描述了一個在咱們的環境中不斷出現的問題,而後描述了該問題的解決方案的核心。經過這種方式,你能夠無數次地使用那些已有的解決方案,無需在重複相同的工做。主要用到了MVC的設計模式。用來開發JSP/Servlet或者J2EE的相關應用。簡單工廠模式等。 11. j2ee部分 117、BS與CS的聯繫與區別。 C/S是Client/Server的縮寫。服務器一般採用高性能的PC、工做站或小型機,並採用大型數據庫系統,如Oracle、Sybase、InFORMix或 SQL Server。客戶端須要安裝專用的客戶端軟件。 B/S是Brower/Server的縮寫,客戶機上只要安裝一個瀏覽器(Browser),如NetscapeNavigator或Internet Explorer,服務器安裝Oracle、Sybase、InFORMix或 SQL Server等數據庫。在這種結構下,用戶界面徹底經過WWW瀏覽器實現,一部分事務邏輯在前端實現,可是主要事務邏輯在服務器端實現。瀏覽器經過Web Server 同數據庫進行數據交互。 C/S 與 B/S 區別: 1.硬件環境不一樣: C/S 通常創建在專用的網絡上, 小範圍裏的網絡環境, 局域網之間再經過專門服務器提供鏈接和數據交換服務. B/S 創建在廣域網之上的, 沒必要是專門的網絡硬件環境,例與電話上網, 租用設備. 信息本身管理. 有比C/S更強的適應範圍, 通常只要有操做系統和瀏覽器就行 2.對安全要求不一樣 C/S 通常面向相對固定的用戶羣, 對信息安全的控制能力很強. 通常高度機密的信息系統採用C/S 結構適宜. 能夠經過B/S發佈部分可公開信息. B/S 創建在廣域網之上, 對安全的控制能力相對弱, 可能面向不可知的用戶。 3.對程序架構不一樣 C/S 程序能夠更加註重流程, 能夠對權限多層次校驗, 對系統運行速度能夠較少考慮. B/S 對安全以及訪問速度的多重的考慮, 創建在須要更加優化的基礎之上. 比C/S有更高的要求 B/S結構的程序架構是發展的趨勢, 從MS的.Net系列的BizTalk 2000 Exchange2000等, 全面支持網絡的構件搭建的系統. SUN 和IBM推的JavaBean 構件技術等,使 B/S更加成熟. 4.軟件重用不一樣 C/S 程序能夠不可避免的總體性考慮, 構件的重用性不如在B/S要求下的構件的重用性好. B/S 對的多重結構,要求構件相對獨立的功能. 可以相對較好的重用.就入買來的餐桌能夠再利用,而不是作在牆上的石頭桌子 5.系統維護不一樣 C/S 程序因爲總體性, 必須總體考察, 處理出現的問題以及系統升級. 升級難. 多是再作一個全新的系統 B/S 構件組成,方面構件個別的更換,實現系統的無縫升級. 系統維護開銷減到最小.用戶從網上本身下載安裝就能夠實現升級. 6.處理問題不一樣 C/S 程序能夠處理用戶面固定, 而且在相同區域, 安全要求高需求, 與操做系統相關. 應該都是相同的系統 B/S 創建在廣域網上, 面向不一樣的用戶羣, 分散地域, 這是C/S沒法做到的. 與操做系統平臺關係最小. 7.用戶接口不一樣 C/S 可能是創建的Window平臺上,表現方法有限,對程序員廣泛要求較高 B/S 創建在瀏覽器上, 有更加豐富和生動的表現方式與用戶交流. 而且大部分難度減低,減低開發成本. 8.信息流不一樣 C/S 程序通常是典型的中央集權的機械式處理, 交互性相對低 B/S 信息流向可變化, B-B B-C B-G等信息、流向的變化, 更像交易中心。 2、應用服務器與WEB SERVER的區別? 應用服務器:Weblogic、Tomcat、Jboss WEB SERVER:IIS、 Apache 32、應用服務器有那些? BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application Server,jBoss,Tomcat 3、J2EE是什麼? 答:Je22是Sun公司提出的多層(multi-diered),分佈式(distributed),基於組件(component-base)的企業級應用模型(enterpriese application model).在這樣的一個應用系統中,可按照功能劃分爲不一樣的組件,這些組件又可在不一樣計算機上,而且處於相應的層次(tier)中。所屬層次包括客戶層(clietn tier)組件,web層和組件,Business層和組件,企業信息系統(EIS)層。 一個另類的回答:j2ee就是增刪改查。 67、J2EE是技術仍是平臺仍是框架? 什麼是J2EE J2EE自己是一個標準,一個爲企業分佈式應用的開發提供的標準平臺。 J2EE也是一個框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技術。 95、請對如下在J2EE中經常使用的名詞進行解釋(或簡單描述) web容器:給處於其中的應用程序組件(JSP,SERVLET)提供一個環境,使JSP,SERVLET直接更容器中的環境變量接口交互,沒必要關注其它系統問題。主要有WEB服務器來實現。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。該容器提供的接口嚴格遵照J2EE規範中的WEB APPLICATION 標準。咱們把遵照以上標準的WEB服務器就叫作J2EE中的WEB容器。 EJB容器:Enterprise java bean 容器。更具備行業領域特點。他提供給運行在其中的組件EJB各類管理功能。只要知足J2EE規範的EJB放入該容器,立刻就會被容器進行高效率的管理。而且能夠經過現成的接口來得到系統級別的服務。例如郵件服務、事務管理。 JNDI:(Java Naming & Directory Interface)JAVA命名目錄服務。主要提供的功能是:提供一個目錄系統,讓其它各地的應用程序在其上面留下本身的索引,從而知足快速查找和定位分佈式應用程序的功能。 JMS:(Java Message Service)JAVA消息服務。主要實現各個應用程序之間的通信。包括點對點和廣播。 JTA:(Java Transaction API)JAVA事務服務。提供各類分佈式事務服務。應用程序只需調用其提供的接口便可。 JAF:(Java Action FrameWork)JAVA安全認證框架。提供一些安全控制方面的框架。讓開發者經過各類部署和自定義實現本身的個性安全控制策略。 RMI/IIOP:(Remote Method Invocation /internet對象請求中介協議)他們主要用於經過遠程調用服務。例如,遠程有一臺計算機上運行一個程序,它提供股票分析服務,咱們能夠在本地計算機上實現對其直接調用。固然這是要經過必定的規範才能在異構的系統之間進行通訊。RMI是JAVA特有的。