欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis之自動(dòng)映射與緩存問(wèn)題及解析

 更新時(shí)間:2025年09月05日 15:18:53   作者:ByteBlossom  
文章主要介紹了MyBatis的配置與操作,包括自動(dòng)映射(autoMappingBehavior)的設(shè)置(NONE、PARTIAL、FULL)、手動(dòng)映射的步驟(使用<resultMap>標(biāo)簽)、SQL注入攻擊的原理、緩存機(jī)制及其影響(一級(jí)緩存和二級(jí)緩存的作用、緩存失效的情況)

如何配置自動(dòng)映射?

自動(dòng)映射配置autoMappingBehavior包含三個(gè)值:

  • NONE:取消自動(dòng)映射。
  • PARTIAL:只會(huì)自動(dòng)映射,沒(méi)有定義嵌套結(jié)果集映射的結(jié)果集(默認(rèn)值)。
  • FULL:會(huì)自動(dòng)映射任意復(fù)雜的結(jié)果集(無(wú)論是否嵌套)。

自動(dòng)映射配置mybatis-config.xml

<settings>
<settingname="autoMappingBehavior"value="PARTIAL"/>
<settingname="mapUnderscoreToCamelCase"value="true"/>
</settings>
  • 【解釋】必須配置mapUnderscoreToCamelCase=true,否則失效。
  • 自動(dòng)映射結(jié)果返回用resultType;手動(dòng)映射返回結(jié)果用resultMap

手動(dòng)映射

手動(dòng)映射操作步驟:

①使用<resultMap>標(biāo)簽配置映射關(guān)系

②將<select>標(biāo)簽中使用resultMap作為結(jié)果集類型

  • 自動(dòng)映射配置演示——mybatis-config.xml<resultMap

ID自動(dòng)回填

useGeneratedKeys="true",keyProperty="id"指定主鍵賦值的字段名

接口定義用int類型接收

#和$區(qū)別及sql注入攻擊

  • #{}:參數(shù)占位符,即:預(yù)編譯;在預(yù)處理時(shí),會(huì)把參數(shù)用占位符"?"代替變成:selectfromuserwherename:?;
  • ${}:字符串替換符,即:SOL拼接;只是簡(jiǎn)單的字符串替換,在動(dòng)態(tài)解析時(shí)變成:select*fromuserwherename='muse';
  • SOL注入:即是指web應(yīng)用程序?qū)τ脩糨斎霐?shù)據(jù)的合法性沒(méi)有判斷或過(guò)濾不嚴(yán),攻擊者可以在web應(yīng)用程序中事先定義好的查認(rèn)語(yǔ)句的結(jié)尾上添加額外的SOL語(yǔ)句,在管理員不知情的情況下實(shí)現(xiàn)非法操作,以此來(lái)實(shí)現(xiàn)欺騙數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行非授權(quán)的任意查詢,從而進(jìn)一步得到相應(yīng)的數(shù)據(jù)信息。

緩存機(jī)制。二級(jí)緩存怎么讀取

  • 【開啟一級(jí)緩存】默認(rèn)是開啟的,即:同一個(gè)SqlSession對(duì)象調(diào)用同一個(gè)Mapper的方法,如果沒(méi)有聲明需要刷新,并且緩存沒(méi)超時(shí)的情況下,一般只執(zhí)行一次SQL,其他的 DQL(查詢語(yǔ)句)SqlSession都只會(huì)取出當(dāng)前緩存的數(shù)據(jù)。
  • 【開啟二級(jí)緩存】在xxxMapper.xml中添加<cache/>標(biāo)簽或者在對(duì)應(yīng)的Dao類上面增加@CacheNamespace(blocking=true)注解以開啟二級(jí)緩存。并且執(zhí)行sqlSession.commit()使得二級(jí)緩存生效,其中,POJOJO必須實(shí)現(xiàn)Serializable接口。

二級(jí)緩存也叫做全局緩存,基于namespace級(jí)別的緩存。使用的是mapper的作用域,不同的sqlSession只要訪問(wèn)的同一個(gè)mapper.xml文件,則共享二級(jí)緩存作用域。范圍是SqlSessionFactory。需要在全局配置文件中設(shè)置<settingname="cacheEnabled"value="true"/>,然后在具體的mapper.xml中添加<cache/>即可。

查詢流程:查詢時(shí)先到二級(jí)緩存查,如果沒(méi)有再去一級(jí)localCache查,再?zèng)]有則查詢數(shù)據(jù)庫(kù),再放緩存一份,再返回客戶端。下次再查詢的時(shí)候直接從緩存返回,不再訪問(wèn)數(shù)據(jù)庫(kù),如果數(shù)據(jù)庫(kù)中發(fā)生commit()操作,則清空緩存。

1、如果在mapper映射文件中的CRUD標(biāo)簽中加入flushCache="true",會(huì)導(dǎo)致一二級(jí)緩存機(jī)制都消失

2、也可以在測(cè)試類中直接手動(dòng)清理緩存。

3、也可以在全局配置文件設(shè)置<settingsname="localCacheScope"value="STATEMENT"/>這樣會(huì)使一級(jí)緩存失效,二級(jí)緩存不受影響。

  • foreach
  • concatbind
  • mybatisgenerator

源碼

  • 底層還是JDBC去執(zhí)行
  • 獲取mapper動(dòng)態(tài)代理(JDK動(dòng)態(tài)代理)
  • 執(zhí)行invoke方法,獲取一個(gè)被緩存到的mapperMathod

級(jí)聯(lián)association&collection

  • mybatis中的標(biāo)簽association主要用于解決“hasone”類型的關(guān)系,它表示一個(gè)對(duì)象至多有一個(gè)關(guān)聯(lián)對(duì)象(一對(duì)一或多對(duì)一)。比如一般情況下,每個(gè)消息都對(duì)應(yīng)一個(gè)消息詳情,消息和消息詳情之間的關(guān)系就可以使用association表示。
  • mybatis中的標(biāo)簽collection主要用于解決“hasmany”類型的關(guān)系,它表示一個(gè)對(duì)象有多個(gè)關(guān)聯(lián)對(duì)象。比如一般情況下,每個(gè)人都有多個(gè)聯(lián)系方式,人和聯(lián)系方式之間的關(guān)系就可以使用collection表示。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論