显示目录

MyBatis 传递多个参数

MyBatis 传递多个参数一般有以下几种方法:

  • 使用 Map
  • 把参数封装成 Bean,传递 Bean 的对象
  • 使用 @Param
  • 编译时使用 -parameters 参数 (推荐使用)

下面以用户名和密码作为参数查询用户为例进行介绍。

使用 Map

Java Mapper:

1
2
3
public interface UserMapper {
User findUserByUsernameAndPassword(Map params);
}

Xml Mapper:

1
2
3
<select id="findUserByUsernameAndPassword" resultType="User">
SELECT id, username, password FROM user WHERE username=#{username} AND password=#{password}
</select>

调用:

1
2
3
4
Map params = new HashMap();
params.put("username", username);
params.put("password", password);
User user = userMapper.findUserByUsernameAndPassword(params);

缺点:

每次都要构造 Map,不方便。

把参数封装成 Bean,传递 Bean 的对象

Java Mapper:

1
2
3
public interface UserMapper {
User findUserByUsernameAndPassword(UserParam param);
}

UserParam:

1
2
3
4
5
public class UserParam {
private String username;
private String password;
...// Getters and Setters
}

Xml Mapper:

1
2
3
<select id="findUserByUsernameAndPassword" resultType="User">
SELECT id, username, password FROM user WHERE username=#{username} AND password=#{password}
</select>

调用:

1
2
3
4
UserParam param = new UserParam();
param.setUsername(username);
param.setPassword(password);
User user = userMapper.findUserByUsernameAndPassword(param);

缺点:

一种参数组合就要创建一个对应的类,麻烦。

使用 @Param

Java Mapper:

1
2
3
public interface UserMapper {
User findUserByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
}

Xml Mapper:

1
2
3
<select id="findUserByUsernameAndPassword" resultType="User">
SELECT id, username, password FROM user WHERE username=#{username} AND password=#{password}
</select>

调用:

1
User user = userMapper.findUserByUsernameAndPassword(username, password);

缺点:

有的时候参数列表会写的很长。

编译时使用 -parameters 参数

使用 javac 编译时增加参数 -parameters 就能够把参数的名字编译到字节码里,MyBatis 就能够使用参数的名字进行参数绑定,不需要使用 @Param 了,代码看上去简洁很多,不过需要 JDK 最低 Java 8 才行。

javac -parameters: Generate metadata for reflection on method parameters.

Java Mapper:

1
2
3
public interface UserMapper {
User findUserByUsernameAndPassword(String username, String password);
}

Xml Mapper:

1
2
3
<select id="findUserByUsernameAndPassword" resultType="User">
SELECT id, username, password FROM user WHERE username=#{username} AND password=#{password}
</select>

调用:

1
User user = userMapper.findUserByUsernameAndPassword(username, password);

缺点:

需要最低 Java 8,并且在编译时使用 -parameters 参数,但是代码简洁。


Gradle 在任务 compileJava 中增加编译参数:

1
2
3
compileJava {
options.compilerArgs << '-Xlint:unchecked' << '-Xlint:deprecation' << '-parameters'
}

IDEA 中设定额外的编译参数:

Compiler -> Java Compiler 中,设置 Additional command line parameters-parameters: