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
: