MyBatis 传递多个参数一般有以下几种方法:
- 使用 Map
 - 把参数封装成 Bean,传递 Bean 的对象
 - 使用 
@Param - 编译时使用 
-parameters参数 (推荐使用) 
下面以用户名和密码作为参数查询用户为例进行介绍。
使用 Map
Java Mapper:
1  | public interface UserMapper {  | 
Xml Mapper:
1  | <select id="findUserByUsernameAndPassword" resultType="User">  | 
调用:
1  | Map params = new HashMap();  | 
缺点:
每次都要构造 Map,不方便。
把参数封装成 Bean,传递 Bean 的对象
Java Mapper:
1  | public interface UserMapper {  | 
UserParam:
1  | public class UserParam {  | 
Xml Mapper:
1  | <select id="findUserByUsernameAndPassword" resultType="User">  | 
调用:
1  | UserParam param = new UserParam();  | 
缺点:
一种参数组合就要创建一个对应的类,麻烦。
使用 @Param
Java Mapper:
1  | public interface UserMapper {  | 
Xml Mapper:
1  | <select id="findUserByUsernameAndPassword" resultType="User">  | 
调用:
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  | public interface UserMapper {  | 
Xml Mapper:
1  | <select id="findUserByUsernameAndPassword" resultType="User">  | 
调用:
1  | User user = userMapper.findUserByUsernameAndPassword(username, password);  | 
缺点:
需要最低 Java 8,并且在编译时使用 -parameters 参数,但是代码简洁。
Gradle 在任务 compileJava 中增加编译参数:
1  | compileJava {  | 
IDEA 中设定额外的编译参数:
在 Compiler -> Java Compiler 中,设置 Additional command line parameters 为 -parameters:
