Mybatis 对于简单类型参数(基本数据类型、String)的传参绑定引用。可以有 使用@Param注解 和 不使用@Param注解 两种方式实现
不使用@Param注解
以下Mapper接口接收一个简单类型int参数,同时形参前不使用@Param注解
1 |
|
在Mapper.xml映射文件中,有两个地方需要引用形参:sql语句和动态sql。对于前者,在未使用 @Param 注解的情况下,简单类型参数,可以用任意名称通过#{}、${}在sql语句中引用形参变量;而对于后者,只能使用 _parameter 来引用传入的形参,切记不要使用接口方法的形参名来引用(此处即为num),否则会失败
如下示例的mapper.xml映射文件,sql语句引用任意名来引用传入的参数即可,故可以使用id,而在动态sql中使用方法接口的形参名num来引用传入的参数
1 | <select id="findById" parameterType="int" resultMap="studentResultMap"> |
当通过service向该dao接口传入数据时(num = 15)后,程序会抛出异常,提示没有num的get方法
ERROR 21464 —- [nio-8088-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘num’ in ‘class java.lang.Integer’] with root cause
对于上述异常,解决方案是在动态sql的参数引用使用 _parameter 即可
1 | <select id="findById" parameterType="int" resultMap="studentResultMap"> |
从下述执行结果可以看出,该sql被正常解析拼接
使用@Param注解
以下Mapper接口接收一个简单类型int参数,但是形参前使用@Param注解来标识该参数,则在mapper.xml映射文件中,无论是sql语句和动态语句中,都需要使用该@Param注解的标识来引用该参数
以下Mapper接口接收一个简单类型int参数,同时形参前使用@Param注解来标识该形参
1 |
|
则在Mapper.xml文件中,sql语句和动态sql都只能通过@Param注解的标识 num2 来引用参数,如下所示:
1 | <select id="findById" parameterType="int" resultMap="studentResultMap"> |
当传入参数为30和15时,sql语句拼接结果如下,可以看到sql语句正常: