亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

有關mybatis知識點解析 mybatis調(diào)用存儲過程( 三 )


(1)加載配置:配置來源于兩個地方,一處是配置文件,一處是Java代碼的注解,將SQL的配置信息加載成為一個個MappedStatement對象(包括了傳入?yún)?shù)映射配置、執(zhí)行的SQL語句、結果映射配置),存儲在內(nèi)存中 。
(2)SQL解析:當API接口層接收到調(diào)用請求時,會接收到傳入SQL的ID和傳入對象(可以是Map、JavaBean或者基本數(shù)據(jù)類型),Mybatis會根據(jù)SQL的ID找到對應的MappedStatement,然后根據(jù)傳入?yún)?shù)對象對MappedStatement進行解析,解析后可以得到最終要執(zhí)行的SQL語句和參數(shù) 。
(3)SQL執(zhí)行:將最終得到的SQL和參數(shù)拿到數(shù)據(jù)庫進行執(zhí)行,得到操作數(shù)據(jù)庫的結果 。
(4)結果映射:將操作數(shù)據(jù)庫的結果按照映射的配置進行轉換,可以轉換成HashMap、JavaBean或者基本數(shù)據(jù)類型,并將最終結果返回 。
為什么需要預編譯定義:
SQL 預編譯指的是數(shù)據(jù)庫驅動在發(fā)送 SQL 語句和參數(shù)給 DBMS 之前對 SQL 語句進行編譯,這樣 DBMS 執(zhí)行 SQL 時,就不需要重新編譯 。
為什么需要預編譯
JDBC 中使用對象 PreparedStatement 來抽象預編譯語句,使用預編譯 。預編譯階段可以優(yōu)化 SQL 的執(zhí)行 。預編譯之后的 SQL 多數(shù)情況下可以直接執(zhí)行,DBMS 不需要再次編譯,越復雜的SQL,編譯的復雜度將越大,預編譯階段可以合并多次操作為一個操作 。同時預編譯語句對象可以重復利用 。把一個 SQL 預編譯后產(chǎn)生的 PreparedStatement 對象緩存下來,下次對于同一個SQL,可以直接使用這個緩存的 PreparedState 對象 。Mybatis默認情況下,將對所有的 SQL 進行預編譯 。
Mybatis都有哪些Executor執(zhí)行器?它們之間的區(qū)別是什么?Mybatis有三種基本的Executor執(zhí)行器,SimpleExecutor、ReuseExecutor、BatchExecutor 。
SimpleExecutor:每執(zhí)行一次update或select,就開啟一個Statement對象,用完立刻關閉Statement對象 。
ReuseExecutor:執(zhí)行update或select,以sql作為key查找Statement對象,存在就使用,不存在就創(chuàng)建,用完后,不關閉Statement對象,而是放置于Map<String, Statement>內(nèi),供下一次使用 。簡言之,就是重復使用Statement對象 。
BatchExecutor:執(zhí)行update(沒有select,JDBC批處理不支持select),將所有sql都添加到批處理中(addBatch()),等待統(tǒng)一執(zhí)行(executeBatch()),它緩存了多個Statement對象,每個Statement對象都是addBatch()完畢后,等待逐一執(zhí)行executeBatch()批處理 。與JDBC批處理相同 。
作用范圍:Executor的這些特點,都嚴格限制在SqlSession生命周期范圍內(nèi) 。
Mybatis中如何指定使用哪一種Executor執(zhí)行器? 在Mybatis配置文件中,在設置(settings)可以指定默認的ExecutorType執(zhí)行器類型,也可以手動給DefaultSqlSessionFactory的創(chuàng)建SqlSession的方法傳遞ExecutorType類型參數(shù),如SqlSession openSession(ExecutorType execType) 。
配置默認的執(zhí)行器 。SIMPLE 就是普通的執(zhí)行器;REUSE 執(zhí)行器會重用預處理語句(prepared statements); BATCH 執(zhí)行器將重用語句并執(zhí)行批量更新 。
Mybatis是否支持延遲加載?如果支持,它的實現(xiàn)原理是什么? Mybatis僅支持association關聯(lián)對象和collection關聯(lián)集合對象的延遲加載,association指的就是一對一,collection指的就是一對多查詢 。在Mybatis配置文件中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false 。
它的原理是,使用CGLIB創(chuàng)建目標對象的代理對象,當調(diào)用目標方法時,進入攔截器方法,比如調(diào)用a.getB().getName(),攔截器invoke()方法發(fā)現(xiàn)a.getB()是null值,那么就會單獨發(fā)送事先保存好的查詢關聯(lián)B對象的sql,把B查詢上來,然后調(diào)用a.setB(b),于是a的對象b屬性就有值了,接著完成a.getB().getName()方法的調(diào)用 。這就是延遲加載的基本原理 。


以上關于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關的問題,請您及時就醫(yī)或請專業(yè)人士給予相關指導!

「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助: