學(xué)習(xí)記錄之Spring-MyBatis框架總結(jié)
SpringBoot腳手架分析與設(shè)計(jì)
1.1:SpringBoot是什么?
????Spring Boot 是一個(gè)全新的Java軟件開(kāi)發(fā)框架,很多人把他理解為一個(gè)腳手架,它基于快速構(gòu)建理念,通過(guò)約定大于配置,開(kāi)箱即用的方式,來(lái)簡(jiǎn)化Spring項(xiàng)目的初始搭建以及開(kāi)發(fā)工程,提高開(kāi)發(fā)效率
1.2:Spring Boot核心優(yōu)勢(shì)是什么?
????SpringBoot為我們提供了起步依賴(lài)(Starter Dependency)、自動(dòng)配置(Auto Configuration)、健康檢查(Actator)、嵌入式服務(wù)(Tomcat,jeyyt)等核心特性,基于這些特性和優(yōu)勢(shì)可以更好的服務(wù)我們的開(kāi)發(fā)過(guò)程。可以更好的簡(jiǎn)化項(xiàng)目構(gòu)建,代碼編寫(xiě),項(xiàng)目配置、項(xiàng)目部署等,可以說(shuō)SpringBoot技術(shù)是大勢(shì)所趨。
1.3:SpringBoot 核心配置文件的類(lèi)型?
????SpringBoot提供了后綴為properties,yml,factories等類(lèi)型的配置文件。
1.4如何學(xué)習(xí)SpringBoot呢?
????先知其然(要清楚該功能要解決什么問(wèn)題),然后動(dòng)手實(shí)踐,逐步追本溯源,知其所以然
1.5SpringBoot的啟動(dòng)過(guò)程是怎樣的?
????在SpringBoot啟動(dòng)時(shí),其大概過(guò)程如圖所示

其基本啟動(dòng)過(guò)程描述如下:
?????基于配置加載類(lèi)(通過(guò)ClassLoader將指定為位置的類(lèi)讀取到內(nèi)存--底層通過(guò)現(xiàn)場(chǎng)調(diào)用IO從磁盤(pán)讀取到內(nèi)存)。
????對(duì)類(lèi)進(jìn)行分析(創(chuàng)建字節(jié)碼對(duì)象--Class類(lèi)型,通過(guò)反射獲取配置信息)。
????對(duì)于指定配置(例如有spring特定注解描述)的對(duì)象存儲(chǔ)其配置信息(借助BeanDefinition對(duì)象中存儲(chǔ)
????基于BeanDefinition對(duì)象中class的配置構(gòu)建類(lèi)的實(shí)例(Bean對(duì)象),并進(jìn)行bean對(duì)象的管理(可能會(huì)存到bean池)。
Spring框架分析與設(shè)計(jì)
2.1:Spring是一個(gè)什么框架
????Spring是一個(gè)資源整合框架,其核心是資源整合,然后以一種更加科學(xué)的方式對(duì)外提供服務(wù),例如提高對(duì)象的應(yīng)用效率,降低系統(tǒng)開(kāi)銷(xiāo),提高代碼的可維護(hù)性等等。其官方網(wǎng)址為spring.io
2.2:Spring框架中有哪些重要的模塊
????Spring IOC;Spring AOP;Spring WEB; Spring Data;
2.3: Spring框架是如何構(gòu)建對(duì)象?
????Spring框架中所有Bean對(duì)象都是通過(guò)BeanFactory接口類(lèi)型的工廠對(duì)象構(gòu)建的,此工程底層會(huì)基于Java中的反射技術(shù)進(jìn)行實(shí)現(xiàn),首先獲取類(lèi)的字節(jié)碼對(duì)象,然后基于字節(jié)碼對(duì)象獲取構(gòu)造方法,最后基于構(gòu)造方法對(duì)象構(gòu)建類(lèi)的實(shí)例對(duì)象;
2.4:如何理解Spring中IOC設(shè)計(jì)
????IOC是一種設(shè)計(jì)思想, 我們稱(chēng)之為控制反轉(zhuǎn),本質(zhì)上講解的是對(duì)象控制權(quán)問(wèn)題?;谶@種設(shè)計(jì)可以讓初學(xué)者將對(duì)象的控制權(quán)轉(zhuǎn)交給第三方,由第三方專(zhuān)業(yè)團(tuán)隊(duì)管理和應(yīng)用對(duì)象。這樣可以更好的避免對(duì)象非正確的使用方式,進(jìn)而更好改善對(duì)象在內(nèi)存中的科學(xué)應(yīng)用。這個(gè)IOC設(shè)計(jì)從生活角度就可以理解為由股票操盤(pán)手負(fù)責(zé)幫你進(jìn)行資金管理,(可以讓初級(jí)程序員坐享其成,因?yàn)槌跫?jí)程序員寫(xiě)的程序規(guī)范性不夠,資源應(yīng)用凡是不夠科學(xué))
2.5:為什么要將對(duì)象交給Spring管理
????Spring為我們的對(duì)象賦予了很多個(gè)更加科學(xué)的特性,例如延遲加載,作用域,生命周期方法(@PostConstruct、@PreDestory),以及運(yùn)行時(shí)的自動(dòng)依賴(lài)注入DI(降低耦合,提高程序的可維護(hù)性)機(jī)制等,基于這些特性可以更好的提高對(duì)象的應(yīng)用性能以及程序的可擴(kuò)展性。
DI(依賴(lài)注入-兵馬未動(dòng)糧草先行),依賴(lài)注入之前首先需要依賴(lài)查找(DL)--按類(lèi)型,名字
2.6:Spring框架中的Bean有什么特性
????Spring框架為了更加科學(xué)的管理和應(yīng)用Bean對(duì)象,為其設(shè)計(jì)相關(guān)特性,例如:懶加載(@Lazy)、作用域(@Scope)以及生命周期方法

2.7:Spring中 用于定義Bean對(duì)象什么周期方法的注解?
????@PostConstruct、@PreDestory
2.8:Spring中用于實(shí)現(xiàn)依賴(lài)注入的注解
????@Autowire(描述屬性,構(gòu)造方法,set方法,其他),默認(rèn)優(yōu)先按照類(lèi)型查找
????@Resource(描述屬性,構(gòu)造方法,set方法),默認(rèn)優(yōu)先按照名稱(chēng)查找
2.9: @Autowire注解有什么作用
????@Autowire由Spring框架等一,用于描述類(lèi)中屬性或相關(guān)方法(例如構(gòu)造方法)。Spring框架在項(xiàng)目運(yùn)行時(shí)假如發(fā)現(xiàn)由他管理Bean對(duì)象中由使用@Autowire注解描述的屬性或方法??梢园凑罩付ㄒ?guī)則為屬性賦值(DI),去基本規(guī)則是:首先要檢測(cè)容器中是否與屬性或方法參數(shù)類(lèi)型相匹配的對(duì)象,假如有并且只有一個(gè)則直接注入。其次假如檢測(cè)到有到有多個(gè),還會(huì)按照@Autowire描述的屬性或方法參數(shù)名稱(chēng)查找是否有名字匹配的對(duì)象,有則直接注入,沒(méi)有則拋出異常,最后假如我們沒(méi)有明確要求,必須要注入類(lèi)型為指定類(lèi)型,名字為指定名稱(chēng)的對(duì)象還可以使用@Qualifier注解對(duì)其屬性或參數(shù)進(jìn)行描述(此注解必須配合@Autowire注解使用)
2.10:描述下@Qualifier注解的作用
????@Qualifier注解用于描述屬性或方法參數(shù),當(dāng)有多個(gè)相同類(lèi)型的bean卻只需要自動(dòng)裝配時(shí),將@Qualifier注解和@Autowire注解組合使用以消除這種混淆,指定需要裝配的確切的bean

2.11:@Component和@Configuration注解的異同點(diǎn)
????@Component注解同錯(cuò)描述一般bean對(duì)象,比如具備一定通用性的對(duì)象。@Configuration注解同錯(cuò)用于描述Spring工程中的配置類(lèi),是哦一個(gè)增強(qiáng)版的@Component注解, 在配置類(lèi)中定義一些有@Bean注解描述的方法,然后通過(guò)這些方法對(duì)一些自己定義或第三方的bean進(jìn)行對(duì)象的創(chuàng)建和初始化。當(dāng)我們使用@Configuration注解描述一個(gè)配置類(lèi)時(shí),Spring框架底層會(huì)為這個(gè)@Configuration注解描述的配置類(lèi)創(chuàng)建一個(gè)CGLIB對(duì)象,然后有代理對(duì)象調(diào)用@Bean注解描述的方法,同時(shí)底層會(huì)檢測(cè)方法返回的Bean是否已創(chuàng)建,假如已創(chuàng)建則不再創(chuàng)建。使用@Component注解描述類(lèi)時(shí),系統(tǒng)底層并不會(huì)為此類(lèi)創(chuàng)建代理對(duì)象,只是創(chuàng)建當(dāng)前類(lèi)的對(duì)象,然后調(diào)用@Bean注解描述的方法,創(chuàng)建和初始化Bean,方法每調(diào)用一次就會(huì)創(chuàng)建一個(gè)新的對(duì)象;
2.12:說(shuō)說(shuō)你對(duì)Spring中JdbcTemplate的理解
????JdbcTemplate是Spring中提供一個(gè)封裝了JDBC操作的模板類(lèi),此類(lèi)基于模板方法模式定義了很多JDBC模板方法,簡(jiǎn)化了JDBC的一些基本操作步驟,可以更好提高我們的開(kāi)發(fā)效率,此類(lèi)在運(yùn)行時(shí)需要由Spring注入一個(gè)DataSource對(duì)象,然后基于DataSource可以獲取一個(gè)連接池,從池中獲取訪問(wèn)數(shù)據(jù)庫(kù)的鏈接
2.13:如何理解Spring中的MVC設(shè)計(jì)?
????MVC是一種分層架構(gòu)設(shè)計(jì)思想,是Mode,View,Controller的縮寫(xiě),是為了將復(fù)雜問(wèn)題簡(jiǎn)化而提出一種分而治之的設(shè)計(jì)套路,基于這種套路來(lái)提高代碼的可維護(hù)和可擴(kuò)展性。SpringMVC僅僅是Spring框架中WEB模塊基于MVC設(shè)計(jì)思想的落地實(shí)現(xiàn),簡(jiǎn)化了web請(qǐng)求和響應(yīng)的處理過(guò)程

2.14SpringMVC中異常是如何處理的?
????Spring工程中web模塊可以基于@RestControllerAdvice注解來(lái)哦定義全局異常處理類(lèi),然后借助全局異常處理類(lèi)規(guī)范進(jìn)行異常處理,大概過(guò)程如下

2.15:說(shuō)幾個(gè)Spring中用于定于組件的注解
????@Component
????@Service
????@Controller
????@Repository
????@Configuration
????@Bean
2.16: 說(shuō)幾個(gè)SpringMVC中描述方法的注解
????@RequsetMapping
????@PostMapping
????@GetMapping
????@DeleteMapping
????@PutMapping
????@PathMapping
????@ResponseBody
2.17:說(shuō)幾個(gè)SpringMVC中描述方法參數(shù)的注解
????@RequestParam
????@PathVariable
????@RequestBody
????@RequestPart(描述文件上傳的方法參數(shù))
2.18:說(shuō)說(shuō)SpringMVC中的攔截器
????Spring框架中定義的攔截器屬于SpringMVC模塊執(zhí)行鏈中的一個(gè)對(duì)象,其類(lèi)型為HandlerInterceptor,基于這個(gè)類(lèi)型的攔截其可以對(duì)后端@Controller注解描述的對(duì)象進(jìn)行請(qǐng)求和響應(yīng)的攔截。用于進(jìn)行一些預(yù)處理操作
2.19:@ResponseBody注解的作用
????@ResponseBody用于描述類(lèi)或者方法,用于告訴底層可以將方法的返回之轉(zhuǎn)換為Jsom格式的字符串,然后再寫(xiě)到響應(yīng)體響應(yīng)到客戶(hù)端。假如類(lèi)中所有方法都需要使用@ResponseBody注解進(jìn)行標(biāo)記,則可以直接使用@RestController對(duì)類(lèi)進(jìn)行描述;
2.20:如何理解Spring中AOP設(shè)計(jì)
????AOP(Aspect Orient Programming)是一種設(shè)計(jì)思想,是軟件設(shè)計(jì)領(lǐng)域中的面向切面編程,他是面向?qū)ο缶幊蹋∣OP)的一種補(bǔ)充和完善。實(shí)際項(xiàng)目中我們通常將面向?qū)ο罄斫鉃橐粋€(gè)靜態(tài)過(guò)程(例如一個(gè)系統(tǒng)由多少個(gè)模塊,一個(gè)模塊由哪些對(duì)象,對(duì)象有哪些屬性),面向切面理解為一個(gè)動(dòng)態(tài)過(guò)程(在對(duì)象運(yùn)行時(shí)動(dòng)態(tài)織入一些擴(kuò)展功能或控制對(duì)象執(zhí)行)。如圖所示:

2.21:SpringBoot工程中如何定義切面?
????基于@Aspect注解進(jìn)行描述,并交給Spring管理(使用@Aspect注解描述的類(lèi),再使用@Component注解進(jìn)行描述)
2.22:SpringBoot公測(cè)中的切面內(nèi)部如何東一切入點(diǎn)?
????基于@Pointcut注解并借助相關(guān)表達(dá)式進(jìn)行實(shí)現(xiàn)(@annotation,bean,execution,within,...)
2.23:SpringBoot工程中的切面內(nèi)部可以定義那些通知類(lèi)型?
????@Around(優(yōu)先級(jí)最高)
????@Before(優(yōu)先級(jí)僅次于around)
????@After(無(wú)論執(zhí)行邏輯成功與否最后都會(huì)執(zhí)行)
????@AfterReturning(業(yè)務(wù)邏輯正確結(jié)束后執(zhí)行)
????@AfterThrowing(業(yè)務(wù)邏輯異常結(jié)束后執(zhí)行)
2.24:SpringAOP實(shí)現(xiàn)原理是怎樣的?
????Spring中AOP設(shè)計(jì), 誰(shuí)在系統(tǒng)啟動(dòng)時(shí)為目標(biāo)類(lèi)型創(chuàng)建子類(lèi)或兄弟類(lèi)型對(duì)象,這樣的對(duì)象我們通常稱(chēng)之為動(dòng)態(tài)代理對(duì)象,然后通過(guò)動(dòng)態(tài)代理對(duì)象為目標(biāo)對(duì)象實(shí)現(xiàn)功能的擴(kuò)展,入土所示:

其中目標(biāo)類(lèi)型(XxxServiceImpl)創(chuàng)建器代理對(duì)象方式有兩種
????第一:JDK代理,借助JDK官方API為目標(biāo)對(duì)象類(lèi)型創(chuàng)建其兄弟類(lèi)型對(duì)象,但是目標(biāo)對(duì)象類(lèi)型需要實(shí)現(xiàn)相應(yīng)接口
????第二CGLB代理,借助CGLB庫(kù)為目標(biāo)對(duì)象類(lèi)型創(chuàng)建其子類(lèi)類(lèi)型對(duì)象,但是目標(biāo)對(duì)象類(lèi)型不能使用final修飾;
2.25SpringAOP切面有哪些關(guān)鍵元素?
????切入點(diǎn)(pointcut):定義了切入擴(kuò)展業(yè)務(wù)邏輯的位置(哪些方法運(yùn)行時(shí)切入擴(kuò)展業(yè)務(wù)),一般會(huì)通過(guò)表達(dá)式進(jìn)行相關(guān)定義,一個(gè)切面中可以定義多個(gè)切入點(diǎn);
????通知(Advice):內(nèi)部封裝擴(kuò)展業(yè)務(wù)邏輯的具體方法對(duì)象,一個(gè)切面中可以有多個(gè)通知(在切面的某個(gè)特定位置上執(zhí)行的動(dòng)作:擴(kuò)展功能)
????連接點(diǎn)(joinpoint):程序執(zhí)行過(guò)程中,封裝了某個(gè)正在執(zhí)行的目標(biāo)方法信息的對(duì)象,可以通過(guò)此對(duì)象獲取具體的目標(biāo)方法信息,甚至區(qū)調(diào)用目標(biāo)方法,連接點(diǎn)與切入點(diǎn)定義如圖:

我們可以簡(jiǎn)單的將機(jī)場(chǎng)的一個(gè)安檢口理解為連接點(diǎn),多個(gè)安檢口為切入點(diǎn),安全檢查過(guò)程看成是通知,總之,概念很晦澀難懂,多做例子,做完就會(huì)清晰。
2.26:SpringAOP的應(yīng)用場(chǎng)景有哪些?
????日志記錄
????事務(wù)控制
????權(quán)限控制
????緩存應(yīng)用
????異步操作
????限流熔斷
2.27:SpringAOP中描述通知方法的注解?
????@Around
????@Before
????@After
????@AfterThrowing
????@AfterReturning
2.28:說(shuō)說(shuō)Spring框架中支持的事務(wù)方式?
????Spring框架支持的事務(wù)方式主要由兩種:
????1.編程式事務(wù)管理:這意味著你通過(guò)編程的方式管理事務(wù),給你帶來(lái)極大的靈活性,但是男維護(hù)
????2.聲明式事務(wù)管理:這意味著你可以將業(yè)務(wù)戴拿和事務(wù)管理分離,你只需用注解和XML配置來(lái)管理事務(wù)
2.29:Spring中聲明式事務(wù)的實(shí)現(xiàn)方式?
????在類(lèi)或方法上添加@Transaction注解。(注解內(nèi)部的屬性結(jié)合業(yè)務(wù)進(jìn)行自定義即可)
2.30:Spring中定義了那些事務(wù)隔離級(jí)別?
????多個(gè)事務(wù)并發(fā)執(zhí)行可能會(huì)出現(xiàn)什么?(臟讀、不可重復(fù)讀、幻讀)
? ? 1 DEFAULT
????2 READ_UNCOMMITTED(讀未提交)
????3 READ_COMMITTED(讀提交)
????4 REPEATABLE_READ(可重復(fù)讀)
????5 SERIALIZABLE(可串行化,一般解決幻讀問(wèn)題)
2.31:SpringBoot中如何啟動(dòng)異步任務(wù)
????1.在啟動(dòng)類(lèi)或配置類(lèi)上添加@EnableAsync注解
????2.在執(zhí)行異步方法的類(lèi)上添加@Async注解
2.32:Spring中常見(jiàn)那些設(shè)計(jì)模式有那些?
????1.建造模式:BeanDefinitionBuilder
????2.簡(jiǎn)單工廠模式:BeanFactory
????3.工廠方法模式:ProxyFactoryBean
????4.單例模式:?jiǎn)卫鼴ean對(duì)象
????5.代理模式:AOP Proxy
????6.策略模式:AOP代理策略,SimpleInstantiationStrategy
????7.適配器模式:AdvisorAdapter
????8.模板方法模式:JdbcTemplate
????9.責(zé)任鏈模式:HandlerInterceptor
????10:.觀察者模式:ApplicationListener
3Spring Security安全框架分析與設(shè)計(jì)
3.1:SpringSecurity是什么?
????SpringSecurity是Spring生態(tài)中用于完成認(rèn)證、授權(quán)、鑒權(quán)的功能的一個(gè)安全框架,類(lèi)似的這樣框架在市場(chǎng)上還有Apache Shiro(輕量級(jí),配置簡(jiǎn)單),這個(gè)框架前期也應(yīng)用比較廣泛,但是沒(méi)有SpringSecurity功能強(qiáng)大
3.2:SpringSecurity框架中有按需核心API對(duì)象?
????XxxFilter(判斷用戶(hù)是否已經(jīng)認(rèn)證)
????AuthenticationManger(服務(wù)完成用戶(hù)身份認(rèn)證的對(duì)象)
????UserDetailService(負(fù)責(zé)獲取用戶(hù)詳細(xì)的對(duì)象)
????BCryptPasswordEncoder(消息摘要+隨機(jī)鹽)
3.3:SpringSecurity的配置類(lèi)中你配置過(guò)什么
????那些請(qǐng)求不需要認(rèn)證(匿名即可訪問(wèn)--游客)
????那些需求必須認(rèn)證
????認(rèn)證成功或失敗返回什么
????跨域攻擊
????......
3.4:SpringSecurity框架中你用過(guò)什么注解?
????@PreAuthorize(“hasAutorize(‘sys:log:delete’)”)
3.5:SpringSecurity用戶(hù)登錄狀態(tài)你存儲(chǔ)到了哪里?
????方案1:存儲(chǔ)到對(duì)象Httpsession中
????方案2:可以存儲(chǔ)到redis
????方案3:可以存儲(chǔ)到j(luò)wt中
3.6:JWT是什么以及構(gòu)成?
????是Json Web Token的縮寫(xiě),一種令牌格式,通常用于在網(wǎng)絡(luò)見(jiàn)傳遞用戶(hù)信息,它由Header、Payload、簽名部分構(gòu)成,其中Header和payload部分會(huì)使用Base64算法進(jìn)行編碼,然后為了保證令牌不會(huì)被篡改,可以對(duì)令牌進(jìn)行簽名。
3.7:Oauth2是什么?
????Oauth是一個(gè)規(guī)范化的認(rèn)證協(xié)議,定義了客戶(hù)端與服務(wù)端交互時(shí)認(rèn)證規(guī)范,例如,如何實(shí)現(xiàn)三方認(rèn)證(類(lèi)似登錄時(shí)使用微信登錄、QQ登錄)通常我們?cè)谑褂肙auth2時(shí)要明確規(guī)定:
????1.客戶(hù)端攜帶什么信息區(qū)認(rèn)證,區(qū)哪里認(rèn)證?(不是任何請(qǐng)求都可以進(jìn)行認(rèn)證)
????2.服務(wù)端有誰(shuí)來(lái)認(rèn)證?(具體的認(rèn)證管理器是誰(shuí))
????3.認(rèn)證通過(guò)頒發(fā)什么令牌?(普通令牌--UUID,JWT)
4MyBatis框架分析與設(shè)計(jì)
4.1:MyBatis 是什么?
????MyBatis 是一個(gè)優(yōu)秀的Java持久層(數(shù)據(jù)訪問(wèn)層)框架,有apache的ibatis演變而來(lái),他通過(guò)XML或注解凡是將對(duì)象與SQL關(guān)聯(lián)起來(lái),實(shí)現(xiàn)了對(duì)JDBC操作的封裝,簡(jiǎn)化了JDBC代碼手動(dòng)設(shè)置參數(shù)和手動(dòng)進(jìn)行結(jié)果集映射的過(guò)程

4.2:MyBatis 常用官方網(wǎng)址/
????http://mybatis.org/mybatis-3(mabayis基礎(chǔ))
????http://mybatis.org/spring(傳統(tǒng)spring工程系mybatis的整合)
????http://mybatis.org/spring/boot.html(springboot工程下mybatis的整合)
4.3:MyBatis 框架有什么優(yōu)勢(shì)
????可以更好的實(shí)現(xiàn)JAVA代碼與SQL語(yǔ)句的分離,提高可維護(hù)性
????通過(guò)動(dòng)態(tài)SQL可以更好的適配靈活的需求變更。(最大優(yōu)勢(shì)-if,choose,for each ,trim)
????通過(guò)SQL映射簡(jiǎn)化了JDBC代碼中SQL參數(shù)及其結(jié)果集處理(很多框架都有)
????合理的架構(gòu)設(shè)計(jì),提高了系統(tǒng)的穩(wěn)定性,訪問(wèn)性能,可擴(kuò)展性
4.4:MyBatis 有什么劣勢(shì)
????SQL語(yǔ)句編寫(xiě)的工作量相對(duì)較大、(相對(duì)于hibernate框架-HQL)
????SQL語(yǔ)句依賴(lài)于數(shù)據(jù)庫(kù),移植性相對(duì)較差
4.5:MyBatis 的應(yīng)用架構(gòu)是怎樣的?

4.6:SpringBoot工程下MyBatis框架的整合?
????1.確定已經(jīng)配置好數(shù)據(jù)源(DataSource)
????2.添加依賴(lài)(mybatis-spring-boot-starter)
????3.基礎(chǔ)配置(可選,基于業(yè)務(wù)實(shí)踐有選擇性的進(jìn)行配置)
????4.創(chuàng)建數(shù)據(jù)訪問(wèn)接口及方法并定義SQL映射
????5.定義單元測(cè)試類(lèi),對(duì)具體業(yè)務(wù)方法進(jìn)行單元測(cè)試
4.7:?MyBatis中核心API有哪些?
????1.SqlSessionFactory(會(huì)話工廠,負(fù)責(zé)創(chuàng)建具體的會(huì)話對(duì)象-SqlSession)
????2.SqlSession(會(huì)話接口對(duì)象)
????3.DefaultSqlSession(此對(duì)象為會(huì)話接口的具體實(shí)現(xiàn))
????4.SqlSessionTemplate(線程安全SqlSession對(duì)象,底層基于模板方法模式進(jìn)行了封裝)