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 的方式。