MyBatis select標(biāo)簽

在 MyBatis 中,select 標(biāo)簽是最常用也是功能最強(qiáng)大的 SQL 語言,用于執(zhí)行查詢操作。

select 示例語句如下。

<select id="selectAllWebsite" resultType="net.biancheng.po.Website" parameterType="string">
    SELECT id,NAME,url FROM website WHERE NAME LIKE CONCAT ('%',#{name},'%')
</select>
                

以上是一個(gè) id 為 selectAllWebsite 的映射語句,參數(shù)類型為 string,返回結(jié)果類型為 Website。

執(zhí)行 SQL 語句時(shí)可以定義參數(shù),參數(shù)可以是一個(gè)簡單的參數(shù)類型,例如 int、float、String;也可以是一個(gè)復(fù)雜的參數(shù)類型,例如 JavaBean、Map 等。MyBatis 提供了強(qiáng)大的映射規(guī)則,執(zhí)行 SQL 后,MyBatis 會(huì)將結(jié)果集自動(dòng)映射到 JavaBean 中。

為了使數(shù)據(jù)庫的查詢結(jié)果和返回值類型中的屬性能夠自動(dòng)匹配,通常會(huì)對(duì) MySQL 數(shù)據(jù)庫和 JavaBean 采用同一套命名規(guī)則,即 Java 命名駝峰規(guī)則,這樣就不需要再做映射了(數(shù)據(jù)庫表字段名和屬性名不一致時(shí)需要手動(dòng)映射)。

參數(shù)的傳遞使用#{參數(shù)名},相當(dāng)于告訴 MyBatis 生成 PreparedStatement 參數(shù)。對(duì)于 JDBC,該參數(shù)會(huì)被標(biāo)識(shí)為“?”。以上 SQL 語句可以使用 JDBC 實(shí)現(xiàn),實(shí)現(xiàn)代碼如下。

String sql = "SELECT id,NAME,url FROM website WHERE NAME LIKE CONCAT ('%',?,'%')";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,userName);
                

select標(biāo)簽常用屬性

下面介紹 select 標(biāo)簽中常用的屬性。

<select>標(biāo)簽的常用屬性

屬性名稱 描述 備注
parameterType 表示傳入 SQL 語句傳入?yún)?shù)類型的全限定名或別名。它是一個(gè)可選屬性,MyBatis 能推斷出具體傳入語句的參數(shù) 支持基本數(shù)據(jù)類型和 JavaBean、Map 等復(fù)雜數(shù)據(jù)類型
resultType SQL 語句執(zhí)行后返回的類型(全限定名或者別名)。如果是集合類型,返回的是集合元素的類型,返回時(shí)可以使用 resultType 或 resultMap 之一 -
resultMap 它是映射集的引用,與 <resultMap> 元素一起使用,返回時(shí)可以使用 resultType 或 resultMap 之一 是 MyBatis 最復(fù)雜的元素,可以配置映射規(guī)則、級(jí)聯(lián)、typeHandler 等
flushCache 用于設(shè)置在調(diào)用 SQL 語句后是否要求 MyBatis 清空之前查詢的本地緩存和二級(jí)緩存 用于設(shè)置在調(diào)用 SQL 語句后是否要求 MyBatis 清空之前查詢的本地緩存和二級(jí)緩存 默認(rèn)值為 false,如果設(shè)置為 true,則任何時(shí)候只要 SQL 語句被調(diào)用都將清空本地緩存和二級(jí)緩存
useCache 啟動(dòng)二級(jí)緩存的開關(guān),默認(rèn)值為 true,表示將査詢結(jié)果存入二級(jí)緩存中 -
timeout 用于設(shè)置超時(shí)參數(shù),單位是秒(s),超時(shí)將拋出異常 -
fetchSize 獲取記錄的總條數(shù)設(shè)定 默認(rèn)值是數(shù)據(jù)庫廠商提供的 JDBC 驅(qū)動(dòng)所設(shè)置的條數(shù)
statementType 告訴 MyBatis 使用哪個(gè) JDBC 的 Statement 工作,取值為 STATEMENT(Statement)、 PREPARED(PreparedStatement)、CALLABLE(CallableStatement) -
resultSetType 這是針對(duì) JDBC 的 ResultSet 接口而言,其值可設(shè)置為 FORWARD_ONLY(只允許向前訪問)、SCROLL_SENSITIVE(雙向滾動(dòng),但不及時(shí)更新)、SCROLLJNSENSITIVE(雙向滾動(dòng),及時(shí)更新) -

傳遞多個(gè)參數(shù)

現(xiàn)在需要根據(jù) id 和 name 來模糊查詢網(wǎng)站信息,顯然這涉及到了兩個(gè)參數(shù)。給映射器傳遞多個(gè)參數(shù)分為以下三種方法。

  • 使用Map傳遞參數(shù)

  • 使用注解傳遞參數(shù)

  • 使用JavaBean傳遞參數(shù)

1. 使用Map傳遞參數(shù)

使用 MyBatis 提供的 Map 接口作為參數(shù)實(shí)現(xiàn),如下所示。

<!-- 根據(jù)name和url模糊查詢網(wǎng)站信息 -->
<select id="selectWebsiteByMap" resultType="net.biancheng.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);
                

測(cè)試代碼如下。

Map<String,String> paramsMap = new HashMap<String,String>();
paramsMap.put("name","編程");
paramsMap.put("url","biancheng");
websiteMapper.selectWebsiteByMap(paramsMap);
                

使用 Map 傳遞參數(shù)雖然簡單易用,但是由于這樣設(shè)置參數(shù)需要鍵值對(duì)應(yīng),業(yè)務(wù)關(guān)聯(lián)性不強(qiáng),開發(fā)人員需要深入到程序中看代碼,造成可讀性下降。

2. 使用注解傳遞參數(shù)

使用 MyBatis 的注解 @Param() 傳遞參數(shù),如下所示。

<!-- 根據(jù)name和url模糊查詢網(wǎng)站信息 -->
<select id="selectWebsiteByAn" resultType="net.biancheng.po.Website">
    SELECT id,NAME,url FROM website
    WHERE name LIKE CONCAT ('%',#{name},'%')
    AND url LIKE CONCAT ('%',#{url},'%')
</select>
                

WebsiteMapper 接口中方法如下。

public List<Website> selectWebsiteByAn(@Param("name") String name, @Param("url") String url);
                

當(dāng)我們把參數(shù)傳遞給后臺(tái)時(shí),MyBatis 通過 @Param 提供的名稱就會(huì)知道 #{name} 代表 name 參數(shù),提高了參數(shù)可讀性。但是如果這條 SQL 擁有 10 個(gè)參數(shù)的查詢,就會(huì)造成可讀性下降,增強(qiáng)了代碼復(fù)雜性。

3. 使用JavaBean傳遞參數(shù)

在參數(shù)過多的情況下,MyBatis 允許組織一個(gè) JavaBean,通過簡單的 setter 和 getter 方法設(shè)置參數(shù),提高可讀性。如下所示。

<!-- 根據(jù)name和url模糊查詢網(wǎng)站信息 -->
<select id="selectWebsiteByAn" resultType="net.biancheng.po.Website">
    SELECT id,NAME,url FROM website
    WHERE name LIKE CONCAT ('%',#{name},'%')
    AND url LIKE CONCAT ('%',#{url},'%')
</select>
                

WebsiteMapper 接口中方法如下。

public List<Website> selectWebsiteByAn(Website website);
                

這就是通過 JavaBean 傳遞多個(gè)參數(shù)的方式。

區(qū)別

以上 3 種方式的區(qū)別如下。

  • 使用 Map 傳遞參數(shù)會(huì)導(dǎo)致業(yè)務(wù)可讀性的喪失,繼而導(dǎo)致后續(xù)擴(kuò)展和維護(hù)的困難,所以在實(shí)際應(yīng)用中我們應(yīng)該果斷廢棄該方式。

  • 使用 @Param 注解傳遞參數(shù)會(huì)受到參數(shù)個(gè)數(shù)的影響。當(dāng) n≤5 時(shí),它是最佳的傳參方式,因?yàn)樗又庇^;當(dāng) n>5 時(shí),多個(gè)參數(shù)將給調(diào)用帶來困難。

  • 當(dāng)參數(shù)個(gè)數(shù)大于 5 個(gè)時(shí),建議使用 JavaBean 方式。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清