1.SSM框架
Spring的優(yōu)點(diǎn):
①低侵入式設(shè)計(jì),代碼污染極低。
②IOC將對(duì)象之間的依賴關(guān)系交由框架處理,降低組件的耦合性。
③AOP支持允許將一些通用任務(wù)如安全、事務(wù)、日志等進(jìn)行集中式管理,從而提供了更好的復(fù)用。
2.Spring的基礎(chǔ)理念
1)IOC控制反轉(zhuǎn)
控制反轉(zhuǎn),是面向?qū)ο缶幊讨械囊环N設(shè)計(jì)原則,可以用來(lái)減低計(jì)算機(jī)代碼之間的耦合度。其中最常見(jiàn)的方式叫做依賴注入(DI),還有一種方式叫“依賴查找”。通過(guò)控制反轉(zhuǎn),對(duì)象在被創(chuàng)建的時(shí)候,由一個(gè)調(diào)控系統(tǒng)內(nèi)所有對(duì)象的外界實(shí)體將其所依賴的對(duì)象的引用傳遞給它。也可以說(shuō),依賴被注入到對(duì)象中。
①切換作用域
Ⅰsingleton:在spring IOC容器中默認(rèn)方式(單例模式)。
Ⅱprototype:每次從容器中取出bean的時(shí)候都返回一個(gè)新的實(shí)例。
Ⅲsession:同一個(gè)Http Session共享一個(gè)Bean,不同的session使用不同的bean,該作用域僅僅適用于WebAppplicationContext環(huán)境。
Ⅳrequest:每次Http請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的Bean,該作用域僅僅適用于WebAppplicationContext環(huán)境。
②依賴注入的實(shí)現(xiàn)方式
Ⅰsetter注入:指的就是在接受注入的類(lèi)中定義一個(gè)Set方法,并在參數(shù)中定義需要注入的元素。
Ⅱ構(gòu)造器注入:構(gòu)造注入指的就是接受注入的類(lèi)中定義一個(gè)構(gòu)造方法,并在參數(shù)中定義需要注入的元素。
Ⅲ接口注入:指的就是在接口中定義要注入的信息,并通過(guò)接口完成注入。
③自動(dòng)裝配
Ⅰ@Autowired自動(dòng)裝配在Spring中定義好的對(duì)象。
Ⅱ遇到一個(gè)接口多個(gè)實(shí)現(xiàn)類(lèi)的時(shí)候,如果要區(qū)分裝載接口……
Ⅲ@Primary注解在實(shí)現(xiàn)類(lèi)中,告知Spring框架當(dāng)前類(lèi)是默認(rèn)實(shí)現(xiàn)類(lèi),如果沒(méi)有特殊注解,那么就裝配當(dāng)前類(lèi)。
Ⅳ@Qualifier(name) 注解添加在自動(dòng)裝配的變量上,告知Spring,需要裝配的是名稱為name的實(shí)現(xiàn)類(lèi)。
2)AOP面向切面編程(Aspect Orient Programming)
AOP是一種編程思想,是OOP的一種補(bǔ)充。
①面向切面編程術(shù)語(yǔ)
切面:Aspect 通知:Adice 引入:Introduction 切點(diǎn):Pointcut 連接點(diǎn):join point 織入:Weaving
②Spring實(shí)現(xiàn)AOP攔截功能的方式
Ⅰ使用XML配置AOP。
Ⅱ使用@AspectJ注解驅(qū)動(dòng)切面。
Ⅲ使用AspectJ注入切面。
Ⅳ使用ProxyFactoryBean和對(duì)應(yīng)的接口實(shí)現(xiàn)。
3.SpringMVC
MVC:
ⅠModel:@Service注解的類(lèi)
ⅡView:.jsp、.html、.htm…
ⅢController:@Controller注解的類(lèi)
①核心入口文件: DispatcherServlet
②獲取請(qǐng)求參數(shù)的方式
Ⅰ通過(guò)形參列表直接獲取。
Ⅱ使用@RequestParam注解獲取。
Ⅲ使用@PathVariable 獲取url地址參數(shù)。
Ⅳ使用@RequestBody獲取JSON。
③可以直接在形參中實(shí)例化的對(duì)象:HttpServletRequest、HttpServletResponse、HttpSession、Model、ModelMap、ModelAndView
@ResponseBody將Controller返回對(duì)象轉(zhuǎn)換為Json字符串,不再返回視圖,只返回Json字符串。
④SpringMVC的工作流程

ⅠDispatcherServlet表示前置控制器,是整個(gè)SpringMVC的控制中心。用戶發(fā)出請(qǐng)求,DispatcherServlet接收請(qǐng)求并攔截請(qǐng)求。
ⅡHandlerMapping為處理器映射。DispatcherServlet調(diào)用HandlerMapping,HandlerMapping根據(jù)請(qǐng)求url查找Handler。
ⅢHandlerExecution表示具體的Handler,其主要作用是根據(jù)url查找控制器。
ⅣHandlerExecution將解析后的信息傳遞給DispatcherServlet,如解析控制器映射等。
ⅤHandlerAdapter表示處理器適配器,其按照特定的規(guī)則去執(zhí)行Handler。
ⅥHandler讓具體的Controller執(zhí)行。
ⅦController將具體的執(zhí)行信息返回給HandlerAdapter,如ModelAndView。
ⅧHandlerAdapter將視圖邏輯名或模型傳遞給DispatcherServlet。
ⅨDispatcherServlet調(diào)用視圖解析器(ViewResolver)來(lái)解析HandlerAdapter傳遞的邏輯視圖名。
Ⅹ視圖解析器將解析的邏輯視圖名傳給DispatcherServlet。
ⅪDispatcherServlet根據(jù)視圖解析器解析的視圖結(jié)果,調(diào)用具體的視圖。
Ⅻ最終視圖呈現(xiàn)給用戶。
4.MyBatis
MyBatis和Hibernate的優(yōu)缺點(diǎn):
①Hibernate的優(yōu)點(diǎn):
Ⅰhibernate是全自動(dòng),hibernate完全可以通過(guò)對(duì)象關(guān)系模型實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作,擁有完整的JavaBean對(duì)象與數(shù)據(jù)庫(kù)的映射結(jié)構(gòu)來(lái)自動(dòng)生成sql。
Ⅱ功能強(qiáng)大,數(shù)據(jù)庫(kù)無(wú)關(guān)性好,O/R映射能力強(qiáng),需要寫(xiě)的代碼很少,開(kāi)發(fā)速度很快。
Ⅲ有更好的二級(jí)緩存機(jī)制,可以使用第三方緩存。
Ⅳ數(shù)據(jù)庫(kù)移植性良好。
Ⅴhibernate擁有完整的日志系統(tǒng),hibernate日志系統(tǒng)非常健全,涉及廣泛,包括sql記錄、關(guān)系異常、優(yōu)化警告、緩存提示、臟數(shù)據(jù)警告等。
②Hibernate的缺點(diǎn):
Ⅰ學(xué)習(xí)門(mén)檻高,精通門(mén)檻更高,程序員如何設(shè)計(jì)O/R映射,在性能和對(duì)象模型之間如何取得平衡,以及怎樣用好Hibernate方面需要的經(jīng)驗(yàn)和能力都很強(qiáng)才行。
Ⅱhibernate的sql很多都是自動(dòng)生成的,無(wú)法直接維護(hù)sql;雖然有hql查詢,但功能還是不及sql強(qiáng)大,見(jiàn)到報(bào)表等變態(tài)需求時(shí),hql查詢要虛,也就是說(shuō)hql查詢是有局限的;hibernate雖然也支持原生sql查詢,但開(kāi)發(fā)模式上卻與orm不同,需要轉(zhuǎn)換思維,因此使用上有些不方便??傊畬?xiě)sql的靈活度上hibernate不及mybatis。
③Mybatis的優(yōu)點(diǎn):
Ⅰ易于上手和掌握,提供了數(shù)據(jù)庫(kù)查詢的自動(dòng)對(duì)象綁定功能,而且延續(xù)了很好的SQL使用經(jīng)驗(yàn),對(duì)于沒(méi)有那么高的對(duì)象模型要求的項(xiàng)目來(lái)說(shuō),相當(dāng)完美。
Ⅱsql寫(xiě)在xml里,便于統(tǒng)一管理和優(yōu)化, 解除sql與程序代碼的耦合。
Ⅲ提供映射標(biāo)簽,支持對(duì)象與數(shù)據(jù)庫(kù)的orm字段關(guān)系映射。
Ⅳ 提供對(duì)象關(guān)系映射標(biāo)簽,支持對(duì)象關(guān)系組建維護(hù)。
Ⅴ提供xml標(biāo)簽,支持編寫(xiě)動(dòng)態(tài)sql。
Ⅵ速度相對(duì)于Hibernate的速度較快。
④Mybatis的缺點(diǎn):
Ⅰ關(guān)聯(lián)表多時(shí),字段多的時(shí)候,sql工作量很大。
Ⅱsql依賴于數(shù)據(jù)庫(kù),導(dǎo)致數(shù)據(jù)庫(kù)移植性差。
Ⅲ由于xml里標(biāo)簽id必須唯一,導(dǎo)致DAO中方法不支持方法重載。
Ⅳ對(duì)象關(guān)系映射標(biāo)簽和字段映射標(biāo)簽僅僅是對(duì)映射關(guān)系的描述,具體實(shí)現(xiàn)仍然依賴于sql。
ⅤDAO層過(guò)于簡(jiǎn)單,對(duì)象組裝的工作量較大。
Ⅵ不支持級(jí)聯(lián)更新、級(jí)聯(lián)刪除。
ⅦMybatis的日志除了基本記錄功能外,其它功能薄弱很多。
Ⅷ編寫(xiě)動(dòng)態(tài)sql時(shí),不方便調(diào)試,尤其邏輯復(fù)雜時(shí)。
Ⅸ提供的寫(xiě)動(dòng)態(tài)sql的xml標(biāo)簽功能簡(jiǎn)單,編寫(xiě)動(dòng)態(tài)sql仍然受限,且可讀性低。
MyBatis的前身是IBatis。
MyBatis關(guān)鍵內(nèi)容:
①核心組件:SqlSessionFactoryBuilder、SqlSessionFactory(作為二級(jí)緩存的緩存對(duì)象,可以通過(guò)XML構(gòu)建,可以通過(guò)代碼構(gòu)建)、SqlSession(獲取Mapper接口,發(fā)送Sql給數(shù)據(jù)庫(kù),作為一級(jí)緩存的緩存對(duì)象,控制數(shù)據(jù)庫(kù)的事務(wù))、Sql-Mapper(可以消除SqlSession帶來(lái)的功能性代碼,提高代碼可讀性)
②映射器.xml
Ⅰ功能列表:描述映射規(guī)則、提供SQL語(yǔ)句、配置緩存、提供動(dòng)態(tài)SQL
Ⅱcache:使用了緩存,在緩存中有需要的數(shù)據(jù),不用從數(shù)據(jù)庫(kù)中獲取轉(zhuǎn)而從緩存中獲取,大大提高了系統(tǒng)性能。
ⅢresultMap:可以將查詢到的復(fù)雜數(shù)據(jù)(比如查詢到幾個(gè)表中數(shù)據(jù))映射到一個(gè)結(jié)果集當(dāng)中。
Ⅲsql:提供了動(dòng)態(tài)SQL,也就是可以根據(jù)用戶提供的參數(shù),動(dòng)態(tài)決定查詢語(yǔ)句依賴的查詢條件或SQL語(yǔ)句的內(nèi)容。
Ⅳinclude:通過(guò)include標(biāo)簽使SQL片段達(dá)到代碼復(fù)用的目的。
下方的操作是DML和DQL:insert、delete、update、select(增刪改查)
③動(dòng)態(tài)SQL標(biāo)簽:if、foreach、trim、choose when otherwise、bind、where、set
④標(biāo)簽屬性
Ⅰtype:在resultMap定義類(lèi)的完整路徑。
ⅡparameterType:請(qǐng)求參數(shù)的數(shù)據(jù)類(lèi)型。
ⅢresultType:指定返回結(jié)果的匹配類(lèi)型,自動(dòng)將結(jié)果轉(zhuǎn)換為目標(biāo)對(duì)象。
ⅣresultMap:使用結(jié)果集的方式來(lái)將結(jié)果轉(zhuǎn)換為目標(biāo)對(duì)象。(以上二選一)
Ⅴid:同一個(gè)文件內(nèi)id不能重復(fù),id和Mapper的命名空間(namespace)結(jié)合起來(lái)是唯一的。
⑤配置文件的配置元素
<configuration>
<!-- 使用方式:property子元素,properties文件,代碼傳遞 -->
<properties/>
<settings/>
<typeAliases/>
<typeHandlers/>
<objectFactory/>
<plugins/>
<environments>
<environment>
<transactionManager/>
<dataSource/>
</environment>
</environments>
</configuration>
5.編程題詳解
1)定義UserMapper接口
package com.ping.dao;
import com.ping.pojo.User;
public interface UserMapper {
//插入用戶數(shù)據(jù)
int add(User user);
}
2)在全局配置文件mappers.xml文件中加載UserMapper接口
<mappers>
<mapper class="com.ping.dao.UserMapper"/>
</mappers>
3)編寫(xiě)UserMapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ping.dao.UserMapper">
<insert id="add" parameterType="user">
insert into mybatis.user (id, name, gender, age, birth, address) values (#{id}, #{name}, #{gender}, #{age}, #{birth}, #{address});
</insert>
</mapper>