ssh面試題總結


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. hibernateget()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是它的主鍵,namedescription是他的兩個屬性。BoardDaoBoard實體的數據訪問對象,BoardBo是業務對象,用戶提交變更Board對象的請求,由StrutsBoardAction接收,調用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.    }   

 

簡單敘述一下SpringBeanFactoryApplicationContext的差別

使用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   codeint   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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM