題目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>