MyBatis select標簽的使用示例
MyBatis 中,select 標簽是最常用也是功能最強大的 SQL 語言,用于執(zhí)行查詢操作,select 示例語句如下。
<select id="selectAllWebsite" resultType="net.cc.po.Website" parameterType="string">
SELECT id,NAME,url FROM website WHERE NAME LIKE CONCAT ('%',#{name},'%')
</select>以上是一個 id 為 selectAllWebsite 的映射語句,參數(shù)類型為 string,返回結果類型為 Website
執(zhí)行 SQL 語句時可以定義參數(shù),參數(shù)可以是一個簡單的參數(shù)類型,例如 int、float、String;也可以是一個復雜的參數(shù)類型,例如 JavaBean、Map 等。MyBatis 提供了強大的映射規(guī)則,執(zhí)行 SQL 后,MyBatis 會將結果集自動映射到 JavaBean 中。
參數(shù)的傳遞使用#{參數(shù)名},相當于告訴 MyBatis 生成 PreparedStatement 參數(shù)。對于 JDBC,該參數(shù)會被標識為“?”。以上 SQL 語句可以使用 JDBC 實現(xiàn),實現(xiàn)代碼如下。
String sql = "SELECT id,NAME,url FROM website WHERE NAME LIKE CONCAT ('%',?,'%')";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,userName);?select標簽常用屬性
<select>標簽的常用屬性
| 屬性名稱 | 描 述 | 備注 |
|---|---|---|
| id | 它和 Mapper 的命名空間組合起來使用,是唯一標識符,供 MyBatis 調(diào)用 | 如果命名空間+id不唯一,那么 MyBatis 拋出異常 |
| parameterType | 表示傳入 SQL 語句傳入?yún)?shù)類型的全限定名或別名。它是一個可選屬性,MyBatis 能推斷出具體傳入語句的參數(shù) | 支持基本數(shù)據(jù)類型和 JavaBean、Map 等復雜數(shù)據(jù)類型 |
| resultType | SQL 語句執(zhí)行后返回的類型(全限定名或者別名)。如果是集合類型,返回的是集合元素的類型,返回時可以使用 resultType 或 resultMap 之一 | - |
| resultMap | 它是映射集的引用,與 <resultMap> 元素一起使用,返回時可以使用 resultType 或 resultMap 之一 | 是 MyBatis 最復雜的元素,可以配置映射規(guī)則、級聯(lián)、typeHandler 等 |
| flushCache | 用于設置在調(diào)用 SQL 語句后是否要求 MyBatis 清空之前查詢的本地緩存和二級緩存 | 默認值為 false,如果設置為 true,則任何時候只要 SQL 語句被調(diào)用都將清空本地緩存和二級緩存 |
| useCache | 啟動二級緩存的開關,默認值為 true,表示將査詢結果存入二級緩存中 | - |
| timeout | 用于設置超時參數(shù),單位是秒(s),超時將拋出異常 | - |
| fetchSize | 獲取記錄的總條數(shù)設定 | 默認值是數(shù)據(jù)庫廠商提供的 JDBC 驅(qū)動所設置的條數(shù) |
| statementType | 告訴 MyBatis 使用哪個 JDBC 的 Statement 工作,取值為 STATEMENT(Statement)、 PREPARED(PreparedStatement)、CALLABLE(CallableStatement) | - |
| resultSetType | 這是針對 JDBC 的 ResultSet 接口而言,其值可設置為 FORWARD_ONLY(只允許向前訪問)、SCROLL_SENSITIVE(雙向滾動,但不及時更新)、SCROLLJNSENSITIVE(雙向滾動,及時更新) | - |
傳遞多個參數(shù)
現(xiàn)在需要根據(jù) id 和 name 來模糊查詢網(wǎng)站信息,顯然這涉及到了兩個參數(shù)。給映射器傳遞多個參數(shù)分為以下三種方法。
- 使用Map傳遞參數(shù)
- 使用注解傳遞參數(shù)
- 使用JavaBean傳遞參數(shù)
1. 使用Map傳遞參數(shù)
<!-- 根據(jù)name和url模糊查詢 -->
<select id="selectWebsiteByMap" resultType="net.cc.po.Website" parameterType="map">
SELECT id,NAME,url FROM website
WHERE name LIKE CONCAT ('%',#{name},'%')
AND url LIKE CONCAT ('%',#{url},'%')
</select>在 WebsiteMapper 接口中,方法如下。
public List<Website> selectWebsiteByMap(Map<String, String> params);
測試
Map<String,String> paramsMap = new HashMap<String,String>();
paramsMap.put("name","編程");
paramsMap.put("url","cc");
websiteMapper.selectWebsiteByMap(paramsMap);使用 Map 傳遞參數(shù)雖然簡單易用,但是由于這樣設置參數(shù)需要鍵值對應,業(yè)務關聯(lián)性不強,開發(fā)人員需要深入到程序中看代碼,造成可讀性下降。
2. 使用注解傳遞參數(shù)
<select id="selectWebsiteByAn" resultType="net.cc.po.Website">
SELECT id,NAME,url FROM website
WHERE name LIKE CONCAT ('%',#{name},'%')
AND url LIKE CONCAT ('%',#{url},'%')
</select>接口方法:
public List<Website> selectWebsiteByAn(@Param("name") String name, @Param("url") String url);當我們把參數(shù)傳遞給后臺時,MyBatis 通過 @Param 提供的名稱就會知道 #{name} 代表 name 參數(shù),提高了參數(shù)可讀性。但是如果這條 SQL 擁有 10 個參數(shù)的查詢,就會造成可讀性下降,增強了代碼復雜性。
3. 使用JavaBean傳遞參數(shù)
通過 JavaBean 傳遞多個參數(shù)的方式。
<select id="selectWebsiteByAn" resultType="net.cc.po.Website">
SELECT id,NAME,url FROM website
WHERE name LIKE CONCAT ('%',#{name},'%')
AND url LIKE CONCAT ('%',#{url},'%')
</select>public List<Website> selectWebsiteByAn(Website website);
區(qū)別
以上 3 種方式的區(qū)別如下。
- 使用 Map 傳遞參數(shù)會導致業(yè)務可讀性的喪失,繼而導致后續(xù)擴展和維護的困難,所以在實際應用中我們應該果斷廢棄該方式。
- 使用 @Param 注解傳遞參數(shù)會受到參數(shù)個數(shù)的影響。當 n≤5 時,它是最佳的傳參方式,因為它更加直觀;當 n>5 時,多個參數(shù)將給調(diào)用帶來困難。
- 當參數(shù)個數(shù)大于 5 個時,建議使用 JavaBean 方式。
到此這篇關于MyBatis select標簽的使用示例的文章就介紹到這了,更多相關MyBatis select標簽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springBoot?@Scheduled實現(xiàn)多個任務同時開始執(zhí)行
這篇文章主要介紹了springBoot?@Scheduled實現(xiàn)多個任務同時開始執(zhí)行,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
springboot 多環(huán)境配置 yml文件版的實現(xiàn)方法
這篇文章主要介紹了springboot 多環(huán)境配置 yml文件版的實現(xiàn)方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
IDEA(2022.2)搭建Servlet基本框架超詳細步驟
這篇文章主要給大家介紹了關于IDEA(2022.2)搭建Servlet基本框架超詳細步驟,Servlet容器負責Servlet和客戶的通信以及調(diào)用Servlet的方法,Servlet和客戶的通信采用"請求/響應"的模式,需要的朋友可以參考下2023-10-10
java并發(fā)容器ConcurrentHashMap深入分析
這篇文章主要為大家介紹了java并發(fā)容器ConcurrentHashMap使用示例及深入分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
在SpringBoot中整合數(shù)據(jù)源的示例詳解
這篇文章主要介紹了在SpringBoot中如何整合數(shù)據(jù)源,本文介紹了如何在SpringBoot項目中整合常見的數(shù)據(jù)源,包括JdbcTemplate、MyBatis和JPA,并探討了如何配置和使用多數(shù)據(jù)源,需要的朋友可以參考下2023-06-06

