mybatis中的延遲加載類型及設(shè)定詳解
概念
MyBatis中的延遲加載,也稱為懶加載,是指在進(jìn)行關(guān)聯(lián)查詢時(shí),按照設(shè)置延遲規(guī)則推遲對(duì)關(guān)聯(lián)對(duì)象的select查詢。延遲加載可以有效的減少數(shù)據(jù)庫(kù)壓力。
延時(shí)加載類型及設(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查詢。
<settings> <!-- 延遲加載總開(kāi)關(guān) --> <setting name="lazyLoadingEnabled" value="false"/> </settings>
侵入式延遲:執(zhí)行對(duì)主加載對(duì)象的查詢時(shí),不會(huì)執(zhí)行對(duì)關(guān)聯(lián)對(duì)象的查詢。但當(dāng)要訪問(wèn)主加載對(duì)象的
某個(gè)屬性(該屬性不是關(guān)聯(lián)對(duì)象的屬性)時(shí),就會(huì)馬上執(zhí)行關(guān)聯(lián)對(duì)象的select查詢。
<settings> <!-- 延遲加載總開(kāi)關(guān) --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 侵入式延遲加載開(kāi)關(guān) --> <setting name="aggressiveLazyLoading" value="true"/> </settings>
**深度延遲:**執(zhí)行對(duì)主加載對(duì)象的查詢時(shí),不會(huì)執(zhí)行對(duì)關(guān)聯(lián)對(duì)象的查詢。訪問(wèn)主加載對(duì)象的詳情時(shí)也不會(huì)執(zhí)行關(guān)聯(lián)對(duì)象的select查詢。只有當(dāng)真正訪問(wèn)關(guān)聯(lián)對(duì)象的詳情時(shí),才會(huì)執(zhí)行對(duì)關(guān)聯(lián)對(duì)象的select查詢。
<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)的條件,去查詢從表多次。
延時(shí)加載實(shí)例
需要校驗(yàn)的是 深度延遲的時(shí)候直接調(diào)用bankCardList是否有問(wèn)題
? 首先我們先思考一個(gè)問(wèn)題,假設(shè):在一對(duì)多中,我們有一個(gè)用戶,他有10張銀行卡。
問(wèn)題1:在查詢用戶的時(shí)候,要不要把關(guān)聯(lián)的銀行卡查出來(lái)?
問(wèn)題2:在查詢銀行卡的時(shí)候,要不要把關(guān)聯(lián)的用戶查出來(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層接口
/** * 查詢所有的用戶 * * @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è)元素如何查詢,在本例中select的屬性值為BankCardDao.xml文件的namespace com.example.dao.AccountDao路徑以及指定該映射文件下的findAllByUid方法,通過(guò)這個(gè)唯一標(biāo)識(shí)指定集合中元素的查找方式。因?yàn)樵谶@里需要用到根據(jù)用戶ID查找賬戶,所以需要同時(shí)配置一下findAllByUid方法的實(shí)現(xiàn)。
BankCardDao的實(shí)現(xiàn)
/** * 根據(jù)用戶ID查詢賬戶信息 * @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中的延遲加載類型及設(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)兩種查詢樹(shù)形數(shù)據(jù)的方法詳解(嵌套結(jié)果集和遞歸查詢)
樹(shù)形結(jié)構(gòu)數(shù)據(jù)在開(kāi)發(fā)中十分常見(jiàn),比如:菜單數(shù)、組織樹(shù), 利用 MyBatis 提供嵌套查詢功能可以很方便地實(shí)現(xiàn)這個(gè)功能需求。本文主要介紹了兩種方法,感興趣的可以了解一下2021-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-06JAVA實(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