Mybatis
- 簡介
mybatis
支持普通sql查詢,存儲過程和高級映射的優(yōu)秀持久層框架惩猫,Mybatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢查,Mybatis使用簡單的xml或注解用于配置和原始映射震鹉,將接口和Java的POJO(plan old Java Object)
普通的Java對象映射成數(shù)據(jù)庫的記錄- 每個(gè)mybatis應(yīng)用程序主要都是使用SqlSessionFaction實(shí)例的易桃,一個(gè)sqlSessionFaction實(shí)例可以通過sqlSessionFactionBuilder獲得,SqlSessionFactionBuilder可以從一個(gè)xml配置文件或者一個(gè)預(yù)定義的配置類的實(shí)例獲得
- mybatis有一個(gè)實(shí)用類(Resources)它由很多方法,可以很方便地從類路徑及其他位置加載資源
- 流程
- 加載配置并初始化
- 觸發(fā)條件:加載配置文件
- 將sql的配置信息加載成為一個(gè)個(gè)mappedStatment對象炭臭,包括了傳入?yún)?shù)映射
- 配置執(zhí)行的sql語句永脓,結(jié)果集映射配置,存儲在內(nèi)存中
- 接受調(diào)用請求
- 觸發(fā)條件:調(diào)用mybatis提供的API
- 傳入?yún)?shù):為sql的id和傳入?yún)?shù)對象
- 處理過程:將請求傳遞給下層的請求處理層進(jìn)行處理
- 處理操作請求
- 觸發(fā)條件:API接口層傳遞請求過來
- 傳入?yún)?shù):為sql的id和傳入?yún)?shù)對象
- 處理過程:
- 加載配置并初始化
- 根據(jù)sql的id查找對應(yīng)的MappedStatment對象
- 根據(jù)傳入?yún)?shù)對象解析MappedStatment對象鞋仍,得到最終要執(zhí)行的sql和執(zhí)行傳入的參數(shù)
- 獲取數(shù)據(jù)連接常摧,根據(jù)得到最終的sql語句和執(zhí)行傳入?yún)?shù)到數(shù)據(jù)庫執(zhí)行,并得到執(zhí)行結(jié)果
- 根據(jù)MappedStatment對象中的結(jié)果映射配置對得到的執(zhí)行結(jié)果進(jìn)行轉(zhuǎn)換處理威创,并得到最終的處理結(jié)果
- 釋放連接資源
- 返回處理結(jié)果將最終的處理結(jié)果返回
- 功能架構(gòu)(三層)
- API接口層:
提供給外部使用的接口API落午,開發(fā)人員通過本地API操作數(shù)據(jù)庫,接口層接到調(diào)用請求肚豺,就會調(diào)用數(shù)據(jù)處理來完成具體的數(shù)據(jù)處理
- 數(shù)據(jù)處理層:
負(fù)責(zé)具體的sql查找溃斋、解析、執(zhí)行和執(zhí)行結(jié)果映射處理等详炬,主要的目的是根據(jù)調(diào)用的請求完成一次數(shù)據(jù)庫的操作
- 基礎(chǔ)支持層
負(fù)責(zé)最基礎(chǔ)的功能支撐盐类,包括連接管理、事務(wù)管理呛谜、配置加載和緩存處理在跳,這些都是共用的東西,將他們抽取出來做最基礎(chǔ)的組件隐岛,為上層的數(shù)據(jù)處理層提供最基礎(chǔ)的支撐
- 框架結(jié)構(gòu)
- 加載配置
配置來源于兩個(gè)地方:
1).配置文件中
2).Java代碼的注解猫妙,將sql的配置信息加載為一個(gè)MappedStatment對象(包括傳入?yún)?shù)映射配置,執(zhí)行sql語句聚凹,結(jié)果映射配置)存儲在內(nèi)存中
- sql解析
當(dāng)API接口層接收到調(diào)用請求時(shí)割坠,會接收到傳入sql的id和傳入對象(可以是map、JavaBean或基本類型)妒牙,mybatis會根據(jù)sql的id找到對應(yīng)的MappedStatment彼哼,然后傳入?yún)?shù)對象的MappedStatment進(jìn)行解析,解析后可以得到最終的要執(zhí)行的sql語句和參數(shù)
- sql執(zhí)行
將最終得到的sql和參數(shù)拿到數(shù)據(jù)庫進(jìn)行執(zhí)行湘今,得到操作數(shù)據(jù)庫的結(jié)果
- 結(jié)果映射
將操作數(shù)據(jù)庫的結(jié)果按照映射的配置進(jìn)行轉(zhuǎn)換敢朱,可以轉(zhuǎn)換成HashMap、JavaBean或者基本類型摩瞎,并將最終結(jié)果返回
mybatis中#{}與${}的區(qū)別
- ${}
是
properties
文件中的占位符拴签,可用于標(biāo)簽屬性值和sql
內(nèi)部,屬于靜態(tài)文本替換旗们,比如${driver}
會被靜態(tài)替換為com.mysql.jdbc.Driver
- #{}
是
sql
的參數(shù)占位符蚓哩,Mybatis
會將sql
中的#{}
替換為?
上渴,在sql
執(zhí)行前會使用preparedStatement
的參數(shù)設(shè)置方法岸梨,按序給sql
的喜颁?
占位符設(shè)置參數(shù)值,比如ps.setInt(0,ParameterValue)
,#{item.name}
的取值方式為使用反射從參數(shù)對象中獲取item
對象的name
屬性值盛嘿,相當(dāng)于param.getItem().getName()
洛巢。
XML映射文件中,除了常見的select
次兆、insert
稿茉、update
、delete
標(biāo)簽之外芥炭,還有哪些標(biāo)簽
<resultMap>
返回值類型漓库、<sql>
、<include>
园蝠、<selectKey>
加上動(dòng)態(tài)sql的9個(gè)標(biāo)簽(trim
渺蒿、where
、set
彪薛、foreach
茂装、if
、choose
善延、when
少态、otherwise
、bind
)其中<sql>
為sql
片段標(biāo)簽易遣,通過<include>
標(biāo)簽引入sql
片段彼妻,<selectKey>
為不支持自增的主鍵生產(chǎn)策略標(biāo)簽
一個(gè)XML文件都會寫一個(gè)Dao
接口與之對應(yīng),工作原理
Dao
接口豆茫,常說的mapper
接口侨歉,接口的權(quán)限名就是映射文件中的namespace
的值,接口的方法名揩魂,就是映射文件MappedStatment
的id
值幽邓,接口方法的參數(shù)就是傳遞給slq
的參數(shù),mapper
接口是沒有實(shí)現(xiàn)類的火脉,當(dāng)調(diào)用接口方法時(shí)颊艳,接口權(quán)限名+方法名拼接字符串作為key
值,可唯一定位一個(gè)mappedStatment
Dao
接口里的方法是不能重載的忘分,因?yàn)槭菣?quán)限名+方法名的保存和尋找策略
Mybatis是如何分頁的
mybatis
是使用RowBounds
對象進(jìn)行分頁的,針對ResultSet
結(jié)果集進(jìn)行的內(nèi)存分頁而非物理分頁白修,可以在sql
內(nèi)直接書寫帶有物理分頁的參數(shù)來完成物理分頁的功能
springMVC
- 是一個(gè)mvc框架妒峦,在web模型中,mvc是一種很流行的框架兵睛,通過把
model
肯骇、view
窥浪、controller
分離,把較為復(fù)雜的web應(yīng)用分成邏輯清晰的幾部分,是為了簡化開發(fā)笛丙,減少出錯(cuò)漾脂,或是為了組內(nèi)開發(fā)人員之間的配,總之就是一種分層工作的辦法 - 是spring的一個(gè)子框架胚鸯,當(dāng)然擁有spring的特性骨稿,如依賴注入,注解:RequestMapping姜钳,專門負(fù)責(zé)映射的url
spring是什么
spring是開源的輕量級的開發(fā)應(yīng)用框架坦冠,目的是用于簡化企業(yè)級應(yīng)用程序開發(fā)
- 原理
通過配置方式來創(chuàng)建對象,管理對象之間依賴關(guān)系哥桥,我們不需要通過工廠和生成器來創(chuàng)建及管理對象之間的依賴關(guān)系辙浑,這樣我們是不是減少了許多工作,加速了開發(fā)
spring框架除了幫助我們管理對象及其依賴關(guān)系拟糕,還提供了日志記錄判呕、性能統(tǒng)計(jì)、安全控制送滞、異常處理等面向切面的能力侠草,還能幫我們管理最頭疼的數(shù)據(jù)庫事務(wù),本身提供了一套簡單的JDBC訪問實(shí)現(xiàn)累澡,提供與第三方數(shù)據(jù)訪問框架集成(如Hibernate梦抢、JPA)與各種javaEE技術(shù)整合,提供一套自己的web層框架springMVC愧哟,而且還能非常簡單的與第三方web框架集成
- 作用
能幫助我們根據(jù)配置文件創(chuàng)建及組裝對象之間的依賴關(guān)系(無需重新編譯奥吩,只需要修改配置文件)
spring提供了與第三方數(shù)據(jù)訪問框架無縫集成,而且自己提供了一套JDBC/springMVC框架蕊梧,方便數(shù)據(jù)庫/web層搭建(第三方web【如struts霞赫、JSF】)
為什么需要spring
- 應(yīng)用程序
是能完成我們所需的功能的成品,比如:購物網(wǎng)站肥矢、OA系統(tǒng)
- 框架
是能夠完成功能的半產(chǎn)品端衰,框架規(guī)定了開發(fā)過程中的整體架構(gòu),提供了基礎(chǔ)功能
- 非侵入式設(shè)計(jì)
從框架角度可以理解為甘改,無需繼承框架提供的類
- POJO(plan old java Object)簡單的Java對象
它可以包含業(yè)務(wù)邏輯或持久化邏輯旅东,但不擔(dān)當(dāng)任何特殊角色且不繼承或不實(shí)現(xiàn)任何其他java框架的類或接口
- 輕量級及重量級
輕量級是相對于重量級而言的,輕量級一般是非入侵性的十艾,所依賴的東西非常少抵代,資源占用非常少,部署簡單忘嫉,極易使用荤牍,重量級相反
- 容器
裝對象的對象案腺,因?yàn)榇嬖诜湃搿⒛贸龅炔僮骺党常匀萜鬟€要管理對象的生命周期
- 控制反轉(zhuǎn)
即Inversion of Control(IOC)/ 依賴注入(Dependency Injection)劈榨,即由容器控制程序之間的關(guān)系,而非由程序直接操控
- Bean
一般指容器管理對象晦嵌,在spring中指springIOC容器管理對象
為什么使用spring
能幫助我們簡化應(yīng)用程序開發(fā)同辣,幫助我們創(chuàng)建和組裝對象,為我們管理事務(wù)耍铜,簡單的mvc框架邑闺,可以把spring看作是一個(gè)超級粘合平臺,能夠把很多技術(shù)整合在一起棕兼,形成一個(gè)整體陡舅,使系統(tǒng)結(jié)構(gòu)更出眾,更優(yōu)秀伴挚,從而加速我們程序開發(fā)
Spring的BeanFactory和ApplicationContext的區(qū)別
spring
使用BeanFactory
來實(shí)例化配置和管理對象靶衍,但是它只是一個(gè)接口,里面有一個(gè)getBean()
方法茎芋,我們一般都不直接用BeanFactory
颅眶,而是用它的實(shí)現(xiàn)類ApplicationContext
,這個(gè)類會自動(dòng)解析我們配置的applicationContext.xml
田弥,然后根據(jù)我們配置的bean
來new
對象涛酗,將new
好的對象放進(jìn)一個(gè)Map
中,鍵就是我們bean
的id
偷厦,值就是new
的對象
BeanFactory
是spring
中比較原始的Factory
商叹,如XMLBeanFactory
就是一種典型的BeanFactory
,原始的BeanFactory
無法支持spring
的許多插件只泼,例如:AOP剖笙、web應(yīng)用等
ApplicationContext
接口,它由BeanFactory
接口派生而來请唱,因而提供BeanFactory
所有的功能
容器是spring的核心
BeanFactory
是
spring
中比較原始的Factory
弥咪,如XMLBeanFactory
就是一種典型的BeanFactory
,原始的BeanFactory
無法支持spring
的許多插件十绑,例如:AOP聚至、web應(yīng)用等
ApplicationContext
三個(gè)實(shí)現(xiàn)類
classPathXMLApplication
:把上下文文件當(dāng)成類路徑資源FileSystemXMLApplication
:從文件系統(tǒng)中的XML文件載入上下文定義信息XMLWebApplicationContext
:從web系統(tǒng)中的XML文件載入上下文定義信息
- 作用
BeanFactory負(fù)責(zé)讀取Bean配置文檔,管理Bean的加載本橙,實(shí)例化晚岭,維護(hù)Bean之間的依賴關(guān)系,負(fù)責(zé)Bean的生命周期
ApplicationContext除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的框架功能
a. 國際化支持
b. 資源訪問
c. 時(shí)間傳遞(通過實(shí)現(xiàn)ApplicationContextAware接口)
常用的獲取ApplicationContext的方法
- FileSystemXMLApplicationConrext
從文件系統(tǒng)或者url指定的xml配置文件創(chuàng)建參數(shù)為配置文件名或文件名數(shù)組坦报。
- classPathXMLApplicationContext
從classPath的xml配置文件創(chuàng)建,可以從jar包中讀取配置文件