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

Mybatis 動(dòng)態(tài)sql的編寫(xiě)與開(kāi)啟二級(jí)緩存

 更新時(shí)間:2023年02月02日 10:15:51   作者:微涼秋意  
二級(jí)緩存是Mapper級(jí)別的緩存,多個(gè)SqlSession去操作同一個(gè)Mapper中的SQL語(yǔ)句,則這些SqlSession可以共享二級(jí)緩存,即二級(jí)緩存是跨SqlSession的,這篇文章主要介紹了Mybatis 動(dòng)態(tài)sql的編寫(xiě)|開(kāi)啟二級(jí)緩存,需要的朋友可以參考下

前言

上篇博文把表連接查詢(xún)和三種對(duì)應(yīng)關(guān)系的寫(xiě)法記錄總結(jié)了,本篇要把 mybatis 中的動(dòng)態(tài)sql 的使用以及緩存知識(shí)記錄下來(lái)。

動(dòng)態(tài)SQL

在解釋 where if 標(biāo)簽之前先進(jìn)行一個(gè)模糊查詢(xún)的操作。

模糊查詢(xún)

如下面一張表:

在這里插入圖片描述

查詢(xún)所有 姓人員的信息:

mapper接口中定義方法:

List<Person> selectName(String name);

xml 中編寫(xiě) sql 語(yǔ)句:

<select id="selectName" resultMap="personMap">
        select *
        from t_person
        where person_name like concat('%', #{name}, '%');
    </select>

這里的 concat('%', #{name}, '%') 寫(xiě)法使用了字符串拼接的技巧,這樣在查詢(xún)語(yǔ)句里就是 %name% 的模糊查詢(xún)了。
如果這樣寫(xiě):'%#{name}%' 是不行的,#{}會(huì)失效。

編寫(xiě)測(cè)試類(lèi):

在這里插入圖片描述

測(cè)試結(jié)果:

在這里插入圖片描述

可以看到所有 姓的人信息被查詢(xún)到了。

where if 標(biāo)簽

姓李的太多,那么我們可以加一個(gè)年齡范圍,于是需要增加兩個(gè)參數(shù):

在這里插入圖片描述

這里要注意,參數(shù)在兩個(gè)以上需要使用 注解 來(lái)綁定。

重點(diǎn)來(lái)看 xml中的 sql 語(yǔ)句

<select id="selectContent" resultMap="personMap">
        select * from t_person
        <where>
            <if test="name != null and name !=''">
                person_name like concat('%',#{name},'%')
            </if>
            <if test="ageMin > 0">
                and age &gt;= #{ageMin}
            </if>
            <if test="ageMax > ageMin">
                and age &lt;= #{ageMax}
            </if>
        </where>

    </select>
  • 可以看到這里的 where 關(guān)鍵字變成了一個(gè)標(biāo)簽 <where>,這是因?yàn)椋?/li>
  • 如果這三個(gè)參數(shù)都不填寫(xiě)的話(huà),where 下的條件就不會(huì)起作用,
  • 此條 sql 就變成了查詢(xún)所有。
  • 顯然,查詢(xún)所有的語(yǔ)法里是沒(méi)有 where 關(guān)鍵字的,因此使用標(biāo)簽代替。
  • 除了使用 <where> 標(biāo)簽之外,也可以使用類(lèi)似 1=1 加 and 的方法拼接。
  • 比如: select * from t_person where 1=1 and ...
  • 此外,where 標(biāo)簽還可以去除多余的 and 前綴。
  • if 標(biāo)簽用來(lái)做判斷,test 里寫(xiě)判斷的條件,標(biāo)簽內(nèi)寫(xiě)判斷成功后的 sql 語(yǔ)句:
  • 這里就是判斷名字是否為空以及年齡的取值范圍是否合理:
  • test 里面的符號(hào)正常寫(xiě),and 和 or 代表并且和或者。
  • sql 語(yǔ)句里,&gt; 是大于的意思,&lt; 是小于的意思。

編寫(xiě)測(cè)試類(lèi):

在這里插入圖片描述

測(cè)試結(jié)果:

在這里插入圖片描述

很明顯,年齡在 20~28 且姓李的只有 “李白” 自己。

update set 標(biāo)簽

以往的修改操作都是將對(duì)象的所有屬性都修改或者重寫(xiě)一遍,這樣是不合邏輯的,因此可以在修改的 sql 語(yǔ)句里使用 if 標(biāo)簽來(lái)優(yōu)化。

mapper 接口中寫(xiě)方法:

void update(Person person);

xml 中編寫(xiě) sql:

	<update id="update">
        update t_person
        <set>
            <if test="personName !=null and personName !=''">
                person_name = #{personName},
            </if>
            <if test="age !=null">
                age         = #{age},
            </if>
            <if test="birthday != null and birthday!= ''">
                birthday    = #{birthday},
            </if>
            <if test=" sex !=null and sex !=''">
                sex = #{sex},
            </if>
            <if test="mobile != null and mobile !=''">
                mobile = #{mobile},
            </if>
            <if test="address !=null and address!=''">
                address = #{address}
            </if>
        </set>
        where person_id = #{personId}
    </update>
  • if 標(biāo)簽想必好理解,但是set 標(biāo)簽是做什么的呢?原因是:
  • 假如只修改名字,那么 sql 語(yǔ)句將變?yōu)椋?/li>
update t_person set person_name = ?, where ...
  • 可以發(fā)現(xiàn)?占位符后面會(huì)有多余的逗號(hào)導(dǎo)致 sql 語(yǔ)法錯(cuò)誤
  • <set> 標(biāo)簽會(huì)自動(dòng)去除多余的逗號(hào)后綴。

值得注意的是:set 標(biāo)簽去除,后綴,where 標(biāo)簽去除and前綴。

foreach 標(biāo)簽

相信大家都知道foreach 跟循環(huán)有關(guān)系,沒(méi)錯(cuò),我們可以利用此標(biāo)簽來(lái)完成 批量刪除 操作。

從 sql 的語(yǔ)句來(lái)看,批量刪除應(yīng)該這樣寫(xiě):

delete from t_person where person_id in (?,?,?,...)

那么 in 后的形式該怎么用 mybatis 表達(dá)出來(lái)呢,有括號(hào),不定數(shù)量的逗號(hào)…

不急,一步步來(lái),先寫(xiě) mapper接口:

void deleteMany(@Param("myIds") int[] ids);

再編寫(xiě) sql 語(yǔ)句:

	<delete id="deleteMany">
        delete from t_person where person_id in
        <foreach collection="myIds" open="(" close=")" separator="," item="id">
            #{id}
        </foreach>
    </delete>

利用 foreach 就可以將參數(shù)集合中的值依次放入到 in 后的括號(hào)內(nèi):(id,id,id...)

foreach 標(biāo)簽相關(guān)解釋?zhuān)?/p>

  • collection:被循環(huán)的數(shù)組或者集合,注意如果是參數(shù)必須使用@Param 起名
  • open : 循環(huán)以什么開(kāi)始
  • close :循環(huán)以什么結(jié)束
  • separator: 循環(huán)以什么分割
  • item : 每次循環(huán)的元素

編寫(xiě)測(cè)試類(lèi)(不要忘記手動(dòng)提交事務(wù)):

在這里插入圖片描述

測(cè)試結(jié)果:

在這里插入圖片描述

可以看到數(shù)組里的元素依次放入了括號(hào)內(nèi),并成功做到了批量刪除。

useGeneratedKeys 獲取插入數(shù)據(jù)的主鍵值

一般我們習(xí)慣將表中的主鍵設(shè)為自增長(zhǎng),那么在使用 insert 插入數(shù)據(jù)時(shí),主鍵是不用賦值的,而是用 null 代替。那怎么才能在插入后直接得到該數(shù)據(jù)的主鍵值呢?那就使用 useGeneratedKeys

來(lái)看具體的使用:

<insert id="insert" useGeneratedKeys="true" keyProperty="personId" keyColumn="person_id">
    insert into t_person
    values (null, #{personName}, #{age}, #{sex}, #{birthday}, #{mobile}, #{address})
</insert>

將值設(shè)為 true 后,keyPropetry 的值填寫(xiě)屬性名,keyColumn 的值填寫(xiě)表的字段名。

編寫(xiě)測(cè)試類(lèi):

	@Test
    public void insert(){
    	SqlSession sqlSession = MybatisUtil.getSqlSession();
    	PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
        Person person = new Person(null,"微涼",21,"1",new Date(),"1359356123","愛(ài)琴海");
        mapper.insert(person);
        sqlSession.commit();
        MybatisUtil.closeSqlSession(sqlSession);
        System.out.println(person);
    }

測(cè)試結(jié)果:

在這里插入圖片描述

可以看到插入數(shù)據(jù)后的主鍵值為 240,這便是自動(dòng)獲取的結(jié)果。

Mybatis 緩存

有關(guān) IO 操作一般都會(huì)很耗時(shí),在一個(gè) javaweb 項(xiàng)目中,頁(yè)面到 tomcat 與 tomcat 到數(shù)據(jù)庫(kù)都屬于IO操作。因此 mybatis 在 tomcat 中創(chuàng)建了一塊叫做緩存的空間,在緩存中保存比如查詢(xún)操作的數(shù)據(jù),以后進(jìn)行重復(fù)操作時(shí),就不必到數(shù)據(jù)庫(kù)中獲取了,而是直接在 tomcat 內(nèi)部獲取。

如果對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改,緩存中的數(shù)據(jù)跟數(shù)據(jù)庫(kù)中的對(duì)應(yīng)不上,那么此時(shí)緩存中的就變成了臟數(shù)據(jù)。

一級(jí)緩存

特點(diǎn):

  • 默認(rèn)開(kāi)啟
  • 作用在同一個(gè) SqlSession
  • 臟數(shù)據(jù)的處理: 一旦執(zhí)行增刪改,立刻清空緩存

但是一級(jí)緩存并沒(méi)有什么意義,因?yàn)樽饔梅秶木壒剩荒茉谝粋€(gè) SqlSession ,也就是一個(gè)事務(wù)內(nèi),一旦提交事務(wù),緩存就會(huì)被清空,沒(méi)有實(shí)戰(zhàn)意義。

二級(jí)緩存

二級(jí)緩存的作用范圍大,符合實(shí)戰(zhàn)的需求,該如何開(kāi)啟:

  • 實(shí)體類(lèi)需要實(shí)現(xiàn)可序列化接口:implements Serializable
  • mybatis-config.xml 文件中添加<settings> 標(biāo)簽:
<!--開(kāi)啟二級(jí)緩存 settings 寫(xiě)在 properties 和 typeAliases 之間-->
<settings>
   <setting name="cacheEnabled" value="true"/>
</settings>

3.在對(duì)應(yīng) mapperxml 文件中添加 <cache> 標(biāo)簽:

<cache size="1024" eviction="LRU" flushInterval="60000"/>
  • size:定義二級(jí)緩存空間大小 (單位是 M)
  • eviction:定義緩存到達(dá)上限時(shí)的淘汰策略,常使用LRU算法:
    • 叫做最近最久未使用算法,即清空最近使用次數(shù)最少的緩存
  • flushInterval:定義清空緩存的間隔時(shí)間 (單位 ms)

作用范圍:

  • 同一個(gè)sqlSessionFactory內(nèi),而且必須提交事務(wù)。

臟數(shù)據(jù)的處理:

  1. 一旦執(zhí)行增刪改,默認(rèn)清空同一個(gè) namespace 下的二級(jí)緩存。
  2. 自定義清空緩存的策略:
  • flushCache屬性,值為 true 時(shí)執(zhí)行清空緩存,為 false 則不清空。
  • 在 insertdelete、update 標(biāo)簽里默認(rèn)為 true
  • 在 select 標(biāo)簽里默認(rèn)為 false

臟數(shù)據(jù)并不都是一定要清空,因此在增刪改查標(biāo)簽內(nèi)可以自由的設(shè)定緩存清空的策略。

mybatis 框架的記錄到此結(jié)束,一共三篇,感興趣的小伙伴可以訂閱此專(zhuān)欄。

到此這篇關(guān)于Mybatis 動(dòng)態(tài)sql的編寫(xiě)|開(kāi)啟二級(jí)緩存的文章就介紹到這了,更多相關(guān)Mybatis開(kāi)啟二級(jí)緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot運(yùn)行到dokcer中 dockerfile的場(chǎng)景分析

    springboot運(yùn)行到dokcer中 dockerfile的場(chǎng)景分析

    這篇文章主要介紹了springboot運(yùn)行到dokcer中 dockerfile,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • java中final與finally的使用介紹

    java中final與finally的使用介紹

    本篇文章介紹了,在java中final與finally的使用。需要的朋友參考下
    2013-04-04
  • elasticsearch kibana簡(jiǎn)單查詢(xún)講解

    elasticsearch kibana簡(jiǎn)單查詢(xún)講解

    今天小編就為大家分享一篇關(guān)于elasticsearch kibana簡(jiǎn)單查詢(xún)講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • Maven分模塊開(kāi)發(fā)執(zhí)行指令失敗的問(wèn)題

    Maven分模塊開(kāi)發(fā)執(zhí)行指令失敗的問(wèn)題

    Maven分模塊開(kāi)發(fā),行指令失敗,modules.module[3]‘ specifies duplicate child module maven_dao @ line 29, column 1的問(wèn)題,本文給大家分享解決方法,感興趣的朋友跟隨小編一起看看吧
    2020-09-09
  • Java設(shè)計(jì)模式中的建造者模式詳解

    Java設(shè)計(jì)模式中的建造者模式詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式中的建造者模式詳解,建造者模式使我們?nèi)粘9ぷ髦斜容^常見(jiàn)的一種設(shè)計(jì)模式,和工廠模式一樣屬于創(chuàng)建型設(shè)計(jì)模式,用于解耦對(duì)象創(chuàng)建和對(duì)象使用的邏輯,需要的朋友可以參考下
    2023-12-12
  • SpringBoot2.x 集成騰訊云短信的詳細(xì)流程

    SpringBoot2.x 集成騰訊云短信的詳細(xì)流程

    本文主要對(duì)SpringBoot2.x集成騰訊云短信進(jìn)行簡(jiǎn)單總結(jié),其中SpringBoot使用的2.4.5版本,本文通過(guò)業(yè)務(wù)流程圖實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-06-06
  • 與近日火爆的ChatGPT聊Elasticsearch源碼

    與近日火爆的ChatGPT聊Elasticsearch源碼

    這篇文章主要為大家分享了與近日火爆的ChatGPT聊Elasticsearch源碼的話(huà)題內(nèi)容,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • java如何使用fastjson修改多層嵌套的Objectjson數(shù)據(jù)

    java如何使用fastjson修改多層嵌套的Objectjson數(shù)據(jù)

    這篇文章主要介紹了java如何使用fastjson修改多層嵌套的Objectjson數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • zookeeper實(shí)戰(zhàn)之實(shí)現(xiàn)分布式鎖的方法

    zookeeper實(shí)戰(zhàn)之實(shí)現(xiàn)分布式鎖的方法

    Zookeeper實(shí)現(xiàn)分布式鎖比Redis簡(jiǎn)單,Zookeeper有一個(gè)特性,多個(gè)線(xiàn)程在Zookeeper里創(chuàng)建同一個(gè)節(jié)點(diǎn)時(shí),只有一個(gè)線(xiàn)程執(zhí)行成功,Zookeeper主要是利用臨時(shí)有序節(jié)點(diǎn)這一特性實(shí)現(xiàn)分布式鎖,感興趣的朋友跟隨小編一起學(xué)習(xí)吧
    2022-11-11
  • java實(shí)現(xiàn)順序結(jié)構(gòu)線(xiàn)性列表的函數(shù)代碼

    java實(shí)現(xiàn)順序結(jié)構(gòu)線(xiàn)性列表的函數(shù)代碼

    java實(shí)現(xiàn)順序結(jié)構(gòu)線(xiàn)性列表的函數(shù)代碼。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10

最新評(píng)論

六安市| 达拉特旗| 富川| 石台县| 绥化市| 松原市| 衡东县| 喀喇| 日喀则市| 永登县| 铜梁县| 东宁县| 郎溪县| 时尚| 阜平县| 灵璧县| 华宁县| 宁夏| 乐清市| 尉犁县| 游戏| 五常市| 阳山县| 丰宁| 蒙自县| 辽中县| 乌兰浩特市| 岚皋县| 洞头县| 阜新| 永登县| 中方县| 元谋县| 凤城市| 清苑县| 临泽县| 台东市| 洞口县| 克山县| 农安县| 克什克腾旗|