摘要:得到用戶信息,將用戶信息存儲到一級緩存中。如果中間去執(zhí)行操作執(zhí)行插入更新刪除,則會清空中的一級緩存,這樣做的目的為了讓緩存中存儲的是最新的信息,避免臟讀。
基礎(chǔ):
1、 概念:Java當(dāng)中的一個持久層框架。
2、 特點、優(yōu)勢:
(1)把java代碼和SQL代碼做了一個完全分離。
(2)良好支持復(fù)雜對象的映射(輸入映射、輸出映射)
(3)使用動態(tài)SQL,可以預(yù)防SQL注入。
3、 原理:
(1)創(chuàng)建mybatis-config.xml配置文件
(2)創(chuàng)建sqlSessionFactory
(3)編寫數(shù)據(jù)庫表對應(yīng)的實體類
(4)創(chuàng)建mybatis的sql映射文件,在這個文件中,把實體類的屬性和數(shù)據(jù)庫表的列聯(lián)系起來,并且可以編寫sql語句
(5)從sqlSessionFactory的實例獲取session
(6)session內(nèi)部通過Executor執(zhí)行器執(zhí)行操作。Executor會用到mapped statement對象,這個對象是對數(shù)據(jù)庫存儲的封裝,包括:sql語句、輸入?yún)?shù)、輸出結(jié)果類型
(7)關(guān)閉session
1、概念:
(1)一級緩存:一級緩存是SqlSession(會話)級別的緩存。在操作數(shù)據(jù)庫時需要構(gòu)造sqlSession對象,在對象中有一個數(shù)據(jù)結(jié)構(gòu)(HashMap)用于存儲緩存數(shù)據(jù)。不同的sqlSession之間的緩存數(shù)據(jù)區(qū)域(HashMap)是互相不影響的。
(2)二級緩存:二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。(二級緩存的原理和一級緩存原理一樣,第一次查詢,會將數(shù)據(jù)放入緩存中,然后第二次查詢則會直接去緩存中取。但是一級緩存是基于 sqlSession 的,而 二級緩存是基于 mapper文件的namespace的,也就是說多個sqlSession可以共享一個mapper中的二級緩存區(qū)域,并且如果兩個mapper的namespace相同,即使是兩個mapper,那么這兩個mapper中執(zhí)行sql查詢到的數(shù)據(jù)也將存在相同的二級緩存區(qū)域中)
它們的關(guān)系如圖:
2、一級緩存的使用:
我們在一個 sqlSession 中,對User表根據(jù)id進行兩次查詢,查看他們發(fā)出sql語句的情況:
(1)第一次發(fā)起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,如果沒有,從數(shù)據(jù)庫查詢用戶信息。得到用戶信息,將用戶信息存儲到一級緩存中。
(2)如果中間sqlSession去執(zhí)行commit操作(執(zhí)行插入、更新、刪除),則會清空SqlSession中的一級緩存,這樣做的目的為了讓緩存中存儲的是最新的信息,避免臟讀。
(3)第二次發(fā)起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,緩存中有,直接從緩存中獲取用戶信息。
3、二級緩存的使用:
4、注意事項:
(1)如果設(shè)置了cacheEnabled=true; 那么MyBatis在執(zhí)行查詢的時候,先查看二級緩存(全局緩存)是否有查詢的結(jié)果,如果有,直接返回緩存的結(jié)果;如果沒有,再執(zhí)行真正的查詢,把查詢的結(jié)果放到緩存中,再把結(jié)果返回給用戶。
(2)二級緩存:mybatis中,每一個mapper都可以有一個二級緩存。使用
(3)二級緩存使用場景:
對于訪問多的查詢請求且用戶對查詢結(jié)果實時性要求不高,此時可采用mybatis二級緩存技術(shù)降低數(shù)據(jù)庫訪問量,提高訪問速度,業(yè)務(wù)場景比如:耗時較高的統(tǒng)計分析sql、電話賬單查詢sql等。實現(xiàn)方法如下:通過設(shè)置刷新間隔時間,由mybatis每隔一段時間自動清空緩存,根據(jù)數(shù)據(jù)變化頻率設(shè)置緩存刷新間隔flushInterval,比如設(shè)置為30分鐘、60分鐘、24小時等,根據(jù)需求而定。 mybatis二級緩存對細粒度的數(shù)據(jù)級別的緩存實現(xiàn)不好,比如如下需求:對商品信息進行緩存,由于商品信息查詢訪問量大,但是要求用戶每次都能查詢最新的商品信息,此時如果使用mybatis的二級緩存就無法實現(xiàn)當(dāng)一個商品變化時只刷新該商品的緩存信息而不刷新其它商品的信息,因為mybaits的二級緩存區(qū)域以mapper為單位劃分的,當(dāng)一個商品信息變化會將所有商品信息的緩存數(shù)據(jù)全部清空。解決此類問題可能需要在業(yè)務(wù)層根據(jù)需求對數(shù)據(jù)有針對性緩存。語法:
1、#{}和${}
(1)#{}是一個占位符,接收輸入?yún)?shù),參數(shù)類型可以是基本類型、POJO、HashMap
(2)${}是一個拼接符號,可能導(dǎo)致sql注入,不建議使用。
2、resultMap標簽:
(1)結(jié)果集映射的標簽
(2)resultMap:
A、type:指定結(jié)果集中保存的實體類的類型 B、id:resultMap標簽的標識 C、autoMapping:值范圍true|false,設(shè)置是否啟動自動映射功能。自動映射功能就是自動查找與字段名小寫同名的屬性名,并調(diào)用setter方法。設(shè)置為false之后,需要在resultMap內(nèi)明確注明映射關(guān)系才會調(diào)用對應(yīng)的setter方法。
(3)id:用于設(shè)置主鍵字段與領(lǐng)域模型屬性的映射關(guān)系
(4)result:用于設(shè)置普通字段與領(lǐng)域模型屬性的映射關(guān)系
3、sql標簽:用來封裝sql語句或者sql片段
MyBatis的DAO開發(fā)方法:
1、 使用mapper代理方法:
(1) 編寫mapper.java 的接口類
(2) 編寫mapper.xml
2、 編寫接口類,需要遵守一些規(guī)范,MyBatis可以自動生成接口類的DAO實現(xiàn)類。規(guī)范有:
(1) mapper.xml中namespace需要等于mapper接口類的地址
(2) mapper接口類的方法的名稱等于mapper.xml中statement(對應(yīng)sql語句)的id
(3) mapper接口類的輸入?yún)?shù)類型等于mapper.xml中statement的parameterType指定的類型
(4) mapper接口類的返回參數(shù)類型等于mapper.xml中statement的resultType指定的類型
3、
MyBatis和Hibernate的本質(zhì)區(qū)別:
1、 Hibernate不需要寫sql,通過hql或者Hibernate直接生成sql。Mybatis需要寫sql。
2、 Mybatis適合于需求經(jīng)常改動的項目,因為它的sql由程序員生成,容易改動。Hibernate適合于需求改動較少的項目。
MyBatis和Ibatis的本質(zhì)區(qū)別:
1、MyBatis簡化了編碼過程,不需要寫DAO的實現(xiàn)類。直接寫一個DAO的接口和一個配置文件。MyBatis自動生成DAO實現(xiàn)類。
嵌套查詢 及 嵌套結(jié)果查詢:
嵌套查詢:使用2次查詢,然后在MyBatis(內(nèi)存)中進行拼裝。可能引起N+1問題。
嵌套結(jié)果查詢:使用1次查詢,然后將結(jié)果進行拼裝。
具體參考:https://www.2cto.com/database...
參考:https://www.cnblogs.com/ysoce...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71589.html
摘要:我在面試前針對基礎(chǔ)也花了不少的時間,期間也將自己寫過的博文粗略地刷了一遍,同時也在網(wǎng)上找了不少比較好的資料部分是沒看完的。看面試題也是校驗自己是否真正理解了這個知識點,也很有可能會有新的收獲。 一、前言 只有光頭才能變強 回顧前面: 廣州三本找Java實習(xí)經(jīng)歷 上一篇寫了自己面試的經(jīng)歷和一些在面試的時候遇到的題目(筆試題和面試題)。 我在面試前針對Java基礎(chǔ)也花了不少的時間,期間也將...
摘要:簡介我從七月份開始閱讀源碼,并在隨后的天內(nèi)陸續(xù)更新了篇文章。考慮到超長文章對讀者不太友好,以及拆分文章工作量也不小等問題。經(jīng)過兩周緊張的排版,一本小小的源碼分析書誕生了。我在寫系列文章中,買了一本書作為參考,這本書是技術(shù)內(nèi)幕。 1.簡介 我從七月份開始閱讀MyBatis源碼,并在隨后的40天內(nèi)陸續(xù)更新了7篇文章。起初,我只是打算通過博客的形式進行分享。但在寫作的過程中,發(fā)現(xiàn)要分析的代碼...
閱讀 3095·2021-10-15 09:41
閱讀 3167·2021-09-22 16:05
閱讀 2405·2021-09-22 15:19
閱讀 2873·2021-09-02 15:11
閱讀 2446·2019-08-30 15:52
閱讀 831·2019-08-30 11:06
閱讀 1000·2019-08-29 16:44
閱讀 1238·2019-08-23 18:18