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

Mybatis動態(tài)sql超詳細(xì)講解

 更新時間:2023年04月25日 10:44:02   作者:用手寫的從前  
動態(tài)SQL是MyBatis的強大特性之一,顧名思義就是會動的SQL,即是能夠靈活的根據(jù)某種條件拼接出完整的SQL語句,下面這篇文章主要給大家介紹了關(guān)于Mybatis動態(tài)sql的相關(guān)資料,需要的朋友可以參考下

1、多表關(guān)聯(lián)的嵌套查詢

將一個多表關(guān)聯(lián)查詢拆分為多次查詢,先查詢主表數(shù)據(jù),然后查詢關(guān)聯(lián)表數(shù)據(jù).

<association property="dept" javaType="Dept" select="findDeptByID" column="dept_id"></association>

(1). select:指定關(guān)聯(lián)查詢對象的 Mapper Statement ID 為 findDeptByID

(2). column="dept_id":關(guān)聯(lián)查詢時將 dept_id 列的值傳入 findDeptByID,

并將 findDeptByID 查詢的結(jié)果映射到 Emp 的 dept 屬性中

(3).collection 和 association 都需要配置 select 和 column 屬性,兩者配置方法

相同

2、注解

一般寫在Dao中接口的抽象方法的上面,可以代替簡單的sql操作,比如一個簡單的增加操作,這個時候在對應(yīng)的mappers映射文件xml中就不需要在寫<insert >標(biāo)簽了。

注:我們使用注解一般是簡單的且只涉及一張表的操作,而涉及多張表的復(fù)雜操作我們還是在xml文件中設(shè)置

注:我們一般在定義類中的屬性時,一般不定義基本類型,如int,我們需要定義成integer類型,即引用類型,因為引用類型的默認(rèn)值都為null,這樣在判斷時就都為null了,就不需要每一種基本類型都使用不同的默認(rèn)值

3、動態(tài)sql

MyBatis 的一個強大的特性之一通常是它的動態(tài) SQL 能力。 如果你有使用JDBC 或其他 相似框架的經(jīng)驗,你就明白條件地串聯(lián) SQL 字符串在一起是多么 的痛苦,確保不能忘了空格或在列表的最后省略逗號。動態(tài) SQL 可以徹底處理 這種痛苦。

Mybatis實現(xiàn)動態(tài)sql的關(guān)鍵字有:

1.if where

<if>標(biāo)簽會對傳入的條件進行判斷 ,如果滿足條件,就將if標(biāo)簽中的sql語句與前面的sql語句進行拼接,不滿足則跳過。

<where>標(biāo)簽會進行判斷,如果它包含的子標(biāo)簽(一般是if)又返回值,就會在其前面插入一個‘where’,于此同時,他還會根據(jù)情況將子標(biāo)簽前面的and和or進行剔除

舉例:

2.trim

<trim> 標(biāo)簽的功能是可以實現(xiàn)代替其他標(biāo)簽的功能,但同時又比其他標(biāo)簽更加靈活

比如通過設(shè)置它的屬性就可以實現(xiàn)where標(biāo)簽的功能

他有四個標(biāo)簽,分別是:prefix,prefixOverrides,suffix,suffixOverrides

若有<trim>子句</trim>:

prefix,suffix 是將其屬性值分別放在子句之前和之后。

prefixOverrides,suffixOverrides是刪除子句首和子句尾的指定內(nèi)容。

例如where標(biāo)簽用trim來實現(xiàn)如下:

<trim prefix="WHERE" prefixOverrides="AND |OR ">  ...</trim>

3.choose when otherwise

choose標(biāo)簽實現(xiàn)多路選擇,當(dāng)choose下的when標(biāo)簽條件滿足時,就將when中的sql拼進外面的sql,反之若不滿足,則將下面的otherwise標(biāo)簽中的sql拼進總sql。

例如:

4.set

<set>標(biāo)簽是在我們進行update操作時使用。<set>子句</set>

它可以為我們刪除子句尾的',',當(dāng)子句中有內(nèi)容時,會自生成set在子句首。

同樣的,set標(biāo)簽也可以使用trim標(biāo)簽來代替,

<trim prefix="SET" suffixOverrides=","> 子句</trim>

意思就是當(dāng)子句中有內(nèi)容時,會在子句首生成set,反之不生成;然后就是在刪除字句尾的','

5.foreach

foreach標(biāo)簽的使用場景是對集合進行遍歷,并可以自定義的設(shè)置

foreach 元素的功能非常強大,它允許你指定一個集合,聲明可以在元素體內(nèi)使用的集合項(item)和索引(index)變量。它也允許你指定開頭與結(jié)尾的字符串以及各個元素之間的分隔符。這個元素也不會錯誤地添加多余的分隔符,看它多智能!

例如:

最終效果是:select * from student where no in (100,101)

4、特殊符號處理

在 mybatis 中的 xml 文件中,存在一些特殊的符號,比如:<、>、"、&、<> 等,正常書寫 mybatis 會報錯,需要對這些符號進行轉(zhuǎn)義。具體轉(zhuǎn)義如下所示:

除了可以使用上述轉(zhuǎn)義字符外,還可以使用<![CDATA[]]>來包裹特殊字符。如

下所示:

<if test="id != null">
AND <![CDATA[ id <> #{id} ]]>
</if>

<![CDATA[ ]]>是 XML 語法。在 CDATA 內(nèi)部的所有內(nèi)容都會被解析器忽略。但是有個問題那就是 <if> </if> <where> </where>

<choose> </choose> <trim> </trim> 等這些標(biāo)簽都不會被解析,所以 我們只把有特殊字符的語句放在 <![CDATA[ ]]> 盡量縮小<![CDATA[ ]]> 的范圍。

5、Mybatis緩存

Mybatis緩存的作用是為了減輕數(shù)據(jù)庫的壓力,提高查詢性能。緩存實現(xiàn)的原理是從數(shù)據(jù)庫中查出來的對象不刪除,而是將其存儲在緩存中,當(dāng)我們再次查詢查詢同樣的對象時,就直接調(diào)用緩存中的對象,不再向數(shù)據(jù)庫執(zhí)行select,減少了數(shù)據(jù)庫的使用頻率,從而提高了數(shù)據(jù)庫的性能。

Mybatis中有一級緩存和二級緩存

(1)一級緩存

一級緩存的作用域是一個sqlsession對象,第一次查詢數(shù)據(jù)時會保存到sqlsession對象中,第二次如果查詢相同的數(shù)據(jù),則直接從sqlsession獲取,直接獲取的前提是這期間這個對象中的數(shù)據(jù)沒有改變,即增刪改操作;反之,若有改變,則會自動清除sqlsession緩存,重新進行查詢,這并不代表我們關(guān)閉了sqlsession。

消除sqlsession緩存的方式(清除緩存并不代表著關(guān)閉sqlsession):

1.存儲期間數(shù)據(jù)發(fā)生改變,自動清除緩存;

2.手動清除:sqlsession.clearCache();

sqlsession關(guān)閉時會清除緩存。

(2)二級緩存

二級緩存是多個sqlsession共享的,是sqlsession factory 級別的,根據(jù) mapper 的 namespace 劃分區(qū)域 的,相同 namespace 的 mapper 查詢的數(shù)據(jù)緩存在同一個區(qū)域,如果使用 mapper 代理方法每個 mapper 的 namespace 都不同,此時可以理解為二級緩 存區(qū)域是根據(jù) mapper 劃分。

每次查詢會先從緩存區(qū)域查找,如果找不到則從數(shù)據(jù)庫查詢,并將查詢到數(shù)據(jù)寫 入緩存。Mybatis 內(nèi)部存儲緩存使用一個 HashMap,key 為 hashCode+sqlId+Sql 語句。value 為從查詢出來映射生成的 java 對象。

sqlSession 執(zhí)行 insert、update、delete 等操作 commit 提交后會清空緩存區(qū)域,防止臟讀數(shù)據(jù)。

(3)二級緩存的配置

1.在全局配置文件中的<settings>目錄下啟用二級緩存,

如下代碼所示,當(dāng) cacheEnabled 設(shè)置為 true 時啟用二級緩存,設(shè)置為 false 時禁用二級緩存。

<setting name="cacheEnabled" value="true"/>

2、讓我們的model包中的各個類(admin,student,grade)都實現(xiàn)序列化接口 Java.io. Serializable。

3、配置映射文件,在 Mappers 各個映射文件中添加<cache />,表示此 mapper 開啟二級緩存。 當(dāng) SqlSeesion 關(guān)閉時,會將數(shù)據(jù)存入到二級緩存.

注:cache會有一些屬性,例如:

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>

這個更高級的配置創(chuàng)建了一個 FIFO 緩存,每隔 60 秒刷新,最多可以存儲結(jié)果對象或列表的 512 個引用,而且返回的對象被認(rèn)為是只讀的,因此對它們進行修改可能會在不同線程中的調(diào)用者產(chǎn)生沖突。

eviction中屬性可用清除策略有:

  • LRU – 最近最少使用:移除最長時間不被使用的對象。
  • FIFO – 先進先出:按對象進入緩存的順序來移除它們。
  • SOFT – 軟引用:基于垃圾回收器狀態(tài)和軟引用規(guī)則移除對象。
  • WEAK – 弱引用:更積極地基于垃圾收集器狀態(tài)和弱引用規(guī)則移除對象。

默認(rèn)的清除策略是 LRU。

總結(jié)

到此這篇關(guān)于Mybatis動態(tài)sql的文章就介紹到這了,更多相關(guān)Mybatis動態(tài)sql內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java登錄功能實現(xiàn)token生成與驗證

    Java登錄功能實現(xiàn)token生成與驗證

    這篇文章介紹了Java登錄功能實現(xiàn)token生成與驗證,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • Spring整合SpringMVC與Mybatis(SSM)實現(xiàn)完整登錄功能流程詳解

    Spring整合SpringMVC與Mybatis(SSM)實現(xiàn)完整登錄功能流程詳解

    開學(xué)學(xué)校開始講servlet 后期要求做一個登錄功能,這個使用SSM先只做個簡單的只帶登錄功能的,且項目使用了MyBatis-Plus來簡化開發(fā)流程。看情況決定要不要升級功能或者換個寫法
    2022-09-09
  • SpringBoot集成swagger3.0指南分享

    SpringBoot集成swagger3.0指南分享

    本文介紹了如何在Spring Boot項目中集成Swagger 3.0,包括添加依賴、配置Swagger、在Controller上添加注解以及配置訪問權(quán)限
    2024-11-11
  • EasyExcel工具讀取Excel空數(shù)據(jù)行問題的解決辦法

    EasyExcel工具讀取Excel空數(shù)據(jù)行問題的解決辦法

    EasyExcel是阿里巴巴開源的一個excel處理框架,以使用簡單,節(jié)省內(nèi)存著稱,下面這篇文章主要給大家介紹了關(guān)于EasyExcel工具讀取Excel空數(shù)據(jù)行問題的解決辦法,需要的朋友可以參考下
    2022-08-08
  • Java從入門到起飛之變量與運算符詳解

    Java從入門到起飛之變量與運算符詳解

    這篇文章主要介紹了Java編程語言中的關(guān)鍵字、標(biāo)識符、變量、基本數(shù)據(jù)類型以及運算符等基本概念和用法,它涵蓋了變量聲明、賦值、類型轉(zhuǎn)換、字符串操作以及運算符優(yōu)先級等內(nèi)容,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • java 相交鏈表的實現(xiàn)示例

    java 相交鏈表的實現(xiàn)示例

    本文主要介紹了java 相交鏈表的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • SpringBoot集成PageHelper及使用方法詳解

    SpringBoot集成PageHelper及使用方法詳解

    這篇文章主要介紹了SpringBoot集成PageHelper及使用方法詳解,PageHelper 是一個開源的 Java 分頁插件,它可以幫助開發(fā)者簡化分頁操作,本文提供部分相關(guān)代碼,需要的朋友可以參考下
    2023-10-10
  • SpringBoot如何實現(xiàn)文件下載

    SpringBoot如何實現(xiàn)文件下載

    這篇文章主要介紹了SpringBoot如何實現(xiàn)文件下載問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • java生成隨機數(shù)的常用方法分析

    java生成隨機數(shù)的常用方法分析

    這篇文章主要介紹了java生成隨機數(shù)的常用方法,結(jié)合實例形式分析了java生成隨機數(shù)常用的方法功能與相關(guān)使用技巧,需要的朋友可以參考下
    2017-10-10
  • Spring事務(wù)管理中關(guān)于數(shù)據(jù)庫連接池詳解

    Spring事務(wù)管理中關(guān)于數(shù)據(jù)庫連接池詳解

    事務(wù)的作用就是為了保證用戶的每一個操作都是可靠的,事務(wù)中的每一步操作都必須成功執(zhí)行,只要有發(fā)生異常就 回退到事務(wù)開始未進行操作的狀態(tài)。事務(wù)管理是Spring框架中最為常用的功能之一,我們在使用Spring Boot開發(fā)應(yīng)用時,大部分情況下也都需要使用事務(wù)
    2022-12-12

最新評論

修水县| 介休市| 长岛县| 大港区| 社会| 沂源县| 鄂托克旗| 余干县| 寿阳县| 奉化市| 玛多县| 平潭县| 宾川县| 龙江县| 达州市| 呼图壁县| 应城市| 怀来县| 晋城| 十堰市| 新丰县| 拉萨市| 拜泉县| 麻江县| 习水县| 若尔盖县| 舟曲县| 丰县| 鸡西市| 涿州市| 阳曲县| 灵寿县| 桂平市| 安仁县| 抚顺县| 娱乐| 和硕县| 株洲市| 铁岭市| 嵩明县| 安仁县|