MyBatis script
1. 前言
前面一系列动态 SQL 小节的学习中,我们都是在 xml 中书写 SQL 的。注解无法发挥 MyBatis 动态 SQL 的真正威力,但是 if、choose、bind、where 等标签还是可以在注解中使用的。
MyBatis 官方文档对于此的介绍只有寥寥一句话和一个简单的例子,在实际的应用中也几乎没有人这样去做,因为它确实不太美观,但是考虑到这个知识点并不复杂,也极有可能成为一个刁钻的面试点,我们还是一起来学习一下。
2. 实例
在注解中使用动态 SQL 其实十分简单,只需在动态 SQL 语句的外面包上一层script
标签即可。如下:
@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 标签,这里考虑到 SQL 语句的美观性,我们把语句分成了字符串数组来书写,MyBatis 会自动将其拼接成一个完整的语句。
3. 实践
3.1 例1. 查询小写名称客户
请使用 MyBatis 完成对 imooc_user 表查询小写名称客户的功能,将名称小写后再进行查询。
分析:
使用本小节所学的知识,直接在 UserMapper.java 接口上添加方法,并使用 Select 注解即可。
步骤:
在 UserMapper.java 中添加上对应的接口方法,方法接受 username 一个参数。
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);
}
结果:
通过如下代码,我们运行 selectUsernameLowercase 这个方法。
UserMapper userMapper = session.getMapper(UserMapper.class);
User pedro = userMapper.selectUsernameLowercase("PEDRO");
System.out.println(pedro);
成功后,结果为:
User{id=2, username='pedro', age=24, score=200}
4. 小结
- 通过 scirpt 标签,我们可以在注解中使用动态 SQL 的诸多标签,极大地增强了注解的能力,但相对于 xml 这种更为优雅的方式,无疑是后者更佳,因此我们我们强力推荐你使用 xml 的方式。