對(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 工作原理
第一次發(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í)緩存
首先開(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ù)臟讀