Java web(SSM框架)知識(shí)點(diǎn)復(fù)習(xí)

作者:Aristochi

更新時(shí)間:? 2020/01/11 12:43

參考書(shū)目:Java EE框架整合開(kāi)發(fā)入門(mén)到實(shí)戰(zhàn)——Spring+Spring MVC+MyBatis

部分內(nèi)容引自https://www.w3cschool.cn/wkspring/dcu91icn.html

一個(gè)圖書(shū)電商的SSM項(xiàng)目地址https://github.com/Aristochi/Bookstore

圖片沒(méi)有上傳成功构捡,可以查看下方鏈接

文章完整鏈接有道云筆記·Javaweb SSM框架知識(shí)點(diǎn)整理

復(fù)習(xí)提綱

第一部分 Spring

第1章 Spring入門(mén)

Spring核心容器中有哪些模塊芯丧?P3

① Spring-core

spring-core模塊提供了框架的基本組成部分,包括 IoC 和依賴(lài)注入功能。

② Spring-beans

spring-beans?模塊提供 BeanFactory,工廠(chǎng)模式的經(jīng)典實(shí)現(xiàn),Spring將管理對(duì)象稱(chēng)為Bean

③ Spring-context

建立在core和?beans?模塊的基礎(chǔ)上容客,提供一個(gè)框架式的對(duì)象訪(fǎng)問(wèn)方式秕铛,是訪(fǎng)問(wèn)定義和配置的任何對(duì)象的媒介。ApplicationContext接口是Context模塊的焦點(diǎn)

④ Spring-context-support

spring-context-support支持整合第三方庫(kù)到Spring應(yīng)用程序上下文缩挑,比如緩存(EhCache, Guava, JCache)但两、任務(wù)調(diào)度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等供置。

⑤ Spring-expression

spring-expression模塊提供了強(qiáng)大的表達(dá)式語(yǔ)言谨湘,用于在運(yùn)行時(shí)查詢(xún)和操作對(duì)象圖。它是JSP2.1規(guī)范中定義的統(tǒng)一表達(dá)式語(yǔ)言的擴(kuò)展芥丧,支持set和get屬性值紧阔、屬性賦值、方法調(diào)用续担、訪(fǎng)問(wèn)數(shù)組集合及索引的內(nèi)容擅耽、邏輯算術(shù)運(yùn)算、命名變量物遇、通過(guò)名字從Spring IoC容器檢索對(duì)象乖仇,還支持列表的投影、選擇以及聚合等询兴。

完整依賴(lài)關(guān)系如下圖:

第二章 SpringIOC ?

2.1 SpringIOC的基本概念

1.? Spring框架中乃沙,什么是控制反轉(zhuǎn)?什么是依賴(lài)注入诗舰?有何區(qū)別警儒?

1)控制反轉(zhuǎn):當(dāng)某個(gè)對(duì)象(調(diào)用者)需要另外一個(gè)對(duì)象(被調(diào)用者)時(shí),傳統(tǒng)的編程模式下眶根,調(diào)用者通常會(huì)new一個(gè)被調(diào)用者對(duì)象冷蚂。在Spring中,對(duì)象不再由調(diào)用者創(chuàng)建汛闸,而是由Spring容器來(lái)創(chuàng)建蝙茶。Spring負(fù)責(zé)控制程序之間的依賴(lài)關(guān)系,而不是由調(diào)用者控制诸老,這樣隆夯,控制權(quán)由調(diào)用者轉(zhuǎn)移到Spring容器,控制權(quán)發(fā)生的反轉(zhuǎn)别伏,這就是Spring的控制反轉(zhuǎn)蹄衷。

2)依賴(lài)注入:從應(yīng)用程序角度來(lái)看,調(diào)用者依賴(lài)Spring容器創(chuàng)建并注入它所需要的被調(diào)用者對(duì)象厘肮,這就是依賴(lài)注入愧口。

3)區(qū)別:依賴(lài)反轉(zhuǎn)和依賴(lài)注入其實(shí)是對(duì)同一件事情在不同角度的不同表述,依賴(lài)注入是從應(yīng)用程序的角度在描述类茂,而控制反轉(zhuǎn)是從容器的角度在描述耍属。

2.2 Spring IoC容器

1.Spring IoC容器的設(shè)計(jì)主要是基于BeanFactory和ApplicationContext兩個(gè)接口

2.??? 創(chuàng)建ApplicationContext接口實(shí)例通常有三種方法:

1)????? 通過(guò)ClassPathXmlApplicationContext創(chuàng)建

2)????? 通過(guò)FileSystemXmlApplicationContext創(chuàng)建

3)????? 通過(guò)web服務(wù)器實(shí)例化ApplicationContext容器

2.3 依賴(lài)注入的類(lèi)型

依賴(lài)注入的類(lèi)型包括:使用構(gòu)造方法注入托嚣,使用屬性的setter方法注入

第3章Spring Bean

3.2 Bean的實(shí)例化:構(gòu)造方法實(shí)例化,靜態(tài)工廠(chǎng)實(shí)例化厚骗,實(shí)例工廠(chǎng)實(shí)例化

1.??? Spring如何創(chuàng)建對(duì)象示启,對(duì)象是如何存儲(chǔ)的,用戶(hù)是如何獲取對(duì)象的领舰?

1)????? Spring容器啟動(dòng)時(shí)夫嗓,首先會(huì)加載Spring的核心配置文件,Spring器逐行進(jìn)行解析xml配置文件

2)????? 當(dāng)解析到bean標(biāo)簽時(shí)開(kāi)始創(chuàng)建對(duì)象,根據(jù)class屬性中的數(shù)據(jù)通過(guò)反射機(jī)制創(chuàng)建對(duì)象冲秽。

3)????? 將創(chuàng)建好的對(duì)象存入Spring所維護(hù)的Map中舍咖,key就是bean中的ID,value就是生成的對(duì)象锉桑。

4)????? 用戶(hù)傳入key排霉,通過(guò)key來(lái)獲取Map中的value(對(duì)象)

3.3 Bean的作用域

singleton(默認(rèn))、prototype刨仑、request郑诺、session夹姥、application

3.5 Bean的裝配方式:

基于XML的裝配杉武;基于注解的裝配;?基于Java的裝配

Spring框架常用的注解 P34-35?

① @Component(類(lèi)注解)

該注解是一個(gè)泛化的概念辙售,僅僅表示一個(gè)組件對(duì)象(Bean)轻抱,可以作用在任何層次上。

② @Repository(DAO層)

該注解將數(shù)據(jù)訪(fǎng)問(wèn)層(DAO)的類(lèi)標(biāo)識(shí)為Bean旦部,即注解數(shù)據(jù)訪(fǎng)問(wèn)層Bean祈搜,其功能與@Component相同

③ @Service(Service層)

該注解用于標(biāo)注一個(gè)業(yè)務(wù)邏輯組件類(lèi)(Service層),其功能與@Component相同

④ @Controller(Controller層)

該注解用于標(biāo)識(shí)一個(gè)控制器組件類(lèi)(Spring MVC的controller)士八,其功能與@Component相同

⑤ @Autowired

該注解可以對(duì)類(lèi)成員變量容燕、方法及構(gòu)造方法進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作婚度。通過(guò)使用@Autowired來(lái)消除setter和getter方法蘸秘。默認(rèn)按照Bean的類(lèi)型進(jìn)行裝配

⑥@Resource

該注解與@Autowired的功能一樣,區(qū)別在于該注解默認(rèn)是按照名稱(chēng)來(lái)裝配注入的蝗茁,只有當(dāng)找不到與名稱(chēng)匹配的Bean才會(huì)按照類(lèi)型來(lái)裝配注入醋虏。

Spring注解中@Autowired和@Resource的區(qū)別?

1)@Autowired默認(rèn)按類(lèi)型裝配依賴(lài)對(duì)象,默認(rèn)情況下要求依賴(lài)對(duì)象必須存在哮翘,如果要允許null值颈嚼,可以設(shè)置它的required屬性為false,如果想按名稱(chēng)裝配饭寺,可以結(jié)合@Qualifier注解一起使用阻课。

2) @Resource注解有兩個(gè)屬性:name和type叫挟。name屬性指定Bean實(shí)例名稱(chēng),則按照名稱(chēng)來(lái)裝配注入柑肴;type屬性指定Bean類(lèi)型霞揉,則按照Bean的類(lèi)型進(jìn)行裝配。

第四章 Spring AOP

一晰骑、Spring AOP的基本概念适秩,理解AOP的術(shù)語(yǔ)(P41)理解

(補(bǔ)充說(shuō)明)切面(Aspect)是指封裝橫切到系統(tǒng)功能(如事務(wù)處理)的類(lèi)。

連接點(diǎn)(Joint Point)和切入點(diǎn)(Point cut)是什么硕舆?? 4

1)連接點(diǎn)是程序執(zhí)行的一個(gè)點(diǎn)秽荞。例如,一個(gè)方法的執(zhí)行或者一個(gè)異常的處理抚官。在 Spring AOP 中扬跋,一個(gè)連接點(diǎn)總是代表一個(gè)方法執(zhí)行。

2)切入點(diǎn)(Pointcut):匹配連接點(diǎn)的斷言或者表達(dá)式凌节。通知和一個(gè)切入點(diǎn)表達(dá)式關(guān)聯(lián)钦听,并在滿(mǎn)足這個(gè)切入點(diǎn)表達(dá)式的連接點(diǎn)上運(yùn)行。

二倍奢、動(dòng)態(tài)代理:JDK動(dòng)態(tài)代理(默認(rèn))朴上、Cglib動(dòng)態(tài)代理

比較JDK動(dòng)態(tài)代理和Cglib動(dòng)態(tài)代理?

答:在AOP的源碼中用到了兩種動(dòng)態(tài)代理來(lái)實(shí)現(xiàn)攔截切入功能:JDK動(dòng)態(tài)代理和Cglib動(dòng)態(tài)代理。兩種方法同時(shí)存在卒煞,各有優(yōu)劣痪宰。

1)????? JDK動(dòng)態(tài)代理是由java內(nèi)部的反射機(jī)制來(lái)實(shí)現(xiàn),反射機(jī)制在生成類(lèi)的過(guò)程中比較高效畔裕;而Cglib動(dòng)態(tài)代理是通過(guò)繼承來(lái)實(shí)現(xiàn)的,Cglib在生成類(lèi)之后的相關(guān)執(zhí)行過(guò)程中比較高效衣撬。

2)????? 如果目標(biāo)對(duì)象有接口則采用JDK動(dòng)態(tài)代理,如果目標(biāo)對(duì)象沒(méi)有接口采用Cglib動(dòng)態(tài)代理扮饶,Cglib動(dòng)態(tài)代理是備用方案具练。

3)????? 對(duì)接口創(chuàng)建代理優(yōu)于對(duì)類(lèi)創(chuàng)建代理,因?yàn)楦铀神詈咸鹞蓿許pring默認(rèn)是使用JDK動(dòng)態(tài)代理扛点。

三、基于代理類(lèi)的AOP實(shí)現(xiàn)

通知類(lèi)型P48

(來(lái)自百度的解釋?zhuān)?/p>

前置通知在一個(gè)方法執(zhí)行之前毫蚓,執(zhí)行通知占键。

后置通知在一個(gè)方法執(zhí)行之后,不考慮其結(jié)果元潘,執(zhí)行通知畔乙。

返回后通知在一個(gè)方法執(zhí)行之后,只有在方法成功完成時(shí)翩概,才能執(zhí)行通知牲距。

拋出異常后通知在一個(gè)方法執(zhí)行之后返咱,只有在方法退出拋出異常時(shí),才能執(zhí)行通知牍鞠。

環(huán)繞通知在建議方法調(diào)用之前和之后肥印,執(zhí)行通知畔濒。

(課本內(nèi)容)

>>org.aopalliance.intercept.MethodInterceptor(環(huán)繞通知):

在目標(biāo)方法執(zhí)行前后實(shí)施增強(qiáng)盏道,可以應(yīng)用于日志記錄胀茵、事務(wù)管理等功能。

>>org.springframework.aop.MethodBeforeAdvice(前置通知):

在目標(biāo)方法執(zhí)行前實(shí)施增強(qiáng)胁后,可以應(yīng)用于權(quán)限管理等功能店读。

>>org.springframework.aop.AfterReturningAdvice(后置返回通知):

在目標(biāo)方法執(zhí)行成功后實(shí)施增強(qiáng),可以應(yīng)用于關(guān)閉流攀芯、上傳文件屯断、刪除臨時(shí)文件等功能。

>>org.springframework.aop.AfterAdvice(后置(最終)通知)

在目標(biāo)方法執(zhí)行后實(shí)施增強(qiáng)侣诺,與后置返回通知不同的是殖演,不管是否發(fā)生異常都要執(zhí)行該類(lèi)通知,該類(lèi)通知年鸳,可應(yīng)用于釋放資源

>>org.springframework.aop.ThrowsAdvice (異常通知):

在方法拋出異常后實(shí)施增強(qiáng)趴久,可以應(yīng)用于處理異常、記錄日志等功能

>>org.springframework.aop.IntroductionInterceptor(引介通知):

在目標(biāo)類(lèi)添加一些新的方法和屬性阻星,可以應(yīng)用修目標(biāo)類(lèi)(增強(qiáng)類(lèi))朋鞍。

AspectJ實(shí)現(xiàn)SpringAOP的兩種方式:基于AspectJ的XML配置和基于注解開(kāi)發(fā)AspectJ

基于XML配置開(kāi)發(fā)AspectJ是指通過(guò)XML配置文件定義切面已添、切入點(diǎn)及通知妥箕,所有這些定義都必須在<aop:config>元素內(nèi)。

切點(diǎn)表達(dá)式(理解第8周 PPT課件中的切點(diǎn)表達(dá)式例子)

切面表達(dá)式主要由:designators(指示器更舞,匹配java方法)畦幢,wildcards(通配符),operators(操作運(yùn)算符)三部分組成

基于XML配置開(kāi)發(fā)AspectJ的例子

1.導(dǎo)入AspectJ框架相關(guān)的JAR包

2.創(chuàng)建切面類(lèi)

在src目錄下缆蝉,創(chuàng)建aspectj.xml包宇葱,在該包中創(chuàng)建切面類(lèi)MyAspect,并在類(lèi)中編寫(xiě)各種類(lèi)型通知刊头。

3.創(chuàng)建配置文件黍瞧,并編寫(xiě)相關(guān)配置

在aspectj.xml包中,創(chuàng)建配置文件applicationContext.xml原杂,并為<aop:config>元素及其子元素編寫(xiě)相關(guān)配置印颤。

4.創(chuàng)建測(cè)試類(lèi)

在aspectj.xml包中,創(chuàng)建測(cè)試類(lèi)XMLAspectJTest穿肄,在主方法中使用Spring容器獲取代理對(duì)象年局,并執(zhí)行目標(biāo)方法际看。

5.在dynamic.jdk.TestDaoImpl類(lèi)中save方法中添加異常代碼。

//例如

@Override

public void save() {

? int? n = 100/0;

? System.out.println("保存");

}

基于注解開(kāi)發(fā)AspectJ

1.創(chuàng)建切面類(lèi)矢否,并進(jìn)行注解

在ch4應(yīng)用的src目錄下仲闽,創(chuàng)建aspectj.annotation包,在該包中創(chuàng)建切面類(lèi)MyAspect僵朗。在該類(lèi)中赖欣,首先使用@Aspect注解定義一個(gè)切面類(lèi),由于該類(lèi)在Spring中是作為組件使用的验庙,所以還需要使用@Component注解畏鼓。然后,使用@Pointcut注解切入點(diǎn)表達(dá)式壶谒,并通過(guò)定義方法來(lái)表示切入點(diǎn)名稱(chēng)云矫。最后在每個(gè)通知方法上添加相應(yīng)的注解,并將切入點(diǎn)名稱(chēng)作為參數(shù)傳遞給需要執(zhí)行增強(qiáng)的通知方法汗菜。

2.注解目標(biāo)類(lèi)

使用注解@Repository將目標(biāo)類(lèi)dynamic.jdk.TestDaoImpl注解為目標(biāo)對(duì)象让禀,注解代碼如下:@Repository("testDao")

3.創(chuàng)建配置文件

在aspectj.annotation包中,創(chuàng)建配置文件applicationContext.xml陨界,并在配置文件中指定需要掃描的包巡揍,使注解生效。同時(shí)菌瘪,需要啟動(dòng)基于注解的AspectJ支持.

4.創(chuàng)建測(cè)試類(lèi)

第5章 Spring的事務(wù)處理

5.1 Spring的數(shù)據(jù)庫(kù)編程

1.??? JDBC 連接數(shù)據(jù)庫(kù)時(shí)需要配置數(shù)據(jù)庫(kù)腮敌,配置數(shù)據(jù)源時(shí)需要的 4 個(gè)基本屬性

MySQL數(shù)據(jù)庫(kù)驅(qū)動(dòng)、連接數(shù)據(jù)庫(kù)的URL俏扩、連接數(shù)據(jù)庫(kù)的用戶(hù)名糜工、連接數(shù)據(jù)庫(kù)的密碼

<!-- 配置數(shù)據(jù)源 -->

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

?? ? <!-- MySQL數(shù)據(jù)庫(kù)驅(qū)動(dòng) -->

?? ? <property name="driverClassName" value="com.mysql.jdbc.Driver"/>

?? ? <!-- 連接數(shù)據(jù)庫(kù)的URL -->

?? ? <property name="url" value="jdbc:mysql://localhost:3306/springtest?characterEncoding=utf8"/>

?? ? <!-- 連接數(shù)據(jù)庫(kù)的用戶(hù)名 -->

?? ? <property name="username" value="root"/>

?? ? <!-- 連接數(shù)據(jù)庫(kù)的密碼 -->

?? ? <property name="password" value="12345678"/>

?? </bean>

?? <!-- 配置JDBC模板 -->

?? <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

?? ? <property name="dataSource"? ref="dataSource"/>

?? </bean>

5.3 聲明式事務(wù)處理

1.?在Spring配置文件中為JDBC配置事務(wù)時(shí)需要做哪四步工作,注意它們的正確順序(XML 的方式)

1)?? 配置數(shù)據(jù)源

2)?? 配置事務(wù)管理器

3)?? 配置事務(wù)通知

4)?? 配置事務(wù)切面

2.? Spring 的聲明式事務(wù)管理可以通過(guò)兩種方式來(lái)實(shí)現(xiàn)

一種是基于 XML 的方式录淡,另一種是基于 @Transactional的注解方式

3.??@Transactional 注解一般標(biāo)注在 Service層上捌木,主要是針對(duì)數(shù)據(jù)的增加、修改嫉戚、刪除進(jìn)行事務(wù)管理刨裆。

第二部分 MyBatis

第6章 MyBatis開(kāi)發(fā)入門(mén)

1.??? 在MyBatis核心配置文件中mybatis-config.xml必須配置SQL映射文件。

<mappers>

?? <!-- 映射文件的位置 -->

?? <mapper resource="com/mybatis/mapper/UserMapper.xml"/>

</mappers>

2.??? SQL映射文件的mapper配置標(biāo)簽中使用namespace來(lái)指定對(duì)應(yīng)映射接口

例如UserMapper.xml中的配置:

<mapper namespace="com.dao.UserDao">

第7章 映射器

1.??SQL映射文件的常用配置元素P99

  ? cache :配置給定命名空間的緩存

  ? cache-ref :從其他命名空間引用緩存配置

  ? resultMap:提供映射規(guī)則(用來(lái)描述數(shù)據(jù)庫(kù)結(jié)果集和對(duì)象的對(duì)應(yīng)關(guān)系)

  ? sql:可以重用的 SQL 塊彬檀,也可以被其他語(yǔ)句引用

  ? insert:映射插入語(yǔ)句

  ? update:映射更新語(yǔ)句

  ? delete:映射刪除語(yǔ)句

  ? select:映射查詢(xún)語(yǔ)句

2.??SQL映射文件的常用配置元素的使用

<select>

在SQL映射文件中<select>元素用于映射SQL的select語(yǔ)句帆啃,其示例代碼如下:

? <!-- 根據(jù)uid查詢(xún)一個(gè)用戶(hù)信息 -->

? <select id="selectUserById" parameterType="Integer"

? resultType="com.po.MyUser">

? select * from user where uid = #{uid}

? </select>

??? 上述示例代碼中,id的值是唯一標(biāo)識(shí)符窍帝,它接收一個(gè)Integer類(lèi)型的參數(shù)努潘,返回一個(gè)MyUser類(lèi)型的對(duì)象,結(jié)果集自動(dòng)映射到MyUser屬性。

<insert>

<insert>元素用于映射插入語(yǔ)句慈俯,MyBatis執(zhí)行完一條插入語(yǔ)句后渤刃,將返回一個(gè)整數(shù)表示其影響的行數(shù)。它的屬性與<select>元素的屬性大部分相同贴膘,在本節(jié)講解它的幾個(gè)特有屬性卖子。具體如下:

keyProperty:該屬性的作用是將插入或更新操作時(shí)的返回值賦值給PO類(lèi)的某個(gè)屬性,通常會(huì)設(shè)置為主鍵對(duì)應(yīng)的屬性刑峡。如果是聯(lián)合主鍵洋闽,可以在多個(gè)值之間用逗號(hào)隔開(kāi)。

keyColumn:該屬性用于設(shè)置第幾列是主鍵突梦,當(dāng)主鍵列不是表中的第一列時(shí)需要設(shè)置诫舅。如果是聯(lián)合主鍵時(shí),可以在多個(gè)值之間用逗號(hào)隔開(kāi)宫患。

useGeneratedKeys:該屬性將使MyBatis使用JDBC的getGeneratedKeys()方法獲取由數(shù)據(jù)庫(kù)內(nèi)部生產(chǎn)的主鍵刊懈,如MySQL、SQL Server等自動(dòng)遞增的字段娃闲,其默認(rèn)值為false虚汛。

1.主鍵(自動(dòng)遞增)回填

MySQL、SQL Server等數(shù)據(jù)庫(kù)的表格可以采用自動(dòng)遞增的字段作為主鍵皇帮。有時(shí)可能需要使用這個(gè)剛剛產(chǎn)生的主鍵卷哩,用以關(guān)聯(lián)其他業(yè)務(wù)。

<!-- 添加一個(gè)用戶(hù)属拾,成功后將主鍵值回填給uid(po類(lèi)的屬性)-->

? <insert id="addUser" parameterType="com.po.MyUser"

? keyProperty="uid"? useGeneratedKeys="true">

? insert into user (uname,usex) values(#{uname},#{usex})

? </insert>

2.自定義主鍵

如果實(shí)際工程中使用的數(shù)據(jù)庫(kù)不支持主鍵自動(dòng)遞增(如Oracle)将谊,或者取消了主鍵自動(dòng)遞增的規(guī)則時(shí),可以使用MyBatis的<selectKey>元素來(lái)自定義生成主鍵渐白。

<insert id="insertUser" parameterType="com.po.MyUser">

? <!-- 先使用selectKey元素定義主鍵尊浓,然后再定義SQL語(yǔ)句 -->

? <selectKey keyProperty="uid" resultType="Integer" order="BEFORE">

? ?? select if(max(uid) is null, 1 , max(uid)+1) as newUid from user

? </selectKey>

? insert into user (uid,uname,usex) values(#{uid},#{uname},#{usex})

??? </insert>

<update>和<delete>

<update>和<delete>元素比較簡(jiǎn)單,它們的屬性和<insert>元素礼预、<select>元素的屬性差不多眠砾,執(zhí)行后也返回一個(gè)整數(shù)虏劲,表示影響了數(shù)據(jù)庫(kù)的記錄行數(shù)托酸。

<!-- 修改一個(gè)用戶(hù) -->

??? <update id="updateUser" parameterType="com.po.MyUser">

? update user set uname = #{uname},usex = #{usex} where uid = #{uid}

??? </update>

??? <!-- 刪除一個(gè)用戶(hù) -->

??? <delete id="deleteUser" parameterType="Integer">

? delete from user where uid = #{uid}

??? </delete>

<resultMap>元素(提綱內(nèi)無(wú))

使用Map存儲(chǔ)結(jié)果集

使用POJO存出結(jié)果集

<resultMap type="" id="">

??? <constructor><!-- 類(lèi)在實(shí)例化時(shí),用來(lái)注入結(jié)果到構(gòu)造方法 -->

? <idArg/><!-- ID參數(shù)柒巫,結(jié)果為ID -->

? <arg/><!-- 注入到構(gòu)造方法的一個(gè)普通結(jié)果 -->

??? </constructor>

??? <id/><!-- 用于表示哪個(gè)列是主鍵 -->

??? <result/><!-- 注入到字段或JavaBean屬性的普通結(jié)果 -->

??? <association property=""/><!-- 用于一對(duì)一關(guān)聯(lián) -->

??? <collection property=""/><!-- 用于一對(duì)多励堡、多對(duì)多關(guān)聯(lián) -->

??? <discriminator javaType=""><!-- 使用結(jié)果值來(lái)決定使用哪個(gè)結(jié)果映射 -->

??????? <case value=""/>? <!-- 基于某些值的結(jié)果映射 -->

??? </discriminator>

</resultMap>

<resultMap>元素表示結(jié)果映射集,是MyBatis中最重要也是最強(qiáng)大的元素堡掏。主要用來(lái)定義映射規(guī)則应结、級(jí)聯(lián)的更新以及定義類(lèi)型轉(zhuǎn)化器等。

<resultMap>元素的type屬性表示需要的POJO,id屬性是resultMap的唯一標(biāo)識(shí)鹅龄。

子元素<constructor>用于配置構(gòu)造方法(當(dāng)POJO未定義無(wú)參數(shù)的構(gòu)造方法時(shí)使用)揩慕。

子元素<id>用于表示哪個(gè)列是主鍵。

子元素<result>用于表示POJO和數(shù)據(jù)表普通列的映射關(guān)系扮休。

子元素<association> 迎卤、<collection> 和<discriminator>是用在級(jí)聯(lián)的情況下。

3.?? SQL映射文件中的配置元素中的id屬性必須唯一

4.?? Mybatis進(jìn)行一對(duì)一和一對(duì)多關(guān)聯(lián)查詢(xún)時(shí)使用的標(biāo)簽分別是?

MyBatis如何處理一對(duì)一級(jí)聯(lián)查詢(xún)呢玷坠?

在MyBatis中蜗搔,通過(guò)<resultMap>元素的子元素<association>處理這種一對(duì)一級(jí)聯(lián)關(guān)系。在<association>元素中八堡,通常使用以下屬性樟凄。

property:指定映射到實(shí)體類(lèi)的對(duì)象屬性。

column:指定表中對(duì)應(yīng)的字段(即查詢(xún)返回的列名)兄渺。

javaType:指定映射到實(shí)體對(duì)象屬性的類(lèi)型缝龄。

select:指定引入嵌套查詢(xún)的子SQL語(yǔ)句,該屬性用于關(guān)聯(lián)映射中的嵌套查詢(xún)挂谍。

一對(duì)多關(guān)聯(lián)查詢(xún)可用三種方式實(shí)現(xiàn):

可參考實(shí)例

文檔:Mybatis一對(duì)多查詢(xún)示例.note

鏈接:http://note.youdao.com/noteshare?id=4b17fafdaad543166f32f4c808c639e6

單步查詢(xún)二拐,利用collection標(biāo)簽為級(jí)聯(lián)屬性賦值;

分步查詢(xún):

利用association標(biāo)簽進(jìn)行分步查詢(xún)凳兵;

? ? 和使用collection標(biāo)簽的方式相同

利用collection標(biāo)簽進(jìn)行分步查詢(xún):

指定collection標(biāo)簽的 property 屬性百新;

通過(guò)select屬性指定下一步查詢(xún)使用的 statement id;

通過(guò)column屬性向下一步查詢(xún)傳遞參數(shù)

(以下為補(bǔ)充內(nèi)容)

resultMap總結(jié)

resultType:

作用:

???????? 將查詢(xún)結(jié)果按照sql列名pojo屬性名一致性映射到pojo中庐扫。

場(chǎng)合:

???????? 常見(jiàn)一些明細(xì)記錄的展示饭望,比如用戶(hù)購(gòu)買(mǎi)商品明細(xì),將關(guān)聯(lián)查詢(xún)信息全部展示在頁(yè)面時(shí)形庭,此時(shí)可直接使用resultType將每一條記錄映射到pojo中铅辞,在前端頁(yè)面遍歷list(list中是pojo)即可。

resultMap:

???????? 使用association和collection完成一對(duì)一和一對(duì)多高級(jí)映射(對(duì)結(jié)果有特殊的映射要求)萨醒。

association:

作用:

???????? 將關(guān)聯(lián)查詢(xún)信息映射到一個(gè)pojo對(duì)象中斟珊。

場(chǎng)合:

???????? 為了方便查詢(xún)關(guān)聯(lián)信息可以使用association將關(guān)聯(lián)訂單信息映射為用戶(hù)對(duì)象的pojo屬性中,比如:查詢(xún)訂單及關(guān)聯(lián)用戶(hù)信息富纸。

???????? 使用resultType無(wú)法將查詢(xún)結(jié)果映射到pojo對(duì)象的pojo屬性中囤踩,根據(jù)對(duì)結(jié)果集查詢(xún)遍歷的需要選擇使用resultType還是resultMap。


collection:

作用:

???????? 將關(guān)聯(lián)查詢(xún)信息映射到一個(gè)list集合中晓褪。

場(chǎng)合:

???????? 為了方便查詢(xún)遍歷關(guān)聯(lián)信息可以使用collection將關(guān)聯(lián)信息映射到list集合中堵漱,比如:查詢(xún)用戶(hù)權(quán)限范圍模塊及模塊下的菜單,可使用collection將模塊映射到模塊list中涣仿,將菜單列表映射到模塊對(duì)象的菜單list屬性中勤庐,這樣的作的目的也是方便對(duì)查詢(xún)結(jié)果集進(jìn)行遍歷查詢(xún)示惊。


?? 如果使用resultType無(wú)法將查詢(xún)結(jié)果映射到list集合中。

第8章 動(dòng)態(tài)SQL

1.?常用的動(dòng)態(tài)SQL元素有哪些?理解它們的使用

if愉镰、choose (when, otherwise)米罚、trim (where, set)、foreach

if

1.添加SQL映射語(yǔ)句

<!--在com.mybatis包的UserMapper.xml文件中丈探,添加如下SQL映射語(yǔ)句:-->

<!-- 使用if元素阔拳,根據(jù)條件動(dòng)態(tài)查詢(xún)用戶(hù)信息 -->

<select id="selectUserByIf"? resultType="com.po.MyUser" parameterType="com.po.MyUser">

? select * from user where 1=1

? <if test="uname !=null and uname!=''">

? and? uname like concat('%',#{uname},'%')

? </if>

? <if test="usex !=null and usex!=''">

? and?? usex = #{usex}

? </if>

</select>

2.添加數(shù)據(jù)操作接口方法

//在com.dao包的UserDao接口中,添加如下數(shù)據(jù)操作接口方法:

public? List<MyUser> selectUserByIf(MyUser user);

3.調(diào)用數(shù)據(jù)操作接口方法

//在com.controller包的UserController類(lèi)中类嗤,添加如下程序糊肠,調(diào)用數(shù)據(jù)操作接口方法。

??? //使用if元素查詢(xún)用戶(hù)信息

? MyUser ifmu = new MyUser();

? ifmu.setUname("張");

? ifmu.setUsex("女");

? List<MyUser> listByif = userDao.selectUserByIf(ifmu);

? System.out.println("if元素================");

? for (MyUser myUser : listByif) {

? System.out.println(myUser);

? }

4.測(cè)試動(dòng)態(tài)SQL語(yǔ)句

//運(yùn)行com.controller包中TestController主類(lèi)遗锣,測(cè)試動(dòng)態(tài)SQL語(yǔ)句货裹。

select * from user where 1=1 and uname like concat('%',?,'%') and usex = ?

choose (when, otherwise)

//有些時(shí)候,不想用到所有的條件語(yǔ)句精偿,而只想從中擇其一二弧圆。

//針對(duì)這種情況,MyBatis 提供了choose元素笔咽,它有點(diǎn)像Java中的 switch 語(yǔ)句搔预。

<!-- 使用choose、when叶组、otherwise元素拯田,根據(jù)條件動(dòng)態(tài)查詢(xún)用戶(hù)信息 -->

? <select id="selectUserByChoose"? resultType="com.po.MyUser" parameterType="com.po.MyUser">

? select * from user where 1=1

<choose>

? <when test="uname !=null and uname!=''">

? and uname like concat('%',#{uname},'%')

? </when>

? <when test="usex !=null and usex!=''">

? and usex = #{usex}

? </when>

? <otherwise>

? and uid > 10

? </otherwise>

</choose>

</select>

//使用choose、when甩十、otherwise元素船庇,根據(jù)條件動(dòng)態(tài)查詢(xún)用戶(hù)信息

? MyUser chooseMu = new MyUser();

? chooseMu.setUname("陳");

? // chooseMu.setUsex("女");

? List<MyUser> listChoose = userDao.selectUserByIf(chooseMu);

? System.out.println("choose元素================");

? for (MyUser myUser : listChoose) {

? System.out.println(myUser);

? }

trim (where, set)

<trim>元素的主要功能是可以在自己包含的內(nèi)容前加上某些前綴,也可以在其后加上某些后綴侣监,與之對(duì)應(yīng)的屬性是prefix和suffix鸭轮;可以把包含內(nèi)容的首部的某些內(nèi)容覆蓋,即忽略橄霉,也可以把尾部的某些內(nèi)容覆蓋窃爷,對(duì)應(yīng)的屬性是prefixOverrides和suffixOverrides;正因?yàn)樵赜羞@樣的功能姓蜂,所以也可以非常簡(jiǎn)單地利用來(lái)代替元素的功能按厘。

<!-- 使用trim元素,根據(jù)條件動(dòng)態(tài)查詢(xún)用戶(hù)信息 -->

<!--UserMapper.xml-->

<select id="selectUserByTrim"? resultType="com.po.MyUser" parameterType="com.po.MyUser">

? select * from user

? <trim prefix="where" prefixOverrides="and |or">?

? ??????? <if test="uname !=null and uname!=''">?

? ??????????? and uname like concat('%',#{uname},'%')

? ??????? </if>?

? ??????? <if test="usex !=null and usex!=''">?

? ??????????? and usex = #{usex}

? ??????? </if>???

??? ? </trim> ?

</select>

//在com.dao包下的UserDao接口中添加數(shù)據(jù)操作方法

public List<MyUser> selectUserByTrim(MyUser user);

// 使用trim元素覆糟,根據(jù)條件動(dòng)態(tài)查詢(xún)用戶(hù)信息

//UserController

? MyUser trimMu = new MyUser();

? trimMu.setUname("張");

? trimMu.setUsex("女");

? List<MyUser> listtrim = userDao.selectUserByTrim(trimMu);

? System.out.println("trim元素================");

? for (MyUser myUser : listtrim) {

? System.out.println(myUser);

? }

<where>元素

<where>元素的作用是會(huì)在寫(xiě)入元素的地方輸出一個(gè)where語(yǔ)句刻剥,另外一個(gè)好處是不需要考慮元素里面的條件輸出是什么樣子的,MyBatis將智能處理滩字。如果所有的條件都不滿(mǎn)足,那么MyBatis就會(huì)查出所有的記錄,如果輸出后是and 開(kāi)頭的麦箍,MyBatis會(huì)把第一個(gè)and忽略漓藕,當(dāng)然如果是or開(kāi)頭的,MyBatis也會(huì)把它忽略挟裂;此外享钞,在元素中不需要考慮空格的問(wèn)題,MyBatis將智能加上诀蓉。

<!-- 使用where元素栗竖,根據(jù)條件動(dòng)態(tài)查詢(xún)用戶(hù)信息 -->

<!--UserMapper.xml-->

<select id="selectUserByWhere"? resultType="com.po.MyUser" parameterType="com.po.MyUser">

? select * from user

? <where>

? ? ? <if test="uname !=null and uname!=''">?

? ????and uname like concat('%',#{uname},'%')

? ????</if>?

? ????<if test="usex !=null and usex!=''">?

? ? ? and usex = #{usex}

? ? ? </if>???

</where> ?

</select>

//在com.dao包下的UserDao接口中添加數(shù)據(jù)操作方法

public List<MyUser> selectUserByWhere(MyUser user);

// 使用where元素,根據(jù)條件動(dòng)態(tài)查詢(xún)用戶(hù)信息

//UserController

? MyUser whereMu = new MyUser();

? whereMu.setUname("張");

? whereMu.setUsex("女");

? List<MyUser> listWhere = userDao.selectUserByWhere(whereMu);

? System.out.println("where元素================");

? for (MyUser myUser : listWhere) {

? System.out.println(myUser);

? }

<set>元素

在動(dòng)態(tài)update語(yǔ)句中渠啤,可以使用<set>元素動(dòng)態(tài)更新列狐肢。

<!-- 使用set元素,動(dòng)態(tài)修改一個(gè)用戶(hù) -->

<!--UserMapper.xml-->

? <update id="updateUserBySet" parameterType="com.po.MyUser">

? update user

? <set>

? <if test="uname != null">uname=#{uname},</if>

? <if test="usex != null">usex=#{usex}</if>

? </set>

? where uid = #{uid}

? </update

//UserDao

//使用set元素沥曹,動(dòng)態(tài)修改一個(gè)用戶(hù)

public? int updateUserBySet(MyUser user);

//使用set元素份名,動(dòng)態(tài)修改一個(gè)用戶(hù)

//UserController

? System.out.println("set元素================");

? MyUser setMu = new MyUser();

? setMu.setUid(31);

? setMu.setUname("張久");

? int setup=userDao.updateUserBySet(setMu);

? System.out.println("set元素修改了"+setup+"條記錄");

? System.out.println("================");?

foreach

元素主要用在構(gòu)建in條件中,它可以在SQL語(yǔ)句中進(jìn)行迭代一個(gè)集合妓美。foreach元素的屬性主要有item僵腺,index,collection壶栋,open辰如,separator,close贵试。item表示集合中每一個(gè)元素進(jìn)行迭代時(shí)的別名丧没,index指定一個(gè)名字,用于表示在迭代過(guò)程中锡移,每次迭代到的位置呕童,open表示該語(yǔ)句以什么開(kāi)始,separator表示在每次進(jìn)行迭代之間以什么符號(hào)作為分隔符淆珊,close表示以什么結(jié)束夺饲。在使用時(shí),最關(guān)鍵的也是最容易出錯(cuò)的是collection屬性施符,該屬性是必選的往声,但在不同情況下,該屬性的值是不一樣的戳吝,主要有以下3種情況:

??? 如果傳入的是單參數(shù)且參數(shù)類(lèi)型是一個(gè)List的時(shí)候浩销,collection屬性值為list。

??? 如果傳入的是單參數(shù)且參數(shù)類(lèi)型是一個(gè)array數(shù)組的時(shí)候听哭,collection的屬性值為array慢洋。

??? 如果傳入的參數(shù)是多個(gè)時(shí)塘雳,需要把它們封裝成一個(gè)Map,當(dāng)然單參數(shù)也可以封裝成Map普筹。Map的key是參數(shù)名败明,collection屬性值是傳入的List或array對(duì)象在自己封裝的Map中的key。

<!--UserMapper.xml-->

<!-- 使用foreach元素太防,查詢(xún)用戶(hù)信息 -->

? <select id="selectUserByForeach" resultType="com.po.MyUser"? parameterType="List">

? select * from user where uid in

? <foreach item="item" index="index" collection="list" open="(" separator="," close=")">

? #{item}

? </foreach>

? </select>

//UserDao接口

public List<MyUser> selectUserByForeach(List<Integer>listId);

// 使用foreach元素妻顶,根據(jù)條件動(dòng)態(tài)查詢(xún)用戶(hù)信息

//UserController

List<Integer> listIds = new ArrayList<Integer>();

listIds.add(31);

listIds.add(32);

List<MyUser> listForeach = userDao.selectUserByForeach(listIds);

System.out.println("Foreach元素================");

for (MyUser myUser : listForeach) {

? System.out.println(myUser);

}

2.?給出動(dòng)態(tài)SQL語(yǔ)句,根據(jù)輸入寫(xiě)出正確的SQL語(yǔ)句

3.?MyBatis 中#{}與${}綁定參數(shù)有什么區(qū)別蜒车?

①#{ }將傳入的數(shù)據(jù)都當(dāng)成一個(gè)字符串讳嘱,會(huì)對(duì)自動(dòng)傳入的數(shù)據(jù)加一個(gè)雙引號(hào)。如:order by #{id}酿愧,如果傳入的值是111,那么解析成sql時(shí)的值為order by“111”, 如果傳入的值是id沥潭,則解析成的sql為order by“id”。

②${ }將傳入的數(shù)據(jù)直接顯示生成在sql中寓娩。如:order by?${id}叛氨,如果傳入的值是111,那么解析成sql時(shí)的值為order by 111, 如果傳入的值是id,則解析成的sql為order?by id棘伴。

③#{ }方式能夠很大程度防止sql注入寞埠,${}方式無(wú)法防止Sql注入。

④${ }方式一般用于傳入數(shù)據(jù)庫(kù)對(duì)象焊夸,例如傳入表名仁连。

⑤ 一般能用#{}的就別用${}。


第9章 Spring MVC入門(mén)

1.?????? SpringMVC 的工作流程P133

工作流程如下:

1)????? 客戶(hù)端請(qǐng)求提交到DispatcherServlet;

2)????? 由DispatcherServlet控制器尋找一個(gè)或多個(gè)HandlerMapping阱穗,找到處理請(qǐng)求的Controller饭冬;

3)????? DispatcherServlet將請(qǐng)求提交到Controller,Controller調(diào)用業(yè)務(wù)邏輯處理后返回ModelAndView;

4)????? DispatcherServlet尋找一個(gè)或多個(gè)ViewResolver視圖解析器揪阶,找到ModelAndView指定的視圖昌抠;

5)????? 視圖負(fù)責(zé)將結(jié)果顯示到客戶(hù)端。

2.?? ? 在開(kāi)發(fā)Spring MVC應(yīng)用時(shí)鲁僚,需要在web.xml中部署配置前端控制器DispatcherServlet

第10章 Spring MVC的Controller

10.1控制器注解?

@Controller

@Controller注解表明了某類(lèi)是作為控制器的角色而存在的炊苫。

(使用org.springframework.stereotype.Controller注解類(lèi)型聲明某類(lèi)的實(shí)例是一個(gè)控制器。)冰沙。

在SpringMVC中使用掃描機(jī)制找到應(yīng)用中所有基于注解的控制器類(lèi)侨艾,為了讓控制器類(lèi)被Spring MVC框架掃描到,需要在配置文件中聲明spring-context拓挥,并使用<context:component-scan/>元素指定控制器類(lèi)的基本包(請(qǐng)確保所有控制器類(lèi)都在基本包及其子包下)唠梨。

示例代碼:

package controller;

import org.springframework.stereotype.Controller;

/** “@Controller”表示IndexController的實(shí)例是一個(gè)控制器

?* @Controller相當(dāng)于@Controller("indexController")

?* 或@Controller(value = "indexController")

?*/

@Controller

public class IndexController {

? //處理請(qǐng)求的方法

}

@RequestMapping

@RequestMapping 將請(qǐng)求的url與處理方法一一對(duì)應(yīng)起來(lái)

1.方法級(jí)別注解

@Controller

public class IndexController {

? @RequestMapping(value = "/index/login")

? public String login() {

? /**login代表邏輯視圖名稱(chēng),需要根據(jù)Spring MVC配置

? ?* 文件中internalResourceViewResolver的前綴和后綴找到對(duì)應(yīng)的物理視圖 */

? return "login";

? }

? @RequestMapping(value = "/index/register")

? public String register() {

? return "register";

? }

}

2.類(lèi)級(jí)別注解

@Controller

@RequestMapping("/index")

public class IndexController {

? @RequestMapping("/login")

? public String login() {

? return "login";

? }

? @RequestMapping("/register")

? public String register() {

? return "register";

? }

}

10.2 Controller接收請(qǐng)求參數(shù)的常用方式(6種方式)

通過(guò)實(shí)體bean接收請(qǐng)求參數(shù)

通過(guò)處理方法的形參接收請(qǐng)求參數(shù)

通過(guò)HttpServletRequest接收請(qǐng)求參數(shù)

通過(guò)@PathVariable接收URL中的請(qǐng)求參數(shù)

通過(guò)@RequestParam接收請(qǐng)求參數(shù)

通過(guò)@ModelAttribute接收請(qǐng)求參數(shù)

10.3 重定向和轉(zhuǎn)發(fā)

1.轉(zhuǎn)發(fā)到一個(gè)請(qǐng)求方法(同一個(gè)控制器類(lèi)里侥啤,可省略/index/)

return "forward: /index/login";

2.重定向到一個(gè)請(qǐng)求方法

return "redirect:/index/isRegister";

3.轉(zhuǎn)發(fā)到一個(gè)視圖

return "register";???? //加上前綴和后綴? /WEB-INF/jsp/register.jsp


第12章 數(shù)據(jù)綁定和表單標(biāo)簽庫(kù)

認(rèn)識(shí) JSON的兩種數(shù)據(jù)結(jié)構(gòu)(對(duì)象結(jié)構(gòu)当叭、數(shù)組結(jié)構(gòu))

JSON(JavaScript Object Notation茬故,JS對(duì)象標(biāo)記)是一種輕量級(jí)的數(shù)據(jù)交換格式。

與XML一樣科展,JSON也是基于純文本的數(shù)據(jù)格式均牢。它有兩種數(shù)據(jù)結(jié)構(gòu)糠雨。

1.對(duì)象結(jié)構(gòu)

對(duì)象結(jié)構(gòu)以“{”開(kāi)始才睹,以“}”結(jié)束。中間部分由0個(gè)或多個(gè)以英文“,”分隔的key/value對(duì)構(gòu)成甘邀,key和value之間以英文“:”分隔琅攘。對(duì)象結(jié)構(gòu)的語(yǔ)法結(jié)構(gòu)如下:

{

? key1:value1,

? key2:value2,

? …

}

其中,key必須為String類(lèi)型松邪,value可以是String坞琴、Number、Object逗抑、Array等數(shù)據(jù)類(lèi)型剧辐。

2.?dāng)?shù)組結(jié)構(gòu)

數(shù)組結(jié)構(gòu)以“[”開(kāi)始,以“]”結(jié)束邮府。中間部分由0個(gè)或多個(gè)以英文“,”分隔的值的列表組成荧关。數(shù)組結(jié)構(gòu)的語(yǔ)法結(jié)構(gòu)如下:

[

? value1,

? value2,

? …

]

第13章 攔截器

1.??? 攔截器的定義,實(shí)現(xiàn)HandlerInterceptor接口褂傀,實(shí)現(xiàn)接口的哪三個(gè)方法忍啤。分別在什么時(shí)候執(zhí)行?

1) preHandle()方法:該方法在控制器的處理請(qǐng)求方法之前執(zhí)行仙辟,其返回值表示是否中斷后續(xù)操作同波。返回true表示繼續(xù)向下執(zhí)行,返回false表示中斷后續(xù)操作叠国。

2) postHandle()方法:該方法在控制器的處理請(qǐng)求方法調(diào)用之后未檩,解析視圖之前執(zhí)行∷诤福可以通過(guò)此方法對(duì)請(qǐng)求域中的模型和視圖做進(jìn)一步的修改冤狡。

3) afterCompletion()方法:該方法在控制器的處理請(qǐng)求方法執(zhí)行完成后執(zhí)行,即視圖渲染結(jié)束后執(zhí)行吆玖⊥怖#可以通過(guò)此方法實(shí)現(xiàn)一些資源清理、記錄日志信息等工作沾乘。


2.??? 攔截器的配置怜奖,path的值

1)?? /**的意思是所有文件夾及里面的子文件夾

2)?? /*是所有文件夾,不含子文件夾

3)?? /是web項(xiàng)目的根目錄


第17章 文件的上傳和下載

1.??? 文件上傳翅阵,表單的enctype屬性值必須設(shè)置為multipart/form-data

2.??? 文件上傳是通過(guò)MultipartResolver 對(duì)象實(shí)現(xiàn)的歪玲,

defaultEncoding="UTF-8"?

maxUploadSize="5400000"?

uploadTempDir="fileUpload/temp"

defaultEncoding="UTF-8" //是請(qǐng)求的編碼格式迁央,默認(rèn)為iso-8859-1

maxUploadSize="5400000"http://是允許上傳文件的最大值,單位為字節(jié)

uploadTempDir="fileUpload/temp" //為上傳文件的臨時(shí)路徑


第19章 SSM框架整合

分別 寫(xiě)出各個(gè)配置文件的配置步驟

1.???? web.xml

2.???? applicationContext.xml

3.???? springmvc-servlet.xml

4.???? mybatis-config.xml???

1.????寫(xiě)出SSM框架整合滥崩,配置文件web.xml的基本配置步驟

① 實(shí)例化applicationContext容器

② 配置前端控制器

③ 定義過(guò)濾器解決post提交亂碼問(wèn)題

2.??? 寫(xiě)出SSM框架整合岖圈,配置文件 applicationContext.xml的基本配置步驟。

答:

1)?? 開(kāi)啟包掃描 Service

2)?? 配置數(shù)據(jù)源(driverClassName钙皮、url蜂科、username、password)

3)?? 配置事務(wù)管理器

4)?? 基于XML聲明式事務(wù)處理(配置事務(wù)通知短条、配置事務(wù)切面)导匣;??????????????? 基于注解的聲明式事務(wù)處理(開(kāi)啟事務(wù)注解)

5)?? 配置MyBatis工廠(chǎng)(屬性dataSource:加載數(shù)據(jù)源,屬性configLocation:指定mybatis核心配置文件的路徑)

6)?? 配置Mapper代理開(kāi)發(fā)茸时,使用Spring自動(dòng)掃描MyBatis的接口并裝配贡定,Spring將指定包中所有被@Mapper注解的接口自動(dòng)裝配為MyBatis的映射接口。

3.???寫(xiě)出SSM框架整合可都, 配置文件springmvc-servlet.xml的基本配置步驟缓待。

① 開(kāi)啟包掃描,掃描控制器類(lèi)

② 開(kāi)啟mvc注解渠牲,允許靜態(tài)資源可見(jiàn)

③ 配置視圖解析器(prefix:配置前綴旋炒,suffix:配置后綴)

4.????MyBatis核心配置文件的配置

?<mappers>

?? <!-- 映射器,告訴 MyBatis到哪里去找映射文件-->

??????? <mapper resource="com/mybatis/UserMapper.xml"/>

??????? <mapper resource="com/mybatis/ProdMapper.xml"/>

?</mappers>


參考試題 Spring試題

https://wenku.baidu.com/view/0c81274586c24028915f804d2b160b4e767f81d5.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嘱兼,一起剝皮案震驚了整個(gè)濱河市国葬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芹壕,老刑警劉巖汇四,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異踢涌,居然都是意外死亡通孽,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)睁壁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)背苦,“玉大人,你說(shuō)我怎么就攤上這事潘明⌒屑粒” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵钳降,是天一觀的道長(zhǎng)厚宰。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么铲觉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任澈蝙,我火速辦了婚禮,結(jié)果婚禮上撵幽,老公的妹妹穿的比我還像新娘灯荧。我一直安慰自己,他們只是感情好盐杂,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布逗载。 她就那樣靜靜地躺著,像睡著了一般况褪。 火紅的嫁衣襯著肌膚如雪撕贞。 梳的紋絲不亂的頭發(fā)上更耻,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天测垛,我揣著相機(jī)與錄音,去河邊找鬼秧均。 笑死食侮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的目胡。 我是一名探鬼主播锯七,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼誉己!你這毒婦竟也來(lái)了眉尸?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤巨双,失蹤者是張志新(化名)和其女友劉穎噪猾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體筑累,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袱蜡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了慢宗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坪蚁。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖镜沽,靈堂內(nèi)的尸體忽然破棺而出敏晤,到底是詐尸還是另有隱情,我是刑警寧澤缅茉,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布嘴脾,位于F島的核電站,受9級(jí)特大地震影響宾舅,放射性物質(zhì)發(fā)生泄漏统阿。R本人自食惡果不足惜彩倚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扶平。 院中可真熱鬧帆离,春花似錦、人聲如沸结澄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)麻献。三九已至们妥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勉吻,已是汗流浹背监婶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留齿桃,地道東北人惑惶。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像短纵,于是被迫代替她去往敵國(guó)和親带污。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis 香到? MyBatis 是支持定制化 SQL鱼冀、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的...
    笨鳥(niǎo)慢飛閱讀 5,532評(píng)論 0 4
  • 這部分主要是開(kāi)源Java EE框架方面的內(nèi)容,包括Hibernate悠就、MyBatis千绪、Spring、Spring ...
    雜貨鋪老板閱讀 1,396評(píng)論 0 2
  • 1.JVM 堆內(nèi)存和非堆內(nèi)存 堆和非堆內(nèi)存按照官方的說(shuō)法:“Java 虛擬機(jī)具有一個(gè)堆(Heap)理卑,堆是運(yùn)行時(shí)數(shù)據(jù)...
    yanzhu728閱讀 919評(píng)論 0 0
  • 還記得讀小學(xué)的同學(xué)有兩個(gè)翘紊,他們的名字一個(gè)叫邱瑞,一個(gè)叫楊萬(wàn)朋藐唠,他們都和我玩的近帆疟,那時(shí)候,我還記得邱瑞和我每天下午一...
    杜孫爽閱讀 117評(píng)論 0 1
  • 昔日民不聊生的場(chǎng)景再現(xiàn)宇立,能理解有識(shí)之士奮起抗戰(zhàn)的大游行和知識(shí)分子愛(ài)國(guó)情懷踪宠,為了對(duì)抗變態(tài)和保護(hù)家人安全,作息時(shí)間調(diào)整...
    時(shí)過(guò)境遷的考拉閱讀 198評(píng)論 0 0