Mybatis的Mapper接口传递多个参数的时候必须要加@Param注解吗? 您所在的位置:网站首页 接口传入参数不完整或有误 Mybatis的Mapper接口传递多个参数的时候必须要加@Param注解吗?

Mybatis的Mapper接口传递多个参数的时候必须要加@Param注解吗?

2024-07-09 06:46| 来源: 网络整理| 查看: 265

答案是:不一定,取决于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:compile

Mapper接口:

@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 在这里插入图片描述 重新build项目,这样会重新编译class文件,再运行,依然报同样的错误。 看下org.apache.ibatis.reflection.ParamNameResolver#ParamNameResolver这个方法的源代码就足够了。

测试代码下载

结论

1)3.4.1之前,mapper接口传递多个参数的时候,必须要加@Param,不加就会报错。 2)3.4.1之后不一定,如果是开启了useActualParamName参数(默认就是开启的),并且在源代码编译的时候加上了-parameters参数(idea默认就添加了这个参数)就不需要加@Param了,否则还是需要加@Param的。 3)综上,建议还是加上吧。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有