作者: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