最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis中的延遲加載類型及設(shè)定詳解

 更新時(shí)間:2023年10月27日 10:30:08   作者:guo123shuang  
這篇文章主要介紹了mybatis中的延遲加載類型及設(shè)定詳解,MyBatis中的延遲加載,也稱為懶加載,是指在進(jìn)行關(guān)聯(lián)查詢時(shí),按照設(shè)置延遲規(guī)則推遲對(duì)關(guān)聯(lián)對(duì)象的select查詢,延遲加載可以有效的減少數(shù)據(jù)庫(kù)壓力,需要的朋友可以參考下

概念

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)文章

最新評(píng)論

云龙县| 郁南县| 宝鸡市| 水富县| 寻甸| 韩城市| 荥经县| 祁门县| 北川| 凭祥市| 达尔| 镇平县| 江口县| 突泉县| 钟祥市| 鲁甸县| 股票| 阿城市| 德兴市| 喜德县| 马边| 澜沧| 四子王旗| 奉节县| 开远市| 日喀则市| 左权县| 青阳县| 平阴县| 孟津县| 广元市| 开平市| 邹平县| 洞口县| 贵溪市| 咸宁市| 合肥市| 河源市| 台州市| 泗阳县| 英吉沙县|