框架總結(jié)

(一)Spring本身

Spring的理解?

【Spring是一個(gè)輕量級(jí)的IoC和AOP容器框架,Java企業(yè)級(jí)應(yīng)用的開(kāi)源開(kāi)發(fā)框架,主要用于開(kāi)發(fā)Java應(yīng)用。目的是解決企業(yè)應(yīng)用開(kāi)發(fā)的復(fù)雜性,2004年發(fā)布】

是一個(gè)三層的架構(gòu),為J2EE提供集成框架:【web層:SpringMVC;業(yè)務(wù)層:spring的IOC;持久層:spring的JDBC、ORM等框架】

Spring優(yōu)點(diǎn)?

1、輕量級(jí)容器框架

2、(Spring的IOC容器)降低組件間的耦合性。

3、Spring提供了眾多輔助類(如JDBC Template等)

4、Spring對(duì)主流框架提供了支持(如SpringMVC、Mybatis、Hibernate)

5、獨(dú)立于各種應(yīng)用服務(wù)器

6、Spring的高度開(kāi)放性,并不強(qiáng)制應(yīng)用完全依賴于Spring,可自由選用Spring框架的部分或全部。

7、提供了對(duì)多種技術(shù)的支持(如單元測(cè)試、JMS...)


Spring適用的范圍:

1、構(gòu)建企業(yè)應(yīng)用:SSH/SSM

2、單獨(dú)使用bean容器(在spring中的對(duì)象都稱作bean,spring可單獨(dú)做對(duì)象Bean的管理)

3、單獨(dú)使用aop作為切面處理

4、自由選用spring的其他功能,如對(duì)消息的支持等



Spring框架的2個(gè)核心功能:

1、負(fù)責(zé)創(chuàng)建、管理所有Java對(duì)象,這些java對(duì)象稱為Bean

2、用依賴注入(DI)的方式處理容器中Bean之間的依賴關(guān)系。


(二)Spring IOC 和 DI

對(duì)Spring IOC和DI的理解,有什么區(qū)別?

DI和IOC是同件事情的不同描述

【依賴注入(DI):從應(yīng)用程序角度,應(yīng)用程序依賴容器創(chuàng)建并注入它所需的外部資源。即指Spring創(chuàng)建對(duì)象的過(guò)程中,將對(duì)象依賴屬性通過(guò)配置進(jìn)行注入;

控制反轉(zhuǎn)(IOC):從容器角度,容器控制應(yīng)用程序,由容器反向地向應(yīng)用程序注入應(yīng)用程序所需的外部資源。即IoC 控制反轉(zhuǎn),指將對(duì)象的創(chuàng)建權(quán),反轉(zhuǎn)到Spring容器 】


DI(依賴注入):Spring的核心機(jī)制

優(yōu)點(diǎn):減少耦合,獨(dú)立開(kāi)發(fā)組件,DI提供使用接口編程

DI依賴注入不能使組件之間相互依賴,相互制約,目的是減少組件之間的耦合度,使開(kāi)發(fā)變得簡(jiǎn)單。

DI強(qiáng)調(diào)的是“實(shí)現(xiàn)”。

DI有兩種:(1)設(shè)值注入:IOC容器使用成員變量的setter方法來(lái)注入被依賴對(duì)象,通過(guò)<property.../>元素驅(qū)動(dòng)spring執(zhí)行setter方法;

例如:一個(gè)接口Axe,有方法chop();一個(gè)接口Person,有方法useAxe();實(shí)現(xiàn)類Person實(shí)現(xiàn)Person,則類中可以有Axe axe對(duì)象,并用setAxe(Axe axe)方法注入;在spring的xml配置文件中,指明依賴關(guān)系:

<bean id="chinese" class="xxx">

<property name="axe"? ?ref="stoneAxe" />?<!--驅(qū)動(dòng)調(diào)用chinese的setAxe()方法,將stoneAxe作為傳入?yún)?shù)-->

</bean>

<bean id="stoneAxe" class="xxxx" />? ?<!--配置stoneAxe實(shí)例-->

(2)構(gòu)造注入:IOC容器使用構(gòu)造器來(lái)注入被依賴對(duì)象,通過(guò)構(gòu)造方法在配置文件中使用元素指定構(gòu)造器的參數(shù),通過(guò)<constructor-arg.../>元素驅(qū)動(dòng)spring執(zhí)行帶參數(shù)的構(gòu)造器。

例如:還是以上的例子,但在Chinese類中,有Axe axe; 構(gòu)造方法:public Chinese(Axe axe);再在xml配置文件中:

<bean id="chinese" class="xxx">

<constructor-arg ref="steelAxe"/>?<!--驅(qū)動(dòng)調(diào)用chinese帶一個(gè)參數(shù)的構(gòu)造器來(lái)創(chuàng)建對(duì)象->

</bean>

<bean id="steelAxe" class="xxxx" />? ?<!--配置steelAxe實(shí)例-->


SpringIOC

Spring的IOC容器,負(fù)責(zé)創(chuàng)建對(duì)象,管理對(duì)象(通過(guò)依賴注入(DI),裝配對(duì)象,配置對(duì)象,并且管理這些對(duì)象的整個(gè)生命周期。

Spring的IOC有三種注入方式 :第一是根據(jù)屬性注入,也叫set方法注入; 第二種是根據(jù)構(gòu)造方法進(jìn)行注入;第三種是根據(jù)注解進(jìn)行注入

IOC的優(yōu)點(diǎn):易測(cè)試


(三)Spring容器:BeanFactory和ApplicationContext

Spring容器?BeanFactory、ApplicationContext

BeanFactory 接口和 ApplicationContext 接口有什么區(qū)別 ?

是Spring的兩個(gè)容器,常用接口(ApplicationContext和BeanFactory接口)

BeanFactory:產(chǎn)生新的實(shí)例,負(fù)責(zé)配置、創(chuàng)建、管理Bean

ApplicationContext:也叫做Spring上下文,提供框架的實(shí)現(xiàn);一般用在spring的實(shí)現(xiàn)類中,作為用于訪問(wèn)容器中的bean常用接口


【(1)ApplicationContext接口繼承BeanFactory接口,spring核心工廠是BeanFactory ,BeanFactory采取延遲加載,第一次getBean時(shí)才會(huì)初始化Bean, ApplicationContext是會(huì)在加載配置文件時(shí)初始化Bean。

(2)ApplicationContext是對(duì)BeanFactory擴(kuò)展,它可以進(jìn)行國(guó)際化處理、事件傳遞和bean自動(dòng)裝配以及各種不同應(yīng)用層的Context實(shí)現(xiàn)。開(kāi)發(fā)中基本都在使用ApplicationContext, web項(xiàng)目使用WebApplicationContext ,很少用到BeanFactory

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));

IHelloService helloService = (IHelloService) beanFactory.getBean("helloService");

helloService.sayHello();】


(四)Spring常用注解:

@Autowired:修飾在何處以及如何完成自動(dòng)裝配。修飾setter方法、構(gòu)造器、屬性或者具有任意名稱和/或多個(gè)參數(shù)的PN方法。

@Required:表明bean的屬性必須在配置的時(shí)候設(shè)置,通過(guò)一個(gè)bean定義的顯式的屬性值或通過(guò)自動(dòng)裝配,若@Required注解的bean屬性未被設(shè)置,容器將拋出BeanInitializationException。


(五)Spring有幾種配置方式?

將Spring配置到應(yīng)用開(kāi)發(fā)中有以下三種方式:

基于XML的配置、基于注解的配置、基于Java的配置

(1)基于XML的配置:

所有的Spring組件都可以用xml文件的形式來(lái)進(jìn)行配置。不會(huì)出現(xiàn)其他的Spring配置類型。

Spring的XML配置方式是使用被Spring命名空間的所支持的一系列的XML標(biāo)簽來(lái)實(shí)現(xiàn)的。Spring有以下主要的命名空間:context、beans、jdbc、tx、aop、mvc和aso。

(2)基于Java的配置:

Spring對(duì)Java配置的支持是由@Configuration注解和@Bean注解來(lái)實(shí)現(xiàn)的。

由@Bean注解的方法將會(huì)實(shí)例化、配置和初始化一個(gè)新對(duì)象,這個(gè)對(duì)象將由Spring的IoC容器來(lái)管理。@Bean聲明所起到的作用與<bean/>?元素類似。

被@Configuration所注解的類則表示這個(gè)類的主要目的是作為bean定義的資源。被@Configuration聲明的類可以通過(guò)在同一個(gè)類的內(nèi)部調(diào)用@bean方法來(lái)設(shè)置嵌入bean的依賴關(guān)系。

@Configuration:聲明該類作為bean定義的資源;@Bean:bean名:id="myService"?

(3)基于注解的配置:

注解裝配在Spring中是默認(rèn)關(guān)閉的,需要在Spring文件中配置一下才能使用基于注解的裝配模式。

、

用于自動(dòng)裝配變量的注解:

@Required:該注解應(yīng)用于設(shè)值方法。

@Autowired:該注解應(yīng)用于有值設(shè)值方法、非設(shè)值方法、構(gòu)造方法和變量。

@Qualifier:該注解和@Autowired注解搭配使用,用于消除特定bean自動(dòng)裝配的歧義。

JSR-250 Annotations:Spring支持基于JSR-250 注解的以下注解,@Resource、@PostConstruct 和 @PreDestroy。

(六)Bean

1、Bean的作用域:

singleton:當(dāng)一個(gè)bean的作用域?yàn)閟ingleton,?那么Spring IoC容器中只會(huì)存在一個(gè)共享的bean實(shí)例,并且所有對(duì)bean的請(qǐng)求,只要id與該bean定義相匹配,則只會(huì)返回bean的同一實(shí)例。

prototype:Prototype作用域的bean會(huì)導(dǎo)致在每次對(duì)該bean請(qǐng)求時(shí)都會(huì)創(chuàng)建一個(gè)新的bean實(shí)例。

request:在一次HTTP請(qǐng)求中,一個(gè)bean定義對(duì)應(yīng)一個(gè)實(shí)例;即每次HTTP請(qǐng)求將會(huì)有各自的bean實(shí)例,?它們依據(jù)某個(gè)bean定義創(chuàng)建而成。該作用?域僅在基于web的Spring ApplicationContext情形下有效。

session:在一個(gè)HTTP Session中,一個(gè)bean定義對(duì)應(yīng)一個(gè)實(shí)例。該作用域僅在基于web的Spring?ApplicationContext情形下有效。

global session:在一個(gè)全局的HTTP Session中,一個(gè)bean定義對(duì)應(yīng)一個(gè)實(shí)例。典型情況下,僅在使用portlet?context的時(shí)候有效。該作用域僅在基于?web的Spring ApplicationContext情形下有效。

2、Bean注入屬性的方式

(七)AOP:面向切面編程(AOP):

對(duì)AOP的理解: AOP可對(duì)業(yè)務(wù)邏輯各個(gè)部分進(jìn)行隔離,降低業(yè)務(wù)邏輯各部分間的耦合度,提高程序可重用性,提高開(kāi)發(fā)效率。




Spring 框架中都用到了哪些設(shè)計(jì)模式?

單例模式—在spring配置文件中定義的bean默認(rèn)為單例模式。

工廠模式—BeanFactory用來(lái)創(chuàng)建對(duì)象的實(shí)例。

代理模式—在AOP和remoting中被用的比較多。

模板方法—用來(lái)解決代碼重復(fù)的問(wèn)題。比如.RestTemplate,JmsTemplate,JpaTemplate。

前端控制器—Spring提供了DispatcherServlet來(lái)對(duì)請(qǐng)求進(jìn)行分發(fā)。

視圖幫助(View Helper)—Spring提供了一系列的JSP標(biāo)簽,高效宏來(lái)輔助將分散的代碼整合在視圖里。

依賴注入—貫穿于BeanFactory/ApplicationContext接口的核心理念。






Spring框架的本質(zhì)就是通過(guò)XML配置類驅(qū)動(dòng)java代碼,從而把耦合關(guān)系提取到配置文件中管理,實(shí)現(xiàn)了系統(tǒng)中各組件的解耦。

Spring通過(guò)配置文件描述Bean及Bean之間的依賴關(guān)系,并通過(guò)Java語(yǔ)言的反射功能實(shí)例化Bean并建立Bean之間的依賴關(guān)系。



SpringMVC:

對(duì)SpringMVC的理解?

SpringMVC是一個(gè)表現(xiàn)層的框架,是Spring的一個(gè)模塊,基于MVC架構(gòu)來(lái)簡(jiǎn)化web應(yīng)用程序開(kāi)發(fā)的應(yīng)用開(kāi)發(fā)框架,將model、view和controller三者分離,簡(jiǎn)化開(kāi)發(fā)。

【model層:比如一個(gè)實(shí)體類

view層:定義一個(gè)jsp

Controller層:springMVCDemo-servlet.xml文件:SpringMVC的配置文件,如配置視圖解析器

SpringMVC和ajax的調(diào)用?

方法前加上@RequestBody注解,直接返回java對(duì)象。

項(xiàng)目中用了fastjson,將java對(duì)象轉(zhuǎn)化為json對(duì)象(js可識(shí)別),ajax.post()、get()傳值得值


SpringMVC的異常處理?

可以拋給Spring框架,由Spring處理,只需配置簡(jiǎn)單的異常處理器,在異常處理器上添視圖頁(yè)面。


SpringMVC的核心入口類?? DispatchServlet,用來(lái)處理所有的HTTP請(qǐng)求和響應(yīng)。

SpringMVC的控制器:用@Controller注解,是單例模式

SpringMVC的返回模式:可以是String等

SpringMVC中將視圖和數(shù)據(jù)合并的類?:ModelAndView

SpringMVC常用注釋:

@Controller:修飾類,表明該類作為控制器的角色,Spring不需要你繼承任何其他控制器基類或引用Servlet API。

@RequestMapping 注解:該注解是用來(lái)映射一個(gè)URL到一個(gè)類或一個(gè)特定的方處理法上。


SpringMVC的優(yōu)點(diǎn):

(1)基于組件技術(shù)的。全部的應(yīng)用對(duì)象,無(wú)論控制器和視圖,還是業(yè)務(wù)對(duì)象之類的都是?java組件,并且和Spring提供的其他基礎(chǔ)結(jié)構(gòu)緊密集成。

(2)不依賴于Servlet API(目標(biāo)雖是如此,但是在實(shí)現(xiàn)的時(shí)候確實(shí)是依賴于Servlet的)

(3)可以任意使用各種視圖技術(shù)(jsp、js、html等)

(4)?支持各種請(qǐng)求資源的映射策略

(5)易于擴(kuò)展


SpringMVC怎么樣設(shè)定重定向和轉(zhuǎn)發(fā)的?

(1)在返回值前面加"forward:"就可以讓結(jié)果轉(zhuǎn)發(fā),譬如"forward:user.do?name=method4"

(2)在返回值前面加"redirect:"就可以讓返回值重定向,譬如"redirect:http://www.baidu.com"


SpringMVC的流程:

1、用戶 發(fā)送請(qǐng)求 到 前端控制器

2、前端控制器 委托請(qǐng)求 到 頁(yè)面控制器

3、處理器 調(diào)用業(yè)務(wù)對(duì)象 到 模型

4、模型 返回模型數(shù)據(jù) 到 頁(yè)面控制器/處理器

5、頁(yè)面控制器/處理器 返回 ModelAndView 到 前端控制器

6、前端控制器 渲染 視圖

7、視圖 返回控制 到 前端控制器

8、前端控制器 產(chǎn)生響應(yīng) 返回用戶



組件:

1、前端控制器DispatcherServlet(不需開(kāi)發(fā)):框架支持,用于接收請(qǐng)求,響應(yīng)結(jié)果,相當(dāng)于轉(zhuǎn)發(fā)器,中央處理器。是當(dāng)于mvc模式中的c。是整個(gè)流程控制的中心,由它調(diào)用其它組件處理用戶的請(qǐng)求,降低了組件之間的耦合性。

2、處理器映射器HandlerMapping(不需開(kāi)發(fā)):根據(jù)請(qǐng)求的url查找Handler(即處理器)。springmvc提供了不同的映射器實(shí)現(xiàn)不同的映射方式,如配置文件方式、實(shí)現(xiàn)接口方式、注解方式等。

3、處理器適配器HandlerAdapter: 作用:按照特定規(guī)則(HandlerAdapter要求的規(guī)則)去執(zhí)行Handler

4、處理器Handler: 

注意:編寫Handler時(shí)按照HandlerAdapter的要求去做,這樣適配器才可以去正確執(zhí)行Handler。Handler是繼DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler對(duì)具體的用戶請(qǐng)求進(jìn)行處

5、視圖解析器View?resolver(不需要攻城獅開(kāi)發(fā)),由框架提供。作用:進(jìn)行視圖解析,根據(jù)邏輯視圖名解析成真正的視圖(view)

6、視圖View:需要開(kāi)發(fā)。view是一個(gè)接口,實(shí)現(xiàn)類支持不同的view類型。



Mybatis:

是一個(gè)持久層框架,它支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集??梢允褂煤?jiǎn)單的 XML 或注解來(lái)配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄

【其他持久層框架:hibernate】


mybatis的使用?

需要一個(gè)配置文件,實(shí)體類bean,一個(gè)接口類,一個(gè)xml文件或者是在接口類上用注解寫sql語(yǔ)句(@select、@update、@delete),鏈接數(shù)據(jù)庫(kù)。

mybatis面試題目:

1、#{}和${}的區(qū)別是什么?

#{}:變量占位符

${}:sql的參數(shù)占位符,直接替換,容易出現(xiàn)sql注入的問(wèn)題


2、xml映射文件中,除了常見(jiàn)的seletct | insert | update | delete外還有什么標(biāo)簽?

<resultMap>(<resultMap>:用于解決實(shí)體類中屬性和表字段名不相同的問(wèn)題,其中還有<id>和<result>標(biāo)簽)<parameterMap>、<sql>、<include>、<selectKey>

<mapper>:每個(gè)映射文件的根標(biāo)簽,重點(diǎn)關(guān)注<mapper>標(biāo)簽中namespace屬性

AccountMapper.java

AccountMapper.xml:

3、Mybatis進(jìn)行批量插入,能返回?cái)?shù)據(jù)庫(kù)主鍵列表嗎?

能。

4、mybatis如何將sql執(zhí)行結(jié)果封裝為目標(biāo)對(duì)象并返回的?有哪些映射形式?

【(1)<resultMap>標(biāo)簽,定義列名和對(duì)象屬性名之間映射關(guān)系;(2)使用sql列的別名功能,將列別名書(shū)寫為對(duì)象屬性名,比如T_NAME?AS NAME,對(duì)象屬性名一般是name,小寫,但是列名不區(qū)分大小寫。

有了列名與屬性名的映射關(guān)系后,Mybatis通過(guò)反射創(chuàng)建對(duì)象,同時(shí)使用反射給對(duì)象的屬性逐一賦值并返回,那些找不到映射關(guān)系的屬性,是無(wú)法完成賦值的?!?/p>

5、Mybatis能執(zhí)行一對(duì)一、一對(duì)多的關(guān)聯(lián)查詢嗎?都有哪些實(shí)現(xiàn)方式,以及它們之間的區(qū)別。

【只需要把selectOne()修改為selectList()即可;多對(duì)多查詢,其實(shí)就是一對(duì)多查詢,只需要把selectOne()修改為selectList()即可。】


6、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重復(fù)?

【不同的Xml映射文件,如果配置了namespace,那么id可以重復(fù);如果沒(méi)有配置namespace,那么id不能重復(fù);畢竟namespace不是必須的,只是最佳實(shí)踐而已?!?/p>


7、使用Mybatis的mapper接口調(diào)用時(shí)有哪些要求

【1、Mapper接口方法名與xml中sql的id名相同;

2、mapper接口方法輸入輸出參數(shù)類型和xml中parameterType、retsultType類型相同;

3、mapper接口類路徑對(duì)應(yīng)xml中namespace】


8、Mybatis的一級(jí)緩存和二級(jí)緩存?

【Mybatis首先去緩存中查詢結(jié)果集,如果沒(méi)有則查詢數(shù)據(jù)庫(kù),如果有則從緩存取出返回結(jié)果集就不走數(shù)據(jù)庫(kù)。Mybatis內(nèi)部存儲(chǔ)緩存使用一個(gè)HashMap,key為hashCode+sqlId+Sql語(yǔ)句。value為從查詢出來(lái)映射生成的java對(duì)象

Mybatis的二級(jí)緩存即查詢緩存,它的作用域是一個(gè)mapper的namespace,即在同一個(gè)namespace中查詢sql可以從緩存中獲取數(shù)據(jù)。二級(jí)緩存是可以跨SqlSession的?!?/p>



Hibernate:

一個(gè)開(kāi)源的、輕量級(jí)的ORM工具,對(duì)JDBC進(jìn)行非常輕量級(jí)的對(duì)象封裝,將POJO與數(shù)據(jù)庫(kù)表建立映射關(guān)系??勺詣?dòng)生成SQL語(yǔ)句,自動(dòng)執(zhí)行。

可應(yīng)用在任何使用JDBC的場(chǎng)合,可在java客戶端或在servlet/jsp的應(yīng)用中使用。

Hibernate框架有很多優(yōu)點(diǎn)。它們分別如下:

1、開(kāi)源和輕量級(jí)

2、快速性能:Hibernate框架的性能很快,因?yàn)榫彺嬖贖ibernate框架內(nèi)部使用。 hibernate框架中有兩種類型的緩存:一級(jí)緩存和二級(jí)緩存。一級(jí)緩存默認(rèn)是啟用的。

3、數(shù)據(jù)庫(kù)獨(dú)立查詢:HQL(Hibernate查詢語(yǔ)言)是面向?qū)ο蟮腟QL版本。 它生成數(shù)據(jù)庫(kù)獨(dú)立查詢。 所以你不需要編寫數(shù)據(jù)庫(kù)特定的查詢語(yǔ)句。 在Hibernate之前,如果項(xiàng)目更改了數(shù)據(jù)庫(kù),我們需要更改SQL查詢,從而導(dǎo)致維護(hù)變得非常復(fù)雜。

4、自動(dòng)創(chuàng)建表:Hibernate框架提供了自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表的功能。 因此,無(wú)需手動(dòng)在數(shù)據(jù)庫(kù)中創(chuàng)建表。

5、簡(jiǎn)化復(fù)雜連接:在hibernate框架中可輕松獲取多個(gè)表中的數(shù)據(jù)。

6、提供查詢統(tǒng)計(jì)和數(shù)據(jù)庫(kù)狀態(tài):Hibernate支持查詢緩存,并提供有關(guān)查詢和數(shù)據(jù)庫(kù)狀態(tài)的統(tǒng)計(jì)信息。


hibernate主要結(jié)構(gòu):

持久化類pojo(如student)、持久類映射文件(student.hbm.xml,直接對(duì)著持久類生成)、hibernate配置文件(hibernate.cfg.xml)

對(duì)著這個(gè)項(xiàng)目生成Hibernate.cfg.xml

使用JUnit測(cè)試?

@Before:初始化方法

@Test:測(cè)試方法

@After:釋放資源

總結(jié):

插入數(shù)據(jù)(包括圖片流?。?/p>

更新數(shù)據(jù):

查找操作:

查找并輸出圖片:

刪除:

ORM映射:ORM將對(duì)象映射到數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)的編程技術(shù)。

將關(guān)系數(shù)據(jù)庫(kù)包裝成面向?qū)ο蟮哪P偷墓ぞ摺?/p>

ORM的基本映射方式:數(shù)據(jù)庫(kù)表映射類、數(shù)據(jù)庫(kù)表的行映射對(duì)象(實(shí)例)、數(shù)據(jù)庫(kù)表的列(字段)映射對(duì)象的屬性。完成對(duì)象模型和關(guān)系模型的相互映射。


hibernate面試題:

1、hibernate并發(fā)機(jī)制:

【(1)hibernate的session對(duì)象非線程安全,對(duì)單個(gè)請(qǐng)求,對(duì)各工作單元,單個(gè)事務(wù)只使用一次便丟棄。

(2)多事務(wù)并發(fā)訪問(wèn)同一塊資源,可能引發(fā)臟讀、不可重復(fù)讀、幻讀的問(wèn)題。

解決方案:設(shè)置事務(wù)隔離級(jí)別:串行化(最高)、可重復(fù)讀、不可重復(fù)讀/已提交讀、未提交讀】

2、update和saveOrUpdate?

【update:必須是已持久化了的對(duì)象。

saveOrUpdate:都可以。已持久的,則更新;未持久的,則save到數(shù)據(jù)庫(kù)中?!?/p>

3、hibernate三種狀態(tài):瞬時(shí)、游離、持久

【1)、從瞬時(shí)態(tài)save(),變成持久化狀態(tài);

2)、往session中存對(duì)象,是往它的緩存和數(shù)據(jù)庫(kù)中各存了一份,緩存中的叫持久對(duì)象,當(dāng)session關(guān)閉,則對(duì)象變成游離狀態(tài);

3)、游離狀態(tài)update()時(shí),變成持久狀態(tài)

4)、持久態(tài)delete()時(shí),變瞬時(shí)狀態(tài)】

4、怎么在控制臺(tái)看到hibernate生成并執(zhí)行的sql?

在配置文件hibernate.cfg.xml中把hibernate.show_sql改為true(但會(huì)加重系統(tǒng)負(fù)擔(dān),不利于性能調(diào)優(yōu))

5、hibernate工作原理及為什么要用?

【工作原理:1、讀取并解析配置文件

2、讀取并解析映射信息,創(chuàng)建sessionFactory

3、打開(kāi)session

4、創(chuàng)建事務(wù)Transaction

5、持久化操作

6、提交事務(wù)

7、關(guān)閉session和sessionFactory


為什么要用?1、對(duì)JDBC訪問(wèn)數(shù)據(jù)庫(kù)進(jìn)行封裝,簡(jiǎn)化。2、支持各種關(guān)系數(shù)據(jù)庫(kù),從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系?!?/p>


6、SessionFactory:?jiǎn)蝹€(gè)數(shù)據(jù)庫(kù)映射關(guān)系經(jīng)過(guò)編譯后的內(nèi)存鏡像,線程安全,是生成session的工廠;是Hibrenate單例數(shù)據(jù)存儲(chǔ)和線程安全的,以至于可以多線程同時(shí)訪問(wèn)。一個(gè)SessionFactory 在啟動(dòng)的時(shí)候只能建立一次。

session:會(huì)話,提供應(yīng)用程序和存儲(chǔ)在數(shù)據(jù)庫(kù)中數(shù)據(jù)間的接口

Transaction:事務(wù),代表一次原子操作,具有數(shù)據(jù)庫(kù)事務(wù)的概念。一個(gè)session內(nèi)可能包含多個(gè)transaction對(duì)象。

TransactionFactory:事務(wù)工廠,是生成Transaction對(duì)象實(shí)例的工廠,無(wú)需應(yīng)用程序直接訪問(wèn)。負(fù)責(zé)對(duì)底層具體事務(wù)實(shí)現(xiàn)封裝成hibernate事務(wù)。

7、

8、hibernate中怎么實(shí)現(xiàn)類之間的關(guān)系(一對(duì)一,多對(duì)多)?

類與類之間的關(guān)系主要體現(xiàn)在表與表之間的關(guān)系進(jìn)行操作,都是對(duì)對(duì)象進(jìn)行操作。

程序中把所有的表與類都映射在一起,它們通過(guò)配置文件中的many-to-one、one-to-many、many-to-many。


9、JDBC、hibernate和Mybatis區(qū)別

【JDBC:較底層,對(duì)性能要求較高,流程是注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)-->建立數(shù)據(jù)庫(kù)連接-->建立statement,sql語(yǔ)句傳給statement執(zhí)行-->返回結(jié)果,則放到ResultSet對(duì)象中,遍歷獲??;

Hibernate:在JDBC基礎(chǔ)上進(jìn)行封裝,對(duì)數(shù)據(jù)庫(kù)進(jìn)行完整性控制,是全自動(dòng)ORM映射工具,數(shù)據(jù)庫(kù)移植性好;將數(shù)據(jù)庫(kù)中的數(shù)據(jù)表映射為持久層的Java對(duì)象,對(duì)sql語(yǔ)句進(jìn)行修改和優(yōu)化較困難;

Mybatis:在JDBC基礎(chǔ)上進(jìn)行封裝,靈活使用sql語(yǔ)句,半自動(dòng)ORM映射工具,需要收到編寫sql完成查詢關(guān)聯(lián)對(duì)象或關(guān)聯(lián)集合。將sql語(yǔ)句中的輸入?yún)?shù)和輸出參數(shù)映射為java對(duì)象,sql修改優(yōu)化較方便。但MyBatis的數(shù)據(jù)庫(kù)移植性不好,不同的數(shù)據(jù)庫(kù)需要寫不同SQL。】


10、優(yōu)化Hibernate所鼓勵(lì)的7大措施:

1.盡量使用many-to-one,避免使用單項(xiàng)one-to-many

2.靈活使用單向one-to-many

3.不用一對(duì)一,使用多對(duì)一代替一對(duì)一

4.配置對(duì)象緩存,不使用集合緩存

5.一對(duì)多使用Bag 多對(duì)一使用Set

6.繼承使用顯示多態(tài) HQL:from object polymorphism="exlicit" 避免查處所有對(duì)象

7.消除大表,使用二級(jí)緩存



Struts2一種基于MVC的輕量級(jí)的web應(yīng)用框架。

基于POJO的Action的MVC Web框架。它基于當(dāng)年的Webwork和XWork框架,繼承其優(yōu)點(diǎn),同時(shí)做了相當(dāng)?shù)母倪M(jìn)。

需要action類(model),包含execute()方法

xml文件為view:

struts.xml:(配置對(duì)應(yīng)以上的action(model)和index.jsp(view))

以及web.xml的配置。


struts2的工作流程:

1、瀏覽器發(fā)送請(qǐng)求到StrutsPrepareAndExecuteFilter

2、調(diào)用了execute()方法

3、xxxAction調(diào)用業(yè)務(wù)方法

4、Model組件返回業(yè)務(wù)結(jié)果

5、xxxAction返回邏輯視圖名

6、轉(zhuǎn)發(fā)到視圖頁(yè)面

7、生成響應(yīng)內(nèi)容

8、輸出響應(yīng)。、


struts2的工作原理:

客戶端發(fā)送請(qǐng)求

經(jīng)過(guò)一系列的過(guò)濾器

FilterDispatcher通過(guò)ActionMapper來(lái)決定這個(gè)REquest需要調(diào)用的Action

FilterDispather交給ActionProxy

通過(guò)ConfigurationManager詢問(wèn)struts.xml找到對(duì)應(yīng)的Action

ActionProxy創(chuàng)建一個(gè)ActionInvocation實(shí)例

調(diào)用Action Action執(zhí)行完畢ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果




SSM框架:

SpringMVC 作為表現(xiàn)層,Spring作為業(yè)務(wù)層,Spring data作為持久層。


springMVC和struts2的對(duì)比:

1. springmvc的入口是一個(gè)servlet即前端控制器,而struts2入口是一個(gè)filter過(guò)慮器。

2、springmvc基于方法開(kāi)發(fā)(一個(gè)url對(duì)應(yīng)一個(gè)方法),也就是一個(gè)方法對(duì)應(yīng)于一個(gè)請(qǐng)求,屬于方法攔截,請(qǐng)求的數(shù)據(jù)方法不共享,可以設(shè)計(jì)單例或多例(主要單例)。struts2是基于類開(kāi)發(fā),傳遞參數(shù)是通過(guò)類的屬性,只能設(shè)計(jì)為多例。

4. Struts采用值棧存儲(chǔ)請(qǐng)求和響應(yīng)的數(shù)據(jù),通過(guò)OGNL存取數(shù)據(jù), springmvc通過(guò)參數(shù)解析器是將request請(qǐng)求內(nèi)容解析,并給方法形參賦值,將數(shù)據(jù)和視圖封裝成ModelAndView對(duì)象,最后又將ModelAndView中的模型數(shù)據(jù)通過(guò)reques域傳輸?shù)巾?yè)面。Jsp視圖解析器默認(rèn)使用jstl。


dao層和model層區(qū)別:

dao是數(shù)據(jù)持久化層,負(fù)責(zé)數(shù)據(jù)庫(kù)操作,model負(fù)責(zé)數(shù)據(jù)模型。


AJAX是什么? 描述ajax的原理

答:Ajax又叫異步刷新,(JavaScript和xml)原理:使用HttpRequest向服務(wù)器發(fā)送異步請(qǐng)求,服務(wù)器返回處理結(jié)果。


hibernate多對(duì)一:

保存數(shù)據(jù)最好通過(guò)多的一方來(lái)維護(hù)關(guān)系,這樣可以減少update語(yǔ)句的生成,從而提高h(yuǎn)ibernate的執(zhí)行效率!

多的一方:

一的一方:

Dept.hbm.xml配置:

測(cè)試時(shí)建議多的一方操作:



SSM和SSH不同主要在MVC實(shí)現(xiàn)方式,以及ORM持久化方面不同(Hiibernate與Mybatis)。SSM越來(lái)越輕量級(jí)配置,將注解開(kāi)發(fā)發(fā)揮到極致,且ORM實(shí)現(xiàn)更加靈活,SQL優(yōu)化更簡(jiǎn)便;而SSH較注重配置開(kāi)發(fā),其中的Hiibernate對(duì)JDBC的完整封裝更面向?qū)ο?,?duì)增刪改查的數(shù)據(jù)維護(hù)更自動(dòng)化,但SQL優(yōu)化方面較弱,且入門門檻稍高。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容