mybatis中的延遲加載類型及設(shè)定詳解
概念
MyBatis中的延遲加載,也稱為懶加載,是指在進(jìn)行關(guān)聯(lián)查詢時,按照設(shè)置延遲規(guī)則推遲對關(guān)聯(lián)對象的select查詢。延遲加載可以有效的減少數(shù)據(jù)庫壓力。
延時加載類型及設(shè)定
通過對全局參數(shù):lazyLoadingEnabled進(jìn)行設(shè)置,默認(rèn)就是false。 進(jìn)行設(shè)置修改延時加載狀態(tài)
直接加載: 執(zhí)行完對主加載對象的select語句,馬上執(zhí)行對關(guān)聯(lián)對象的select查詢。
<settings> <!-- 延遲加載總開關(guān) --> <setting name="lazyLoadingEnabled" value="false"/> </settings>
侵入式延遲:執(zhí)行對主加載對象的查詢時,不會執(zhí)行對關(guān)聯(lián)對象的查詢。但當(dāng)要訪問主加載對象的
某個屬性(該屬性不是關(guān)聯(lián)對象的屬性)時,就會馬上執(zhí)行關(guān)聯(lián)對象的select查詢。
<settings> <!-- 延遲加載總開關(guān) --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 侵入式延遲加載開關(guān) --> <setting name="aggressiveLazyLoading" value="true"/> </settings>
**深度延遲:**執(zhí)行對主加載對象的查詢時,不會執(zhí)行對關(guān)聯(lián)對象的查詢。訪問主加載對象的詳情時也不會執(zhí)行關(guān)聯(lián)對象的select查詢。只有當(dāng)真正訪問關(guān)聯(lián)對象的詳情時,才會執(zhí)行對關(guān)聯(lián)對象的select查詢。
<settings> <!-- 延遲加載總開關(guān) --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 侵入式延遲加載開關(guān) --> <setting name="aggressiveLazyLoading" value="false"/> </settings>
優(yōu)缺點
- 深度延遲加載的使用會提升性能。
- 如果延遲加載的表數(shù)據(jù)太多,此時會產(chǎn)生N+1問題,主信息加載一次算1次,而從信息是會根據(jù)主信息傳遞過來的條件,去查詢從表多次。
延時加載實例
需要校驗的是 深度延遲的時候直接調(diào)用bankCardList是否有問題
? 首先我們先思考一個問題,假設(shè):在一對多中,我們有一個用戶,他有10張銀行卡。
問題1:在查詢用戶的時候,要不要把關(guān)聯(lián)的銀行卡查出來?
問題2:在查詢銀行卡的時候,要不要把關(guān)聯(lián)的用戶查出來?
用戶類及銀行卡類
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>
**注意:**主要的功能實現(xiàn)位于中,對于銀行卡列表的信息通過collection集合來映射,通過select指定集合中的每個元素如何查詢,在本例中select的屬性值為BankCardDao.xml文件的namespace com.example.dao.AccountDao路徑以及指定該映射文件下的findAllByUid方法,通過這個唯一標(biāo)識指定集合中元素的查找方式。因為在這里需要用到根據(jù)用戶ID查找賬戶,所以需要同時配置一下findAllByUid方法的實現(xiàn)。
BankCardDao的實現(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開啟全局延遲加載配置
configuration> <settings> <!--開啟全局的懶加載--> <setting name="lazyLoadingEnabled" value="true"/> <!--關(guān)閉立即加載,其實不用配置,默認(rèn)為false--> <setting name="aggressiveLazyLoading" value="false"/> <!--開啟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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis實現(xiàn)兩種查詢樹形數(shù)據(jù)的方法詳解(嵌套結(jié)果集和遞歸查詢)
樹形結(jié)構(gòu)數(shù)據(jù)在開發(fā)中十分常見,比如:菜單數(shù)、組織樹, 利用 MyBatis 提供嵌套查詢功能可以很方便地實現(xiàn)這個功能需求。本文主要介紹了兩種方法,感興趣的可以了解一下2021-09-09使用Swagger2實現(xiàn)自動生成RESTful?API文檔
在開發(fā)?RESTful?API?的過程中,文檔是非常重要的一部分,可以幫助開發(fā)者了解?API?的功能和使用方法,本文將使用Swagger2?實現(xiàn)自動生成?RESTful?API?文檔,需要的可以參考一下2023-06-06