MyBatis是dao層(持久層)框架,它支持自定義SQL、存儲過程以及高級映射。
在南潯等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、網(wǎng)站設(shè)計 網(wǎng)站設(shè)計制作按需求定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)整合營銷推廣,外貿(mào)營銷網(wǎng)站建設(shè),南潯網(wǎng)站建設(shè)費用合理。MyBatis 免除了幾乎所有的JDBC代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過簡單的XML或注解來配置和映射原始類型、接口和Java POJo (Plain old java Objects,普通老式Java對象)為數(shù)據(jù)庫中的記錄。
MyBatis流行的主要原因在于它的簡單性和易使用性。在Java應(yīng)用程序中,數(shù)據(jù)持久化層涉及到的工作有:
MyBatis通過抽象底層的JDBC代碼,自動化封裝SQL結(jié)果集產(chǎn)生Java對象、Java對象的數(shù)據(jù)持久化數(shù)據(jù)庫中的過程使得對SQL的使用變得容易
MyBatis的特點 Mybatis 的主要功能是 數(shù)據(jù)持久化讀取MyBatis 配置文件mybatis-config.xml,加載數(shù)據(jù)源、事務(wù)等
InputStream in= Resources.getResourceAsStream("mybatis-config.xml");
加載映射文件mapper.xml
定義SQL語句,在上一步的文件中加載。
創(chuàng)建會話工廠。(SqlSessionFactory)
private static SqlSessionFactory sqlSessionFactory;
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
創(chuàng)建會話(SqlSession)
sqlSession = sqlSessionFactory.openSession();
通過Executor 操作數(shù)據(jù)庫
輸入?yún)?shù)和輸出結(jié)果
mybatis應(yīng)用程序通過SqlSessionFactoryBuilder從mybatis-config.xml配置文件中構(gòu)建出SqlSessionFactory,然后,SqlSessionFactory的實例直接開啟一個SqlSession,再通過SqlSession實例獲得Mapper對象并運行Mapper映射的SQL語句,完成對數(shù)據(jù)庫的CRUD和事務(wù)提交,之后關(guān)閉SqlSession。
public static void main(String[] args) throws IOException {
// 加載mybatis配置文件
Reader reader = Resources.getResourceAsReader("config/configuration.xml");
// InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//創(chuàng)建數(shù)據(jù)工廠
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = builder.build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 獲取mapper接口對象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 查詢
User user = mapper.selectByPrimaryKey("1");
//釋放會話
sqlSession.clearCache();
sqlSession.close();
}
初始化
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory build方法里的XMLConfigBuilder是專門解析mybatis的配置文件的類,parser.parse()的返回值是Configuration對象,Configuration對象的結(jié)構(gòu)和xml配置文件的對象幾乎相同。
xml中的配置標(biāo)簽有哪些:
properties(屬性),settings(設(shè)置),typeAliases(類型別名),typeHandlers(類型處理器),objectFactory(對象工廠),mappers(映射器)等
讀取了xml文件各個標(biāo)簽內(nèi)容并封裝到Configuration中的屬性中。
解析xml是對把xml文件中的標(biāo)簽內(nèi)容復(fù)制到Configuration中的屬性中
SqlSession sqlSession = factory.openSession();
MappedStatement??Mybatis內(nèi)部存儲緩存
MappedStatement與Mapper配置文件中的一個select/update/insert/delete節(jié)點相對應(yīng)。
mapper中配置的等標(biāo)簽都被封裝到了此對象中,然后存儲在Configuration對象的mappedStatements屬性中,mappedStatements 是一個HashMap,key為hashCode+sqlId+Sql語句 (全限定類名 + 方法名),value為從查詢出來映射生成的java對象(MappedStatement對象)。
Map
mappedStatements = new StrictMap ("Mapped Statements collection") 進入 executor.query()
為本次查詢創(chuàng)建緩存的Key,進入query的重載方法中,如果?A進程在對數(shù)據(jù)庫操作的時候 B進程將sqlSession關(guān)閉了,會報throw new ExecutorException("Executor was closed.");?
如果緩存中沒有本次查找的值,那么從數(shù)據(jù)庫中查詢。
從數(shù)據(jù)庫查詢,調(diào)用查詢方法 finally localCache.removeObject(key); 清空該key的value后將再查詢結(jié)果放入緩存,
SimpleExecutor中實現(xiàn)父類的doQuery抽象方法,傳入?yún)?shù)創(chuàng)建StatementHanlder對象來執(zhí)行查詢,創(chuàng)建jdbc中的statement對象,是原生jdbc的執(zhí)行,StatementHandler進行處理 return handler.query(stmt, resultHandler);? ResultHandler對象,用于對返回的結(jié)果進行處理
動態(tài)代理——通常的Mapper接口我們都沒有實現(xiàn)的方法卻可以使用
當(dāng)判斷解析到接口時,會創(chuàng)建此接口對應(yīng)的MapperProxyFactory對象,存入HashMap中, key = 接口的字節(jié)碼對象,value = 此接口對應(yīng)的MapperProxyFactory對象。
MyBatis初始化時對接口的處理:MapperRegistry是Configuration中的一個屬性,它內(nèi)部維護一個HashMap用于存放mapper接口的
工廠類
MapperProxyFactory,每個接口對應(yīng)一個工廠類?MapperMethod最終調(diào)用了執(zhí)行的方法?.execute(sqlSession, args)
?command.getType() 判斷mapper中的方法類型是insert還是delete,最終調(diào)用的還是SqlSession中的方法
此段為邊閱讀別人寫的博客邊復(fù)制的 (主要用于能夠讓自己讀得下去。。)
原文鏈接:http://t.csdn.cn/Yl3Hv
掌握MyBatis的工作原理,要結(jié)合JDBC來理解MyBatis的工作原理往往才能更透徹。我們知道,JDBC有四個核心對象:
(1)DriverManager,用于注冊數(shù)據(jù)庫連接
(2)Connection,與數(shù)據(jù)庫連接對象
(3)Statement/PrepareStatement,操作數(shù)據(jù)庫SQL語句的對象
(4)ResultSet,結(jié)果集或一張?zhí)摂M表而MyBatis也有四大核心對象:
(1)SqlSession對象,該對象中包含了執(zhí)行SQL語句的所有方法【1】。類似于JDBC里面的Connection?【2】。
(2)Executor接口,它將根據(jù)SqlSession傳遞的參數(shù)動態(tài)地生成需要執(zhí)行的SQL語句,同時負責(zé)查詢緩存的維護。類似于JDBC里面的Statement/PrepareStatement。
(3)MappedStatement對象,該對象是對映射SQL的封裝,用于存儲要映射的SQL語句的id、參數(shù)等信息。
(4)ResultHandler對象,用于對返回的結(jié)果進行處理,最終得到自己想要的數(shù)據(jù)格式或類型??梢宰远x返回類型。原文鏈接:http://t.csdn.cn/KlzWU
- 通過Executor 操作數(shù)據(jù)庫
SqlSession: 是一個接口
SqlSession是MyBatis中用于和數(shù)據(jù)庫交互的
頂層類
,通常將它與ThreadLocal綁定,一個會話使用一個SqlSession,并且在使用完畢后需要close。使用的實現(xiàn)類: DefaultSqlSession
Executor接口的實現(xiàn)類:
BatchExecutor(重用語句并執(zhí)行批量更新)?
SimpleExecutor(普通的執(zhí)行器,默認)
執(zhí)行sql語句的屬性: select
調(diào)用CachingExecutor的query()方法, CachingExecutor( 二級緩存) 二級緩存名: transactionalCaches HashMap
調(diào)用BaseExecutor的query()方法 BaseExcutor(一級緩存) 一級緩存: localCache HashMap
調(diào)用SimpleExecutor的doQuery()方法: 從數(shù)據(jù)庫查詢
執(zhí)行selectById selectOne()也是調(diào)用selectList() 三目運算
list.isEmpt() || list ==null ? null : list.get(0)
找cache緩存 二級再到一級
BaseExecutor是SimpleExecutor的父類 子類沒有的方法 使用的是繼承父類的方法
一級緩存沒有 才去數(shù)據(jù)庫查詢
父類沒的方法 是執(zhí)行子類重寫的方法
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
文章標(biāo)題:認識MyBatis-創(chuàng)新互聯(lián)
當(dāng)前地址:http://jinyejixie.com/article6/dhdsig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、企業(yè)網(wǎng)站制作、網(wǎng)站導(dǎo)航、外貿(mào)網(wǎng)站建設(shè)、域名注冊、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容