MyBatis script
1. 前言
前面一系列動態(tài) SQL 小節(jié)的學(xué)習(xí)中,我們都是在 xml 中書寫 SQL 的。注解無法發(fā)揮 MyBatis 動態(tài) SQL 的真正威力,但是 if、choose、bind、where 等標(biāo)簽還是可以在注解中使用的。
MyBatis 官方文檔對于此的介紹只有寥寥一句話和一個簡單的例子,在實際的應(yīng)用中也幾乎沒有人這樣去做,因為它確實不太美觀,但是考慮到這個知識點并不復(fù)雜,也極有可能成為一個刁鉆的面試點,我們還是一起來學(xué)習(xí)一下。
2. 實例
在注解中使用動態(tài) SQL 其實十分簡單,只需在動態(tài) SQL 語句的外面包上一層script
標(biāo)簽即可。如下:
@Select({"<script>",
"SELECT * FROM imooc_user",
" WHERE",
" <choose>",
" <when test='id != null'>",
" id = #{id}",
" </when>",
" <when test='username != null'>",
" username = #{username}",
" </when>",
" <otherwise>",
" 1 = 0",
" </otherwise>",
" </choose>",
"</script>"})
User selectUserByIdOrName(@Param("id") Integer id, @Param("username") String username);
在 Select 注解中,我們沒有直接寫入 SQL,而是在最外層套上一個 script 標(biāo)簽,這里考慮到 SQL 語句的美觀性,我們把語句分成了字符串?dāng)?shù)組來書寫,MyBatis 會自動將其拼接成一個完整的語句。
3. 實踐
3.1 例1. 查詢小寫名稱客戶
請使用 MyBatis 完成對 imooc_user 表查詢小寫名稱客戶的功能,將名稱小寫后再進行查詢。
分析:
使用本小節(jié)所學(xué)的知識,直接在 UserMapper.java 接口上添加方法,并使用 Select 注解即可。
步驟:
在 UserMapper.java 中添加上對應(yīng)的接口方法,方法接受 username 一個參數(shù)。
package com.imooc.mybatis.mapper;
import org.apache.ibatis.annotations.Mapper;
import com.imooc.mybatis.model.User;
@Mapper
public interface UserMapper {
@Select({
"<script>",
"<bind name=\"lowercaseName\" value=\"username.toLowercase\"/>",
"SELECT * FROM imooc_user",
"WHERE username = #{lowercaseName}",
"</script>"
})
User selectUsernameLowercase(String username);
}
結(jié)果:
通過如下代碼,我們運行 selectUsernameLowercase 這個方法。
UserMapper userMapper = session.getMapper(UserMapper.class);
User pedro = userMapper.selectUsernameLowercase("PEDRO");
System.out.println(pedro);
成功后,結(jié)果為:
User{id=2, username='pedro', age=24, score=200}
4. 小結(jié)
- 通過 scirpt 標(biāo)簽,我們可以在注解中使用動態(tài) SQL 的諸多標(biāo)簽,極大地增強了注解的能力,但相對于 xml 這種更為優(yōu)雅的方式,無疑是后者更佳,因此我們我們強力推薦你使用 xml 的方式。