溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java持久層框架Mybatis的詳細(xì)介紹

發(fā)布時(shí)間:2021-09-09 11:40:33 來(lái)源:億速云 閱讀:166 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Java持久層框架Mybatis的詳細(xì)介紹”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

一.Mybaits的架構(gòu)設(shè)計(jì)

Java持久層框架Mybatis的詳細(xì)介紹

二.Mybatis-Spring的執(zhí)行流程

1.初始化SqlSessionFactoryBean

Java持久層框架Mybatis的詳細(xì)介紹

      SqlSessionFactoryBean 實(shí)現(xiàn)了 Spring 的 FactoryBean和InitializingBean接口,Spring 將會(huì)在應(yīng)用啟動(dòng)時(shí)為你 創(chuàng)建 SqlSessionFactory 對(duì)象

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="mapperLocations" value="classpath*:/mappers/**/*.xml" /></bean>
從類路徑下加載在mappers包和它的子包中所有的 MyBatis 映射器 XML 文件。

2.獲取MapperProxy進(jìn)行代理執(zhí)行Mapper接口.

Java持久層框架Mybatis的詳細(xì)介紹

代理Mapper接口(重中之重,Mybatis的動(dòng)態(tài)代理MapperPoxy)

    1.mapperRegistry.getMapper(type, sqlSession);

    2.MapperProxyFactory<T> mapperProxyFactory =                     (MapperProxyFactory)this.knownMappers.get(type);

    3.mapperProxyFactory.newInstance(sqlSession);

    4.代理執(zhí)行查詢

3.調(diào)用SqlsessionApi進(jìn)行數(shù)據(jù)庫(kù)操作

Java持久層框架Mybatis的詳細(xì)介紹

4.SqlSessionTemplate初始化sqlSessionProxy代理類進(jìn)行open會(huì)話

Java持久層框架Mybatis的詳細(xì)介紹

 5.openSession

Java持久層框架Mybatis的詳細(xì)介紹    6.openSession再執(zhí)行:DefaultSqlSession調(diào)用selectList

Java持久層框架Mybatis的詳細(xì)介紹

7.先從緩存中查詢:這里先查詢二級(jí)緩存,再查session的緩存

          CachingExecutor緩存執(zhí)行器先查詢緩存,再用delegate執(zhí)行SIMPLEExecutor進(jìn)行數(shù)據(jù)庫(kù)查詢。

8.緩存沒(méi)有則查詢數(shù)據(jù)庫(kù):queryFromDatabase

Java持久層框架Mybatis的詳細(xì)介紹

9.添加插件到RoutingStatementHandler

    1.newStatementHandler

    2.SatementHandler statementHandler = new RoutingStatementHandler()

    3.this.interceptorChain.pluginAll(statementHandler); 

10.最后真正的調(diào)用JDBC-->PreparedStatement.execute()進(jìn)行數(shù)據(jù)庫(kù)操作

11.查詢結(jié)果處理:resultSetHandler:-->DefaultResultSetHandler

Java持久層框架Mybatis的詳細(xì)介紹

12.最后sqlSession.commit(true),并關(guān)閉Sqlsession

三.Mybatis核心原理需要著重debug

sql解析過(guò)程

Java持久層框架Mybatis的詳細(xì)介紹

       Mybaitis的sql解析工作通過(guò)XMLMapperBuilder進(jìn)行初始化的,在Mybaiti初始化Config的時(shí)候處理所有的Mapper文件,最終得到SqlSource,會(huì)放到Configuration中,有了SqlSource,就能拿BoundSql了,BoundSql可以得到最終的sql。解析的過(guò)程比較繁瑣,大家可以debug一下。

推薦一篇博文,Mybatis-Sql動(dòng)態(tài)解析原理:

http://www.cnblogs.com/fangjian0423/p/mybaits-dynamic-sql-analysis.html

MyBatis的事務(wù)管理

        一、使用JDBC的事務(wù)管理機(jī)制:即利用java.sql.Connection對(duì)象完成對(duì)事務(wù)的提交(commit())、回滾(rollback())、關(guān)閉(close())等。

        二、使用MANAGED的事務(wù)管理機(jī)制:這種機(jī)制MyBatis自身不會(huì)去實(shí)現(xiàn)事務(wù)管理,而是讓程序的容器如(JBOSS,Weblogic)來(lái)實(shí)現(xiàn)對(duì)事務(wù)的管理

事務(wù)這一塊還沒(méi)有仔細(xì)的debug,給大家推薦博文看一下:

https://blog.csdn.net/luanlouis/article/details/37992171

插件運(yùn)行機(jī)制

默認(rèn)情況下,MyBatis 允許使用插件來(lái)攔截的方法調(diào)用包括:

    1.攔截執(zhí)行器的方法:Executor

    2.攔截參數(shù)的處理:ParameterHandler

    3.攔截結(jié)果集的處理:ResultSetHandler

    4.攔截Sql語(yǔ)法構(gòu)建的處理:StatementHandler

       Mybatis通過(guò)反射實(shí)例化plugin節(jié)點(diǎn)中的interceptor屬性表示的類。然后調(diào)用全局配置類Configuration的addInterceptor方法。插件源碼需要單獨(dú)解析,大家自己也可以跟一遍。

Mybatis的緩存

        一級(jí)緩存:對(duì)于會(huì)話(Session)級(jí)別的數(shù)據(jù)緩存。是為了短時(shí)間的一樣的查詢帶來(lái)的資源浪費(fèi),MyBatis會(huì)在SqlSession對(duì)象中建立一個(gè)簡(jiǎn)單的緩存,將每次查詢到的結(jié)果結(jié)果緩存起來(lái),當(dāng)下次查詢的時(shí)候,如果判斷先前有個(gè)完全一樣的查詢,會(huì)直接從緩存中直接將結(jié)果取出,返回給用戶,不需要再進(jìn)行一次數(shù)據(jù)庫(kù)查詢了。一級(jí)緩存默認(rèn)是開啟的。

        二級(jí)緩存:Mybatis默認(rèn)對(duì)二級(jí)緩存是關(guān)閉的。需要自己配置,然后初始化的時(shí)候會(huì)拿到緩存開啟的配置<cache />,進(jìn)行處理這樣的元素節(jié)點(diǎn)。后面再詳細(xì)總結(jié)緩存的實(shí)現(xiàn)原理,雖然二級(jí)緩存用的不多。

 cacheElement(context.evalNode("cache"));

“Java持久層框架Mybatis的詳細(xì)介紹”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI