SSH面試題總結:
題目1:Hibernate工作原理及為什么要用?
原理:
hibernate,通過對jdbc進行封裝,對 java類和 關系數據庫進行mapping,實現了對關系數據庫的面向對象方式的操作,改變了傳統的jdbc + sql操作數據的方式,從而使開發人員可以話更多精力進行對象方面的開發
1.讀取並解析配置文件
2.讀取並解析映射信息,創建SessionFactory
3.打開Sesssion
4.創建事務Transation
5.持久化操作
6.提交事務
7.關閉Session
8.關閉SesstionFactory
為什么要用:
1. 對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。
2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作
3. hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。
題目2: 什么是Hibernate延遲加載?
延遲加載機制是為了避免一些無謂的性能開銷而提出來的,所謂延遲加載就是當在真正需要數據的時候,才真正執行數據加載操作。在Hibernate中提供了對實體對象的延遲加載以及對集合的延遲加載,另外在Hibernate3中還提供了對屬性的延遲加載。
題目3:Hibernate中類之間的關聯關系有幾種?(如:一對多、多對多的關系)
many-to-one、one-to-many、many-to-many、 one-to-one
題目4: 說下Hibernate的緩存機制
一、hibernate一級緩存
(1)hibernate支持兩個級別的緩存,默認只支持一級緩存;
(2)每個Session內部自帶一個一級緩存;
(3)某個Session被關閉時,其對應的一級緩存自動清除;
二、hibernate二級緩存
(1) 二級緩存獨立於session,默認不開啟;
題目5: Hibernate的查詢方式
本地SQL查詢、Criteria、Hql
題目6: 如何優化Hibernate?
1.使用雙向一對多關聯,不使用單向一對多
2.不用一對一,用多對一取代
3.配置對象緩存,不使用集合緩存
題目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組件生成動態網頁,返回給客戶;
為什么要用:
1. JSP、Servlet、JavaBean技術的出現給我們構建強大的企業應用系統提供了可能。但用這些技術構建的系統非常的繁亂。
2. 基於Struts開發的應用:
不用再考慮公共問題
專心在業務實現上
結構統一,易於學習、維護
新手也可寫出好程序
題目10:為什么要用spring?
Spring是一個輕量級的IOC和AOP框架。
IOC(控制反轉)意味着將你設計好的類交給系統去控制,而不是在你的類內部控制。這稱為控制反轉
AOP(面向切面),它將那些影響多個類的行為封裝到可重用的模塊中,面向對象是把問題從同類事物中抽象出來,面向切面是把問題從不同類問題中抽象出來。
1. hibernate中get()與load()區別
請注意如果沒有匹配的數據庫記錄,load()方法可能拋出無法恢復的異常(unrecoverable exception)。 如果類的映射使用了代理(proxy),load()方法會返回一個未初始化的代理,直到你調用該代理的某方法時才會去訪問數據庫。 若你希望在某對象中創建一個指向另一個對象的關聯,又不想在從數據庫中裝載該對象時同時裝載相關聯的那個對象,那么這種操作方式就用得上的了。 如果為相應類映射關系設置了batch-size, 那么使用這種操作方式允許多個對象被一批裝載(因為返回的是代理,無需從數據庫中抓取所有對象的數據)。 如果你不確定是否有匹配的行存在,應該使用get()方法,它會立刻訪問數據庫,如果沒有對應的行,會返回null。
17. [Hibernate題目]判斷題:使用save/persist一個對象時,便立即向數據庫發送執行insert sql語句?
1) persist把一個瞬態的實例持久化,但是並"不保證"標識符被立刻填入到持久化實例中,標識符的填入可能被推遲到flush的時間。
2) persist"保證"當它在一個transaction外部被調用的時候並不觸發一個Sql Insert,這個功能是很有用的。
3) save會立即執行Sql insert,不管是不是在transaction內部還是外部.
18.[Hibernate題目]:指出一下代碼哪里錯誤使用了Hibernate。
背景簡介:Board是一個實體類,id是它的主鍵,name和description是他的兩個屬性。BoardDao是Board實體的數據訪問對象,BoardBo是業務對象,用戶提交變更Board對象的請求,由Struts的BoardAction接收,調用BoardBo處理。HibernateUtil.currentSession()用於返回當前請求的Session對象。
1. //數據訪問層代碼:BoardDao.java
2. public Board loadBoard(Long id) {
3. Session session = HibernateUtil.currentSession();
4. return session.load(Board.class, id);
5. }
6. public void updateBoard(Board board) {
7. Session session = HibernateUtil.currentSession();
8. session.update(board);
9. }
10.
11. //業務對象層代碼:BoardBo.java
12. private BoardDao boardDao;
13. public void updateBoard(Long id, String name, String description) {
14. Board board = boardDao.loadBoard(id);
15. board.setName(name);
16. board.setDescription(description);
17. boardDao.updateBoard(board);
18. }
19.
20. //Web控制器代碼:BoardAction.java
21. private BoardBo BoardBo;
22. public ActionForward execute(
23. ActionMapping mapping,
24. ActionForm form,
25. HttpServletRequest request,
26. HttpServletResponse response) throws Exception {
27. String id = request.getParameter("id");
28. String name = request.getParameter("name");
29. String description = request.getParameter("description");
30. boardBo.updateBoard(id, name, description);
31. return mapping.findForward("update-success");
32. }
6. public void updateBoard(Board board) {
7. Session session = HibernateUtil.currentSession();
Transaction t=session.beginTransaction();
8. session.update(board);
t.commit();
9. }
簡單敘述一下Spring中BeanFactory與ApplicationContext的差別
使用BeanFactory從xml配置文件加載bean:
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
public class XmlConfigWithBeanFactory {
public static void main(String[] args) {
XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource(
"build/beans.xml"));
}
}
使用ApplicationConText從xml配置文件加載bean:
public class XmlConfigWithApplication{
public static void main(String[] args){
ApplicationContext application = new ClassPathXmlApplicationContext(beans.xml"));
application.getBean("BeanName");
}
}
簡而言之,BeanFactory提供了配置框架和基本的功能, 而 ApplicationContext為它增加了更強的功能,這些功能中的一些或許更加接近J2EE並且圍繞企業級應用。一般來說,ApplicationContext是 BeanFactory的完全超集, 任何BeanFactory功能和行為的描述也同樣被認為適用於ApplicationContext
相對於BeanFactory而言,ApplicationContext 提供了以下擴展功能.
(a) 國際化支持 (b) 資源訪問
(c) 事件傳播 (d) 多實例加載
2. 寫一段程序,使用springAPI讀取classpath下的一個xml文件,並解析
(1)Resource resource=new ClassPathResource("appcontext.xml");
BeanFactory factory=new XmlBeanFactory(resource);
(2)ClassPathXmlApplicationContext appcontext=new ClassPathXmlApplicationContext("appcontext.xml");
BeanFactory factory=(BeanFactory)appcontext;
4. 說說在hibernate中使用Integer做映射和使用int做映射之間有什么差別
Integer code和int code;的區別:
Integer是對象. code = null; 對象可以為空.
int 是普通類型, 不可能 = null.
根據你的數據庫code是可以空的, 故應該映射成Integer.
你沒理由hbm.xml里寫Integer, 類里卻寫int
(1)使用Spring如何簡化了Hibernate編碼?
通過org.springframework.orm.hibernate3.support.HibernateDaoSupport類支持數據庫操作,且封裝了事務.
public class AccountDAO extends HibernateDaoSupport implements IAccountDAO{
(2)Spring如何與Struts集成?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<form-beans >
<form-bean name="regForm" type="demo.form.RegForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="regForm"
name="regForm"
path="/reg"
scope="request"
type="org.springframework.web.struts.DelegatingActionProxy">
<forward name="ok" path="/ok.jsp" />
</action>
</action-mappings>
<message-resources parameter="demo.ApplicationResources" />
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml" />
</plug-in>
</struts-config>
(3)如何使用Spring2.0實現聲明式事務?
<!--通用事務管理器-->
<bean id="TransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--聲明一個通知,用以指出要管理哪些事務方法及如何管理-->
<tx:advice id="txAdvice" transaction-manager="TransactionManager">
<tx:attributes>
<!-- 對get/load/search開頭的方法要求只讀事務 -->
<tx:method name="get*" propagation="SUPPORTS"
read-only="true" />
<tx:method name="load*" propagation="SUPPORTS"
read-only="true" />
<tx:method name="search*" propagation="SUPPORTS"
read-only="true" />
<!-- 對其它方法要求事務 -->
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!--聲明一個config,用以將通知和目標業務類關聯起來-->
<aop:config>
<!-- 添加事務支持,因為前面配置的transactionManager是專對Hibernate的事務管理器-->
<aop:pointcut id="bizMethods" expression="execution(* demo.*.*(..))" />
<!-- 織入 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods" />
</aop:config>
(4)依賴注入的好處是?
程序可擴展性更強;
利於並行開發;
(5)Spring怎么實現依賴注入?
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="userdao" class="demo.dao.UserDAO"/>
<bean id="usermanager" class="demo.biz.UserManager">
<property name="userdao" ref="userdao"/>
</bean>
</beans>
(6)“面向方面編程”的好處是?
將程序中涉及的公共問題集中解決
(7)和SQL相比,HQL有哪些特點?
HQL是面向對象的查詢語言。select Fw表示查詢Fw對象
(8)如何配置單向多對一關聯?
<class name="Jd" table="TBL_JD">
<id name="jdid" column="jdid" type="long">
<generator class="identity" />
</id>
<property name="jdname" column="jd" type="string" />
<many-to-one name="qx" class="Qx" column="qxid" />
</class>
(9)如何配置單向一對多關聯?
<class name="Qx" table="TBL_QX">
<id name="qxid" column="qxid" type="long">
<generator class="native" />
</id>
<property name="qxname" column="qx" type="string" />
<set name="jds" >
<key column="qxid" />
<one-to-many class="Jd" />
</set>
</class>
(10)如何配置雙向一對多關聯?
<class name="Jd" table="TBL_JD">
<id name="jdid" column="jdid" type="long">
<generator class="identity" />
</id>
<property name="jdname" column="jd" type="string" />
<many-to-one name="qx" class="Qx" column="qxid" />
</class>
<class name="Qx" table="TBL_QX">
<id name="qxid" column="qxid" type="long">
<generator class="native" />
</id>
<property name="qxname" column="qx" type="string" />
<set name="jds" >
<key column="qxid" />
<one-to-many class="Jd" />
</set>
</class>