Mybatis foreach標簽含義

来源:https://www.cnblogs.com/xiaoxi666/archive/2018/10/10/9768915.html
-Advertisement-
Play Games

背景 考慮以下場景: InfoTable(信息表): | Name | Gender | Age | Score | | | | | | | 張三 | 男 | 21 | 90 | | 李四 | 女 | 20 | 87 | | 王五 | 男 | 22 | 92 | | 趙六 | 女 | 19 | 94 ...


背景

考慮以下場景:

InfoTable(信息表):

Name Gender Age Score
張三 21 90
李四 20 87
王五 22 92
趙六 19 94
孫七 23 88
周八 20 91

StatusTable(狀態表,指是否有在考試之前複習):

Name hasReview
張三
李四
王五
趙六
孫七
周八

現在,我想知道所有複習過的學生的成績,可以利用mysql中的子查詢來實現:

SELECT Score 
FROM InfoTable 
WHERE Name in (SELECT Name 
               FROM StatusTable 
               WHERE hasReview = '是');

這種方式非常方便,我們只要把查詢條件寫出來,剩下的操作都由mysql來處理。而在實際場景中,為了減少底層耦合,我們一般不通過mysql中的子查詢方式聯表查詢,而是先執行子查詢得到結果集,再以結果集作為條件執行外層查詢。通常情況下,子查詢和外層查詢由上層的不同服務執行,這樣就在一定程度上達到了底層資料庫解耦的目的。註意這種實現方式將mysql內部的一部分複雜操作拋給了我們。這時,Mybatis中的foreach標簽就有了用武之地。

Mybatis 中foreach標簽的用法

還以剛纔的例子來說,先執行子查詢

SELECT Name FROM StatusTable WHERE hasReview = '是'

再執行外層查詢,就是

SELECT Score 
FROM InfoTable 
WHERE Name in ('張三' , '王五', '趙六', '周八');

也就是一個批量查詢操作,將其抽象一下(假設有三個條件):

SELECT * 
FROM <tableName> 
WHERE <ColumnName> IN (<case1>,<case2>,<case3>)

實際情況中,case可能遠不止3個,這時可以在XXXMapper.xml文件中利用Mybatis中的foreach編寫sql語句:

SELECT * 
FROM <tableName> 
WHERE <ColumnName> IN 
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
    #{item}
</foreach>

就可以實現相同的效果了。

那麼問題來了,foreach標簽中各種參數是什麼含義呢?

  • collection
    1. 如果傳入的是單參數且參數類型是一個List的時候,collection屬性值為list
    2. 如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值為array
    3. 如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可以封裝成map,實際上如果你在傳入參數的時候,在breast裡面也是會把它封裝成一個Map的,map的key就是參數名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map裡面的key
  • index 集合迭代位置
  • item 集合中的每一個元素別名
  • open 開始符號,例如這裡的(,就對應於IN (<case1>,<case2>,<case3>)中IN後面的第一個(
  • separator 分隔符,例如這裡的,,就對應於IN (<case1>,<case2>,<case3>)中的,
  • close 結束符號,例如這裡的),就對應於IN (<case1>,<case2>,<case3>)<case3>後面的)

參考

mybatis foreach標簽的解釋 與常用之處

Mybatis中屬性的含義 之 collection

1.eg:

<select id="getEmpsInNames" resultType="emp">
  select * from emp where ename in
  <foreach collection="list" index="index" item="name" open="("
      separator="," close=")">
      #{name}
  </foreach>
</select>

對應的測試代碼:

@Test
public void dynamicForeachTest() {
    SqlSession session = Util.getSqlSessionFactory().openSession();
    BlogMapper blogMapper = session.getMapper(BlogMapper.class);
    List<Integer> ids = new ArrayList<Integer>();
    ids.add(1);
    ids.add(3);
    ids.add(6);
    List<Blog> blogs = blogMapper.dynamicForeachTest(ids);
    for (Blog blog : blogs)
        System.out.println(blog);
    session.close();
}

2.eg:

<select id="dynamicForeach2Test" resultType="Blog">
    select * from t_blog where id in
    <foreach collection="array" index="index" item="item" open="(" 
      separator="," close=")">
        #{item}
    </foreach>
</select>

對應的測試代碼:

@Test
public void dynamicForeach2Test() {
    SqlSession session = Util.getSqlSessionFactory().openSession();
    BlogMapper blogMapper = session.getMapper(BlogMapper.class);
    int[] ids = new int[] {1,3,6,9};
    List<Blog> blogs = blogMapper.dynamicForeach2Test(ids);
    for (Blog blog : blogs)
        System.out.println(blog);
    session.close();
}

3.eg:

​ 自己把參數封裝成Map的類型

<select id="dynamicForeach3Test" resultType="Blog">
    select * from t_blog where title like "%"#{title}"%" and id in
    <foreach collection="ids" index="index" item="item" open="(" 
        separator="," close=")">
        #{item}
    </foreach>
</select>

上述collection的值為ids,是傳入的參數Map的key,對應的Mapper代碼:
public List dynamicForeach3Test(Map<String, Object> params);
對應測試代碼:

@Test
public void dynamicForeach3Test() {
    SqlSession session = Util.getSqlSessionFactory().openSession();
    BlogMapper blogMapper = session.getMapper(BlogMapper.class);
    final List<Integer> ids = new ArrayList<Integer>();
    ids.add(1);
    ids.add(2);
    ids.add(3);
    ids.add(6);
    ids.add(7);
    ids.add(9);
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("ids", ids);
    params.put("title", "中國");
    List<Blog> blogs = blogMapper.dynamicForeach3Test(params);
    for (Blog blog : blogs)
        System.out.println(blog);
    session.close();
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • yum安裝jdk的好處就是不需要手動再配置環境變數,所有的變數都是自動生成 1.檢查系統是否存在jdk,存在刪除原版jdk 如果沒有信息輸出,則表示沒有安裝jdk 如果存在則執行命令刪除和卸載相關信息 2.執行命令檢索包含java的列表 3.以為我要安裝1.8版本jdk所以,我需要檢索java-1. ...
  • 伺服器端安裝 1、安裝倉庫 rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm 2、安裝軟體包 yum install zabbix-server-mysql zab ...
  • 查看僵屍進程 lsof grep deleted; 用於查看已經停止但還在占用存儲的進程 ...
  • 有些用戶在把Win7/Win8.1升級到Win10正式版後,發現屏幕一直不停閃爍,以至於無法正常使用。出現這種情況的原因可能有很多,微軟社區的論壇審閱人Alex_Shen給出了一種解決方案:進入安全模式停止兩個服務。好系統官網將其提供的方法進行整理後供大家參考。 工具/原料 好系統重裝助手 具體操作 ...
  • 本文來自:https://www.breakyizhan.com/sql/5648.html1. 儲存與管理資料儲存與管理資料一直是資訊應用上最基本、也是最常見的技術。在還沒有使用電腦來管理你的資料時,你可能會使用這樣的方式來保存世界上所有的國家資料:這樣的作法在生活中是很常見的,例如親友的通訊錄,... ...
  • 看了網上好多種教程,自己嘗試失敗了好多次,最後總算弄好了,具體如下 zip下載地址:https://dev.mysql.com/downloads/mysql/ 之後點擊No thanks, just start my download. 下載之後解壓文件 然後配置環境變數,這樣可以直接在cmd中輸 ...
  • 第二篇這裡嘗試聊聊緩存的主從(Master-Slave),以及相關的高可用實現(High-Availability)(具體應用依然以Redis 舉例) 1.1 關於主從分離的取捨觀點 是否採用主從分離(這裡特指讀寫分離),個人目前的觀點是,它在很多場景里,並不是一個很好的方案。 我更想說的是,甚至任... ...
  • 一偽分佈模式 特點:在單機上,模擬一個分散式的環境,具備Hadoop的所有功能 HDFS:NameNode + DataNode + SecondaryNameNode Yarn:ResourceManager + NodeManager (*)hadoop-env.sh JAVA_HOME /ro ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...