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)系作者
  • 序言:七十年代末寿羞,一起剝皮案震驚了整個(gè)濱河市猖凛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绪穆,老刑警劉巖辨泳,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虱岂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡漠吻,警方通過(guò)查閱死者的電腦和手機(jī)量瓜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)途乃,“玉大人绍傲,你說(shuō)我怎么就攤上這事∷9玻” “怎么了烫饼?”我有些...
    開(kāi)封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)试读。 經(jīng)常有香客問(wèn)我杠纵,道長(zhǎng),這世上最難降的妖魔是什么钩骇? 我笑而不...
    開(kāi)封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任比藻,我火速辦了婚禮,結(jié)果婚禮上倘屹,老公的妹妹穿的比我還像新娘银亲。我一直安慰自己,他們只是感情好纽匙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布务蝠。 她就那樣靜靜地躺著,像睡著了一般烛缔。 火紅的嫁衣襯著肌膚如雪馏段。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天践瓷,我揣著相機(jī)與錄音院喜,去河邊找鬼。 笑死晕翠,一個(gè)胖子當(dāng)著我的面吹牛喷舀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播崖面,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼元咙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼梯影!你這毒婦竟也來(lái)了巫员?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤甲棍,失蹤者是張志新(化名)和其女友劉穎简识,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡七扰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年奢赂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颈走。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膳灶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出立由,到底是詐尸還是另有隱情轧钓,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布锐膜,位于F島的核電站毕箍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏道盏。R本人自食惡果不足惜而柑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荷逞。 院中可真熱鬧媒咳,春花似錦、人聲如沸颅围。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)院促。三九已至筏养,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間常拓,已是汗流浹背渐溶。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弄抬,地道東北人茎辐。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像掂恕,于是被迫代替她去往敵國(guó)和親拖陆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容