J2EE進(jìn)階學(xué)習(xí)——Mybatis(七):高級(jí)映射 查詢緩存

對(duì)訂單商品數(shù)據(jù)模型進(jìn)行分析。

1.高級(jí)映射:

實(shí)現(xiàn)一對(duì)一、一對(duì)多、多對(duì)多查詢
延遲加載

2.查詢緩存

一級(jí)緩存
二級(jí)緩存(了解mybatis二級(jí)緩存使用場(chǎng)景)

3.mybatis和spring整合(掌握)
4.逆向工程(會(huì)用)

一、訂單商品數(shù)據(jù)模型

1.1 數(shù)據(jù)模型分析思路

1.每張表記錄的數(shù)據(jù)內(nèi)容

分模塊對(duì)每張表記錄的內(nèi)容進(jìn)行熟悉,相當(dāng)于你學(xué)習(xí)系統(tǒng)需求的過(guò)程

2.每張表重要的字段設(shè)置

非空字段、外鍵字段

3.數(shù)據(jù)庫(kù)級(jí)別表與表之間的關(guān)系

外鍵關(guān)系

4.表與表之間的業(yè)務(wù)關(guān)系

在分析表與表之間的業(yè)務(wù)關(guān)系時(shí)一定要建立在某個(gè)業(yè)務(wù)意義基礎(chǔ)上去分析。

1.2 數(shù)據(jù)模型分析

用戶表user:

記錄了購(gòu)買商品的用戶信息

訂單表orders:

記錄了用戶所創(chuàng)建的訂單(購(gòu)買商品的訂單)

訂單明細(xì)表orderdetail:

記錄了訂單的詳細(xì)信息即訂單所購(gòu)買商品的信息

商品表items:

記錄了商品信息

表與表之間的業(yè)務(wù)關(guān)系:

在分析表與表之間的業(yè)務(wù)關(guān)系時(shí)需要建立在某個(gè)業(yè)務(wù)意義基礎(chǔ)上去分析
先分析數(shù)據(jù)級(jí)別之間有關(guān)系的表之間的業(yè)務(wù)關(guān)系:

  • user和orders:
    user——>orders:一個(gè)用戶可以創(chuàng)建多個(gè)訂單,一對(duì)多
    orders——>user:一個(gè)訂單對(duì)應(yīng)一個(gè)用戶創(chuàng)建,一對(duì)一
  • orders和orderdetail:
    order——>orderdetail:一個(gè)訂單可以包括多個(gè)訂單明細(xì),因?yàn)橐粋€(gè)訂單可以購(gòu)買多個(gè)商品,每個(gè)商品的購(gòu)買信息在orderdetail記錄,一對(duì)多關(guān)系
    orderdetail——>orders:一個(gè)訂單的明細(xì)只能包括在一個(gè)訂單中,一對(duì)一
  • orderdetail和items:
    orderdetail——>items:一個(gè)訂單明細(xì)只對(duì)應(yīng)一個(gè)商品信息,一對(duì)一
    items——>ordeadetail:一個(gè)商品可以包括在多個(gè)訂單明細(xì)中,一對(duì)多

再分析數(shù)據(jù)庫(kù)級(jí)別沒(méi)有關(guān)系的表之間是否有業(yè)務(wù)關(guān)系

  • orders和items:
    orders和items之間可以通過(guò)orderdetail建立關(guān)系——多對(duì)多

二、一對(duì)一查詢

2.1 需求

查詢訂單信息,關(guān)聯(lián)查詢創(chuàng)建訂單的用戶信息

2.2 resultType
  • 2.2.1 sql語(yǔ)句
    確定查詢的主表:訂單表
    確定查詢的關(guān)聯(lián)表:用戶表

關(guān)聯(lián)查詢使用內(nèi)連接還是外連接
由于orders表中有一個(gè)外鍵(user_id),通過(guò)外鍵關(guān)聯(lián)查詢用戶表只能查詢出一條記錄,可以使用內(nèi)連接。

select 
  orders.*,
  user.username,
  user.sex,
  user.address
from
  orders,
  user
where orders.user_id=user.id
  • 2.2.2 創(chuàng)建pojo
  • 將上邊sql查詢的結(jié)果映射到pojo中,pojo中必須包括所有查詢列名。
  • 原始的Orders.java不能映射全部字段,需要新創(chuàng)建的pojo。
  • 創(chuàng)建一個(gè)pojo繼承包括查詢字段較多的pojo類
  • 2.2.3 mapper.xml
    <!-- 查詢訂單關(guān)聯(lián)查詢用戶信息 -->

    <select id="findOrdersUser" resultType="com.TiHom.mybatis.po.OrdersCustom">
        select
          orders.*,
          user.username,
          user.sex,
          user.address
        from
          orders,
          user
        where orders.user_id=user.id
    </select>
2.3 resultMap
  • 2.3.1 sql語(yǔ)句
    同resultType實(shí)現(xiàn)的sql
  • 2.3.2 使用resultMap映射的思路
    使用resultMap將查詢的結(jié)果中的訂單信息映射到Orders對(duì)象中,在orders類中添加user屬性,將關(guān)聯(lián)查詢出來(lái)的用戶信息映射到orders對(duì)象中的user屬性中。
  • 2.3.3 需要Orders類中添加user屬性
public class Orders {
    private Integer id;
    private Integer user_id;
    private String number;
    private Date createtime;
    private String note;
    //用戶信息
    private User user;
  • 2.3.4 mapper.xml
    定義resultMap
<resultMap id="OrdersUserResultMap" type="com.TiHom.mybatis.po.Orders">
        <!-- 配置要映射的訂單信息 -->
        <!-- id:指定查詢訂單中的唯一標(biāo)識(shí),訂單信息的唯一標(biāo)識(shí),如果有多列組成唯一標(biāo)識(shí),配置多個(gè)id
            column:訂單信息的唯一標(biāo)識(shí)列
            property:訂單信息的唯一標(biāo)識(shí)列所映射到哪個(gè)屬性中
        -->
        <id column="id" property="id"/>
        <result column="user_id" property="user_id"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>

        <!-- 配置要映射的關(guān)聯(lián)的用戶信息 -->
        <!-- association:用于映射關(guān)聯(lián)查詢單個(gè)對(duì)象的信息
        property:要將關(guān)聯(lián)查詢的用戶信息映射到Orders中哪個(gè)屬性
        -->
        <association property="user" javaType="com.TiHom.mybatis.po.User">
            <!-- 關(guān)聯(lián)查詢用戶的唯一標(biāo)識(shí)

            -->
            <id column="user_id" property="id"/>
            <result column="username" property="username"/>
            <result column="sex" property="sex"/>
            <result column="address" property="address"/>
        </association>
    </resultMap>

statement

    <select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
        select
          orders.*,
          user.username,
          user.sex,
          user.address
        from
          orders,
          user
        where orders.user_id=user.id
    </select>
  • 2.3.5 mapper.java
    public List<Orders> findOrdersUserResultMap() throws Exception;

2.4 resultType和resultMap實(shí)現(xiàn)一對(duì)一查詢小結(jié)

實(shí)現(xiàn)一對(duì)一查詢:
resultType:使用resultType實(shí)現(xiàn)較為簡(jiǎn)單,如果pojo中沒(méi)有包括查詢出來(lái)的列名,需要增加列名對(duì)應(yīng)的屬性,即可完成映射。
如果沒(méi)有查詢結(jié)果的特殊需求建議使用resultType。

resultMap:需要單獨(dú)定義resultMap,實(shí)現(xiàn)有點(diǎn)麻煩,如果有對(duì)查詢結(jié)果有特殊的要求,使用resultMap可以完成對(duì)關(guān)聯(lián)查詢pojo的屬性中。

resultMap可以實(shí)現(xiàn)延遲加載,resultType無(wú)法實(shí)現(xiàn)延遲加載

三、一對(duì)多查詢

3.1 需求

查詢訂單及訂單明細(xì)的信息

3.2 sql語(yǔ)句

確定主查詢表:訂單表
確定關(guān)聯(lián)查詢表:訂單明細(xì)表
在一對(duì)一查詢基礎(chǔ)上添加訂單明細(xì)表關(guān)聯(lián)即可

3.3 分析

使用resultType將上邊的查詢結(jié)果集映射到pojo中,訂單信息的pojo就會(huì)重復(fù)。
要求:對(duì)order信息的映射不能出現(xiàn)重復(fù)記錄

在orders.java類中添加List<orderDetail> orderDetails屬性。
最終會(huì)將訂單信息映射到orders中,訂單所對(duì)應(yīng)的訂單明細(xì)映射到orders中的orderDetails屬性中。
映射成的orders記錄數(shù)為兩條(orders信息不重復(fù))
每個(gè)orders中的orderDetails屬性存儲(chǔ)了該訂單所對(duì)應(yīng)的訂單明細(xì)。

3.4 在orders中添加訂單明細(xì)屬性

private List<Orderdetail> orderdetails;

3.5 mapper.xml
    <select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap">
        select
          orders.*,
          user.username,
          user.sex,
          user.address,
          orderdetail.id orderdetail_id,
          orderdetail.items_id,
          orderdetail.items_num,
          orderdetail.orders_id
        from
          orders,
          user,
          orderdetail
        where orders.user_id=user.id and orderdetail.orders_id=orders.id
    </select>
<resultMap id="OrdersAndOrderDetailResultMap" type="com.TiHom.mybatis.po.Orders" extends="OrdersUserResultMap">
        <!-- 訂單信息 -->
        <!-- 用戶信息 -->
        <!-- 訂單明細(xì)
        一個(gè)訂單關(guān)聯(lián)查詢出了多條明細(xì),要使用collection進(jìn)行映射
        collection:對(duì)關(guān)聯(lián)查詢到多條記錄映射到集合對(duì)象中
        -->
        <collection property="orderdetails" ofType="com.TiHom.mybatis.po.Orderdetail">
            <id column="orderdetail_id" property="id"/>
            <result column="items_id" property="items_id"/>
            <result column="orders_id" property="orders_id"/>
            <result column="items_num" property="items_num"/>
        </collection>

    </resultMap>
3.6 mapper.java
    public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception;

3.7 小結(jié)

mybatis使用resultMap的collection對(duì)關(guān)聯(lián)查詢的多條記錄映射到一個(gè)list集合屬性中。

使用resultType實(shí)現(xiàn):
將訂單明細(xì)映射到orders中的orderdetails中,需要進(jìn)行自己處理,使用雙重循環(huán)遍歷,去掉重復(fù)記錄,將訂單明細(xì)放在orderdetails中。

四、多對(duì)多查詢

4.1 需求

查詢用戶及用戶購(gòu)買商品信息

4.2 分析

查詢主表是:用戶表
關(guān)聯(lián)表:由于用戶和商品沒(méi)有直接關(guān)聯(lián),通過(guò)訂單和訂單明細(xì)進(jìn)行關(guān)聯(lián),所以關(guān)聯(lián)表:orders、orderdetails、items

4.3 映射思路

將用戶信息映射到user中。
在user類中添加訂單列表屬性List<Orders> orderslist。
在Orders中添加訂單明細(xì)列表的屬性 List<OrderDetail> orderdetails,將訂單的明細(xì)映射到orderdetails
在OrderDetail中添加Items屬性,將訂單明細(xì)所對(duì)應(yīng)的的商品映射到Items中

4.4 mapper.xml
    <!-- 查詢用戶及購(gòu)買的商品信息 -->
    <select id="findUserAndItemsResultMap" resultMap="UserAndItemsResultMap">
        select
          orders.*,
          user.username,
          user.sex,
          user.address,
          orderdetail.id orderdetail_id,
          orderdetail.items_id,
          orderdetail.items_num,
          orderdetail.orders_id,
          items.name items_name,
          items.detail items_detail,
          items.price items_price
        from
          orders,
          user,
          orderdetail,
          items
        where orders.user_id=user.id and orderdetail.orders_id=orders.id and orderdetail.items_id=items.id
    </select>
4.5 resultMap定義
<!-- 查詢用戶及購(gòu)買的商品 -->
    <resultMap id="UserAndItemsResultMap" type="com.TiHom.mybatis.po.User">
        <!-- 用戶信息 -->
        <id column="user_id" property="id"/>
        <result column="username" property="username"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>

        <!-- 訂單信息
        一個(gè)用戶對(duì)應(yīng)多個(gè)訂單
        -->
        <collection property="ordersList" ofType="com.TiHom.mybatis.po.Orders">
            <id column="id" property="id"/>
            <result column="user_id" property="user_id"/>
            <result column="number" property="number"/>
            <result column="createtime" property="createtime"/>
            <result column="note" property="note"/>
            <!-- 訂單明細(xì) -->
            <collection property="orderdetails" ofType="com.TiHom.mybatis.po.Orderdetail">
                <id column="orderdetail_id" property="id"/>
                <result column="items_id" property="items_id"/>
                <result column="orders_id" property="orders_id"/>
                <result column="items_num" property="items_num"/>
                <!-- 一個(gè)訂單明細(xì)對(duì)應(yīng)一個(gè)商品 -->
                <association property="items" javaType="com.TiHom.mybatis.po.Items">
                    <id column="items_id" property="id"/>
                    <result column="items_name" property="name"/>
                    <result column="items_detail" property="detail"/>
                    <result column="items_price" property="pic"/>
                </association>
            </collection>
        </collection>
    </resultMap>
4.6 mapper.java

public List<Orders> findUserAndItemsResultMap() throws Exception;

4.7 多對(duì)多查詢總結(jié)

將查詢用戶購(gòu)買的商品信息明細(xì)清單,(用戶名、用戶地址、購(gòu)買物品名稱、購(gòu)買商品時(shí)間、購(gòu)買商品數(shù)量)
針對(duì)上邊的需求就使用resultType將查詢到的記錄映射到一個(gè)擴(kuò)展的pojo中,很簡(jiǎn)單實(shí)現(xiàn)明細(xì)清單的功能。

五、resultMap小結(jié)

六、延遲加載

6.1 什么是延遲加載

resultMap可以實(shí)現(xiàn)高級(jí)映射(使用association、collection實(shí)現(xiàn)一對(duì)一及一對(duì)多的映射),

association、collection都具備延遲加載的功能。

需求:

如果查詢訂單并且關(guān)聯(lián)查詢用戶信息。如果先查詢訂單信息即可滿足我們的要求,當(dāng)我們需要查詢用戶信息時(shí)再查詢用戶信息。把對(duì)用戶的按需查詢的方法就是延遲加載。

延遲加載:

先從單表查詢、需要時(shí)再?gòu)年P(guān)聯(lián)表去關(guān)聯(lián)查詢,大大提高數(shù)據(jù)庫(kù)的性能,因?yàn)椴樵儐伪硪汝P(guān)聯(lián)查詢多表的速度要快。

6.2 使用association來(lái)實(shí)現(xiàn)延遲加載
6.2.1 需求

查詢訂單并且關(guān)聯(lián)查詢用戶信息

6.2.2 mapper.xml

需要定義兩個(gè)mapper方法對(duì)應(yīng)的statement。

  • 只查詢訂單信息
    select * from orders
    在查詢訂單的statement中使用association去延遲加載(執(zhí)行)下表的statement(關(guān)聯(lián)查詢用戶信息)
<!-- 查詢訂單關(guān)聯(lián)查詢用戶,用戶信息需要延遲加載 -->
    <select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">
        select * from orders
    </select>
  • 查詢用戶信息
    通過(guò)上邊查詢到的訂單信息中的user_id去關(guān)聯(lián)查詢用戶信息
    使用UserMapper.xml中的findUserById
select orders.*,
    (select username form user where orders.user_id = user.id)username,
    (select sex from user where orders,user_id=user.id)sex
from orders

這里sql語(yǔ)句是表示關(guān)聯(lián)查詢同時(shí)添加兩列username、sex

上邊先去執(zhí)行findOrdersUserLazyLoading,當(dāng)需要去查詢用戶的時(shí)候再去執(zhí)行findUserById,通過(guò)resultMap的定義將延遲加載執(zhí)行配置起來(lái)

6.2.3 延遲加載resultMap

使用association中的select指定延遲加載去執(zhí)行的statement的id

<resultMap id="OrdersUserLazyLoadingResultMap" type="com.TiHom.mybatis.po.Orders">
        <!-- 對(duì)訂單信息進(jìn)行映射配置 -->
        <id column="id" property="id"/>
        <result column="user_id" property="user_id"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>
        <!-- 實(shí)現(xiàn)對(duì)用戶的延遲加載
        select:指定延遲加載需要執(zhí)行的statement的id(是根據(jù)user_id查詢用戶信息的statement)
        column:訂單信息中關(guān)聯(lián)用戶信息查詢的列,是user_id
        -->
        <association property="user" javaType="com.TiHom.mybatis.po.User"
                     select="com.TiHom.mybatis.mapper.UserMapper.findUserById" column="user_id">

        </association>
    </resultMap>
6.2.4 mapper.java
/**
     * 查詢訂單關(guān)聯(lián)查詢用戶,用戶信息是延遲加載
     */
    public List<Orders> findOrdersUserLazyLoading() throws Exception;
6.2.5 測(cè)試

1.執(zhí)行上面的mapper方法(findOrdersUserLazyLoading),內(nèi)部去調(diào)用com.TiHom.mybatis.mapper.OrdersMapperCustom中的findOrdersUserLazyLoading只查詢orders信息(單表)。
2.在程序中去遍歷上一步驟查詢出的List<Orders>,當(dāng)我們調(diào)用Orders的getUser方法時(shí),開(kāi)始進(jìn)行延遲加載
3.延遲加載,去調(diào)用UserMapper.xml中findUserById這個(gè)方法獲取用戶信息

mybatis默認(rèn)沒(méi)有開(kāi)啟延遲加載,需要在SqlMapConfig.xml中setting配置。

<settings>
        <!-- 打開(kāi)延遲加載開(kāi)關(guān) -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 將積極加載改為消極加載即按需加載 -->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

測(cè)試代碼

    @Test
    public void testFindOrdersUserLazyLoading() throws Exception{
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
        //查詢訂單信息(單表)
        List<Orders> list = ordersMapperCustom.findOrdersUserLazyLoading();

        //遍歷上邊的訂單列表
        for(Orders orders:list){
            //執(zhí)行g(shù)etUser()去查詢用戶信息,這里實(shí)現(xiàn)按需加載
            User user = orders.getUser();

        }
    }
6.2.6 延遲加載思考

不使用mybatis提供的association及collection中的延遲加載功能,如何實(shí)現(xiàn)延遲加載?

實(shí)現(xiàn)方法如下:
1.查詢訂單列表
2.根據(jù)用戶id查詢用戶信息
實(shí)現(xiàn)思路:
先去查詢第一個(gè)mapper方法,獲取訂單信息列表
在程序中(service),按需去調(diào)用第二個(gè)mapper方法去查 詢用戶信息。

總之:使用延遲加載方法,先去查詢簡(jiǎn)單的sql(最好單表,也可以關(guān)聯(lián)查詢),再去按需要加載關(guān)聯(lián)查詢的其他信息。

七、查詢緩存

7.1 定義

mybatis提供查詢緩存,用于減輕數(shù)據(jù)壓力,提高數(shù)據(jù)庫(kù)性能。
mybatis提供一級(jí)緩存,和二級(jí)緩存。


一級(jí)緩存是SqlSession級(jí)別的緩存。在操作數(shù)據(jù)庫(kù)時(shí)需要構(gòu)造sqlSession對(duì)象,在對(duì)象中有一個(gè)數(shù)據(jù)結(jié)構(gòu)(HashMap)用于存儲(chǔ)緩存數(shù)據(jù)。不同的sqlSession之間的緩存數(shù)據(jù)區(qū)域(HashMap)是互相不影響的。

二級(jí)緩存是mapper級(jí)別的緩存,多個(gè)SqlSession去操作同一個(gè)Mapper的sql語(yǔ)句,多個(gè)SqlSession去操作數(shù)據(jù)庫(kù)得到數(shù)據(jù)會(huì)存在二級(jí)緩存區(qū)域,二級(jí)緩存是跨SqlSession的。

如果緩存中有數(shù)據(jù)就不用從數(shù)據(jù)庫(kù)中獲取,大大提高系統(tǒng)性能。

7.2 一級(jí)緩存
7.2.1 工作原理
一級(jí)緩存

第一次發(fā)起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,如果沒(méi)有,從數(shù)據(jù)庫(kù)查詢用戶信息。
得到用戶信息,將用戶信息存儲(chǔ)到一級(jí)緩存中。

如果sqlSession去執(zhí)行commit操作(執(zhí)行插入、更新、刪除),清空SqlSession中的一級(jí)緩存,這樣做的目的為了讓緩存中永遠(yuǎn)存儲(chǔ)最新信息,避免臟讀

第二次發(fā)起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,緩存中有,直接從緩存中獲取用戶信息。

7.2.2 一級(jí)緩存測(cè)試

mybatis默認(rèn)支持一級(jí)緩存,不需要在配置文件中配置

7.2.3 一級(jí)緩存應(yīng)用

正式開(kāi)發(fā),是將mybatis和spring進(jìn)行整合開(kāi)發(fā),事務(wù)控制在service中。
一個(gè)service方法中包括很多mapper方法調(diào)用

service{
//第一次調(diào)用mapper方法findUserById(1)
//第二次調(diào)用mapper方法,從一級(jí)緩存中取數(shù)據(jù)
//方法結(jié)束,sqlSession關(guān)閉
}

如果是執(zhí)行兩次service調(diào)用查詢相同的用戶信息,不走一級(jí)緩存,因?yàn)閟ession方法結(jié)束,sqlSession就關(guān)閉,一級(jí)緩存就清空。所以如果想完成上述操作,可以使用二級(jí)緩存。

7.3 二級(jí)緩存
二級(jí)緩存

首先開(kāi)啟mybatis的二級(jí)緩存。

  • sqlSession1去查詢用戶id為1的用戶信息,查詢到的用戶信息會(huì)將查詢數(shù)據(jù)存儲(chǔ)到二級(jí)緩存中。
  • 如果SqlSession3去執(zhí)行相同mapper下sql,執(zhí)行commit提交,清空該mapper下的二級(jí)緩存區(qū)域的數(shù)據(jù)
  • sqlSession2去查詢用戶id為1的用戶信息,去緩存中找是否存在數(shù)據(jù),如果存在直接從緩存中取出數(shù)據(jù)。

二級(jí)緩存與一級(jí)緩存區(qū)別:二級(jí)緩存的分為更大,多個(gè)sqlSession可以共享一個(gè)UserMapper的二級(jí)緩存區(qū),UserMapper有一個(gè)二級(jí)緩存區(qū)(按namespace分),其他mapper也有自己二級(jí)緩存區(qū),每一個(gè)namespace的mapper有一個(gè)二級(jí)緩存區(qū)域,兩個(gè)mapper的namespace如果相同,這兩個(gè)mapper執(zhí)行sql查詢到數(shù)據(jù)將存在相同的二級(jí)緩存區(qū)域中。

7.3.2 開(kāi)啟二級(jí)緩存

mybatis的二級(jí)緩存是mapper范圍級(jí)別,除了在SqlMapConfig.xml設(shè)置二級(jí)緩存的總開(kāi)關(guān),還要在具體的mapper.xml中開(kāi)啟二級(jí)緩存

SqlMapConfig.xml

<!-- 開(kāi)啟二級(jí)緩存 -->
        <setting name="cacheEnabled" value="true"/>

UserMapper.xml中開(kāi)啟二級(jí)緩存,UserMapper.xml下的sql執(zhí)行完會(huì)存儲(chǔ)到它的緩存區(qū)域(HashMap)

<!-- 開(kāi)啟二級(jí)緩存 -->
    <cache/>
7.3.3 調(diào)用pojo類實(shí)現(xiàn)序列化接口

為了將緩存數(shù)據(jù)取出執(zhí)行反序列化操作,因?yàn)槎?jí)緩存數(shù)據(jù)存儲(chǔ)介質(zhì)多種多樣,不一定在內(nèi)存。

7.3.4 測(cè)試方法

這里是調(diào)用提交操作


7.3.5 useCache配置

在statement中設(shè)置useCache=false可以禁用當(dāng)前select語(yǔ)句的二級(jí)緩存,即每次查詢都會(huì)發(fā)出sql查詢,默認(rèn)情況是true,即該sql使用二級(jí)緩存。
<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">
總結(jié):針對(duì)每次查詢都需要最新的數(shù)據(jù)sql,要設(shè)置成useCache=false,禁用二級(jí)緩存。

7.3.6 刷新緩存(就是清空緩存)

在mapper的同一個(gè)namespace中,如果有其它insert、update、delete操作數(shù)據(jù)后需要刷新緩存,如果不執(zhí)行刷新緩存出現(xiàn)臟讀。

設(shè)置statement配置中的flushCache=“true”屬性,默認(rèn)情況下為true即刷新緩存,如果改成false則不會(huì)刷新。使用緩存時(shí)如果手動(dòng)修改數(shù)據(jù)庫(kù)表中的查詢數(shù)據(jù)會(huì)出現(xiàn)臟讀。

如下:
<insert id="insertUser" parameterType="com.TiHom.mybatis.po.User" flushCache="true">
總結(jié):一般執(zhí)行完commit操作都需要刷新緩存,flushCache=true表示刷新緩存,這樣可以避免數(shù)據(jù)庫(kù)臟讀

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容