框架架構(gòu)
加載配置:配置來源于兩個地方无宿,一處是配置文件茵汰,一處是Java代碼的注解,將SQL的配置信息加載成為一個個MappedStatement對象(包括了傳入?yún)?shù)映射配置孽鸡、執(zhí)行的SQL語句蹂午、結(jié)果映射配置),存儲在內(nèi)存中彬碱。
Mybatis和數(shù)據(jù)庫交互的兩種方式:(1)傳統(tǒng)的MyBatis提供的API(2)使用Mapper接口SQL解析:當(dāng)API接口層接收到調(diào)用請求時豆胸,會接收到傳入SQL的ID和傳入對象(可以是Map、JavaBean或者基本數(shù)據(jù)類型)巷疼,Mybatis會根據(jù)SQL的ID找到對應(yīng)的MappedStatement晚胡,然后根據(jù)傳入?yún)?shù)對象對MappedStatement進(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或者基本數(shù)據(jù)類型,并將最終結(jié)果返回爆阶。
功能架構(gòu)
API接口層:提供給外部使用的接口API燥透,開發(fā)人員通過這些本地API來操縱數(shù)據(jù)庫沙咏。接口層一接收到調(diào)用請求就會調(diào)用數(shù)據(jù)處理層來完成具體的數(shù)據(jù)處理。
數(shù)據(jù)處理層:負(fù)責(zé)具體的SQL查找班套、SQL解析肢藐、SQL執(zhí)行和執(zhí)行結(jié)果映射處理等。它主要的目的是根據(jù)調(diào)用的請求完成一次數(shù)據(jù)庫操作吱韭。
基礎(chǔ)支撐層:負(fù)責(zé)最基礎(chǔ)的功能支撐吆豹,包括連接管理、事務(wù)管理理盆、配置加載和緩存處理痘煤,這些都是共用的東西,將他們抽取出來作為最基礎(chǔ)的組件猿规。為上層的數(shù)據(jù)處理層提供最基礎(chǔ)的支撐衷快。
Mybatis主要構(gòu)件及其相互關(guān)系
SqlSession 作為MyBatis工作的主要頂層API,表示和數(shù)據(jù)庫交互的會話姨俩,完成必要數(shù)據(jù)庫增刪改查功能
Executor MyBatis執(zhí)行器蘸拔,是MyBatis 調(diào)度的核心,負(fù)責(zé)SQL語句的生成和查詢緩存的維護(hù)
StatementHandler 封裝了JDBC Statement操作环葵,負(fù)責(zé)對JDBC statement的操作调窍,如設(shè)置參數(shù)、將Statement結(jié)果集轉(zhuǎn)換成List集合张遭。
ParameterHandler 負(fù)責(zé)對用戶傳遞的參數(shù)轉(zhuǎn)換成JDBC Statement 所需要的參數(shù)
ResultSetHandler 負(fù)責(zé)將JDBC返回的ResultSet結(jié)果集對象轉(zhuǎn)換成List類型的集合
TypeHandler 負(fù)責(zé)java數(shù)據(jù)類型和jdbc數(shù)據(jù)類型之間的映射和轉(zhuǎn)換
MappedStatement MappedStatement維護(hù)了一條<select|update|delete|insert>節(jié)點(diǎn)的封裝
SqlSource 負(fù)責(zé)根據(jù)用戶傳遞的parameterObject邓萨,動態(tài)地生成SQL語句,將信息封裝到BoundSql對象中菊卷,并返回
BoundSql 表示動態(tài)生成的SQL語句以及相應(yīng)的參數(shù)信息
Configuration MyBatis所有的配置信息都維持在Configuration對象之中