Mybatis的Mapper接口传递多个参数的时候必须要加@Param注解吗? | 您所在的位置:网站首页 › 接口传入参数不完整或有误 › Mybatis的Mapper接口传递多个参数的时候必须要加@Param注解吗? |
答案是:不一定,取决于mybatis的版本、jdk的版本和javac的编译选项。 测试代码Maven依赖: org.mybatis.spring.boot mybatis-spring-boot-starter 2.3.1依赖的mybatis的版本是3.5.13 [INFO] +- org.mybatis.spring.boot:mybatis-spring-boot-starter:jar:2.3.1:compile [INFO] | +- org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:jar:2.3.1:compile [INFO] | +- org.mybatis:mybatis:jar:3.5.13:compile [INFO] | \- org.mybatis:mybatis-spring:jar:2.1.1:compileMapper接口: @Mapper public interface DeptMapper { @Select("select * from dept where name = #{name} and code = #{code}") List selectByNameAndCode(String name, String code); }junit test: @Test public void testSelectByNameAndCode() { List depts = deptMapper.selectByNameAndCode("学工部", "XUEGONG"); System.out.println(depts); }能正常输出。 原因解析查看mybatis的官方文档: useActualParamName: Allow referencing statement parameters by their actual names declared in the method signature. To use this feature, your project must be compiled in Java 8 with -parameters option. (Since: 3.4.1) default:true。 翻译一下:3.4.1之后提供了useActualParamName这个boolean的选项(默认是true),允许把接口方法的形参名作为mybatis语句的参数名,但是前提是项目需要用jdk8以上去编译并且需要添加编译选项-paramters。 测试1)关闭useActualParamName mybatis: configuration: use-actual-param-name: false再运行就会报错: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'name' not found. Available parameters are [0, 1, param1, param2]测试2)关闭编译选项-parameters idea->file->settings->compiler->java compiler 测试代码下载 结论1)3.4.1之前,mapper接口传递多个参数的时候,必须要加@Param,不加就会报错。 2)3.4.1之后不一定,如果是开启了useActualParamName参数(默认就是开启的),并且在源代码编译的时候加上了-parameters参数(idea默认就添加了这个参数)就不需要加@Param了,否则还是需要加@Param的。 3)综上,建议还是加上吧。 |
CopyRight 2018-2019 实验室设备网 版权所有 |