mybatis中的延遲加載類(lèi)型及設(shè)定詳解
概念
MyBatis中的延遲加載,也稱(chēng)為懶加載,是指在進(jìn)行關(guān)聯(lián)查詢(xún)時(shí),按照設(shè)置延遲規(guī)則推遲對(duì)關(guān)聯(lián)對(duì)象的select查詢(xún)。延遲加載可以有效的減少數(shù)據(jù)庫(kù)壓力。
延時(shí)加載類(lèi)型及設(shè)定
通過(guò)對(duì)全局參數(shù):lazyLoadingEnabled進(jìn)行設(shè)置,默認(rèn)就是false。 進(jìn)行設(shè)置修改延時(shí)加載狀態(tài)
直接加載: 執(zhí)行完對(duì)主加載對(duì)象的select語(yǔ)句,馬上執(zhí)行對(duì)關(guān)聯(lián)對(duì)象的select查詢(xún)。
<settings> <!-- 延遲加載總開(kāi)關(guān) --> <setting name="lazyLoadingEnabled" value="false"/> </settings>
侵入式延遲:執(zhí)行對(duì)主加載對(duì)象的查詢(xún)時(shí),不會(huì)執(zhí)行對(duì)關(guān)聯(lián)對(duì)象的查詢(xún)。但當(dāng)要訪問(wèn)主加載對(duì)象的
某個(gè)屬性(該屬性不是關(guān)聯(lián)對(duì)象的屬性)時(shí),就會(huì)馬上執(zhí)行關(guān)聯(lián)對(duì)象的select查詢(xún)。
<settings> <!-- 延遲加載總開(kāi)關(guān) --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 侵入式延遲加載開(kāi)關(guān) --> <setting name="aggressiveLazyLoading" value="true"/> </settings>
**深度延遲:**執(zhí)行對(duì)主加載對(duì)象的查詢(xún)時(shí),不會(huì)執(zhí)行對(duì)關(guān)聯(lián)對(duì)象的查詢(xún)。訪問(wèn)主加載對(duì)象的詳情時(shí)也不會(huì)執(zhí)行關(guān)聯(lián)對(duì)象的select查詢(xún)。只有當(dāng)真正訪問(wèn)關(guān)聯(lián)對(duì)象的詳情時(shí),才會(huì)執(zhí)行對(duì)關(guān)聯(lián)對(duì)象的select查詢(xún)。
<settings> <!-- 延遲加載總開(kāi)關(guān) --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 侵入式延遲加載開(kāi)關(guān) --> <setting name="aggressiveLazyLoading" value="false"/> </settings>
優(yōu)缺點(diǎn)
- 深度延遲加載的使用會(huì)提升性能。
- 如果延遲加載的表數(shù)據(jù)太多,此時(shí)會(huì)產(chǎn)生N+1問(wèn)題,主信息加載一次算1次,而從信息是會(huì)根據(jù)主信息傳遞過(guò)來(lái)的條件,去查詢(xún)從表多次。
延時(shí)加載實(shí)例
需要校驗(yàn)的是 深度延遲的時(shí)候直接調(diào)用bankCardList是否有問(wèn)題
? 首先我們先思考一個(gè)問(wèn)題,假設(shè):在一對(duì)多中,我們有一個(gè)用戶(hù),他有10張銀行卡。
問(wèn)題1:在查詢(xún)用戶(hù)的時(shí)候,要不要把關(guān)聯(lián)的銀行卡查出來(lái)?
問(wèn)題2:在查詢(xún)銀行卡的時(shí)候,要不要把關(guān)聯(lián)的用戶(hù)查出來(lái)?
用戶(hù)類(lèi)及銀行卡類(lèi)
public class User implements Serializable{ private Integer id; private String username; private Date birthday; private String sex; private String address; private List<BankCard> cardList; get和set方法省略..... } public class BankCard implements Serializable{ private Integer id; private Integer uid; private String cardNo; get和set方法省略..... }
dao層接口
/** * 查詢(xún)所有的用戶(hù) * * @return */ List<User> findAll();
xml配置
<resultMap id="userAccountMap" type="com.example.domain.User"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="birthday" column="birthday"/> <result property="sex" column="sex"/> <result property="address" column="address"/> <collection property="bankCardList" ofType="com.example.domain.BankCard" column="id" select="com.example.dao.BankCardDao.findAllByUid"/> </resultMap> <select id="findAll" resultMap="userAccountMap"> SELECT * FROM USER; </select>
**注意:**主要的功能實(shí)現(xiàn)位于中,對(duì)于銀行卡列表的信息通過(guò)collection集合來(lái)映射,通過(guò)select指定集合中的每個(gè)元素如何查詢(xún),在本例中select的屬性值為BankCardDao.xml文件的namespace com.example.dao.AccountDao路徑以及指定該映射文件下的findAllByUid方法,通過(guò)這個(gè)唯一標(biāo)識(shí)指定集合中元素的查找方式。因?yàn)樵谶@里需要用到根據(jù)用戶(hù)ID查找賬戶(hù),所以需要同時(shí)配置一下findAllByUid方法的實(shí)現(xiàn)。
BankCardDao的實(shí)現(xiàn)
/** * 根據(jù)用戶(hù)ID查詢(xún)賬戶(hù)信息 * @return */ List<BankCard> findAllByUid(Integer uid);
BankCardDao.xml
<select id="findAllByUid" resultType="com.example.domain.BankCard"> SELECT * FROM bank_card WHERE uid = #{uid}; </select>
mybatis開(kāi)啟全局延遲加載配置
configuration> <settings> <!--開(kāi)啟全局的懶加載--> <setting name="lazyLoadingEnabled" value="true"/> <!--關(guān)閉立即加載,其實(shí)不用配置,默認(rèn)為false--> <setting name="aggressiveLazyLoading" value="false"/> <!--開(kāi)啟Mybatis的sql執(zhí)行相關(guān)信息打印--> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings> <typeAliases> <typeAlias type="com.example.domain.Account" alias="account"/> <typeAlias type="com.example.domain.User" alias="user"/> <package name="com.example.domain"/> </typeAliases> <environments default="test"> <environment id="test"> <!--配置事務(wù)--> <transactionManager type="jdbc"></transactionManager> <!--配置連接池--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test1"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!--配置映射文件的路徑--> <mappers> <mapper resource="com/example/dao/UserDao.xml"/> <mapper resource="com/example/dao/AccountDao.xml"/> </mappers> </configuration>
到此這篇關(guān)于mybatis中的延遲加載類(lèi)型及設(shè)定詳解的文章就介紹到這了,更多相關(guān)mybatis中的延遲加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)字符串倒序輸出的四種方法匯總
這篇文章主要介紹了Java實(shí)現(xiàn)字符串倒序輸出的四種方法匯總,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06MyBatis實(shí)現(xiàn)兩種查詢(xún)樹(shù)形數(shù)據(jù)的方法詳解(嵌套結(jié)果集和遞歸查詢(xún))
樹(shù)形結(jié)構(gòu)數(shù)據(jù)在開(kāi)發(fā)中十分常見(jiàn),比如:菜單數(shù)、組織樹(shù), 利用 MyBatis 提供嵌套查詢(xún)功能可以很方便地實(shí)現(xiàn)這個(gè)功能需求。本文主要介紹了兩種方法,感興趣的可以了解一下2021-09-09Java利用endorsed如何覆蓋jdk提供的類(lèi)詳解
這篇文章主要給大家介紹了關(guān)于Java利用endorsed如何覆蓋jdk提供的類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09使用Swagger2實(shí)現(xiàn)自動(dòng)生成RESTful?API文檔
在開(kāi)發(fā)?RESTful?API?的過(guò)程中,文檔是非常重要的一部分,可以幫助開(kāi)發(fā)者了解?API?的功能和使用方法,本文將使用Swagger2?實(shí)現(xiàn)自動(dòng)生成?RESTful?API?文檔,需要的可以參考一下2023-06-06elasticsearch聚合查詢(xún)實(shí)踐示例
這篇文章主要為大家介紹了elasticsearch聚合查詢(xún)實(shí)踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12JAVA實(shí)現(xiàn)異步調(diào)用實(shí)例代碼
在java平臺(tái),實(shí)現(xiàn)異步調(diào)用的角色主要三種角色:調(diào)用者、取貨憑證、真實(shí)數(shù)據(jù)。本篇文章給大家介紹java實(shí)現(xiàn)異步調(diào)用實(shí)例代碼,需要的朋友可以參考下2015-09-09