这篇文章将为大家详细讲解有关如何在MyBatis中传递多个参数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
我们在使用MyBatis接口和xml对应的时候,常常是这样写的:
<强>接口强>
public interface DogDao { ,void 保存(@Param (“dogName"), String dogName,, @Param (“age") int 年龄); }
<强> xml 强>
, & lt; insert id=皊ave"比; INSERT 才能;INTO 狗 values 才能;(null,, # {dogName},, #{时代}); ,& lt;/insert>
因为mybatis在执行的之后动态生成实现类,而在java中使用反射会将方法中的参数名称擦除,所以如果在xml中要接收到规定参数名称的参数,通过注解标识是简单又可行的方法,一方面可以自定义方法参数的绑定,另外一方面在xml中也可以起有意义的名称与@Param中对的价值应。
如果不加@Param注解,也想用xml接收响应的参数
public interface DogDao { ,void 保存(Integer id, String dogName,, int 年龄); }
由于在反射和jdk动态代理会将方法名称抹除,所以在解析参数的时候不能像上面的xml # {dogName}这样接收,会将参数的名称序列化成以下方式,param1…paramn
所以在xml中我们要用以下方式来接收:
, & lt; insert id=皊ave"比; INSERT 才能;INTO 狗 values 才能;(null,, # {param2},, # {param2}); ,& lt;/insert>
不想用@Param修饰,但是希望在xml中用方法中的原参数名称接收
我们在jdk不能使用反射获取参数名称,但是在jdk1.8之后提供了参数这个反射类,可以配置参数这个参数到javac编译器上,可以用来获取方法参数上的名称,但是javac编译器默认是关闭的,所以我们在编译代码的时候应该打开它,我们用maven插件的方式开启
在:pom文件中加入以下插件:
& lt; plugin> ,& lt; groupId> org.apache.maven.plugins ,& lt; artifactId> maven-compiler-plugin ,& lt; version> 3.8.0 ,& lt; configuration> & lt;才能compilerArgument> -parameters</compilerArgument> & lt;才能encoding> UTF-8</encoding> ,& lt;/configuration> & lt;/plugin>
这样,javac编译器就能将方法的参数在反射编译的时候一同传递了,我们也不用借助注解就能达到在xml中获取方法中的实际参数的名称,除了加入编译插件,还要加入mybatis的配置开启:
& lt; settings> ,& lt; setting name=皍seActualParamName" https://www.yisu.com/zixun/, value=" false "/> 设置>
官方文档是这样对这个配置说明的:
允许使用方法签名中的名称作为语句参数名称。为了使用该特性,你的项目必须采用Java 8编译,并且加上参数选项。(新增于3.4.1)
Java代码:
public interface DogDao { ,void 保存(Integer id, String dogName,, int 年龄); }
xml代码:
, & lt; insert id=皊ave"比; INSERT 才能;INTO 狗 values 才能;(null,, # {dogName},, #{时代}); ,& lt;/insert>
<强>补充:mybatis传多个参数(不使用@param注解情况和使用@param注解的情况)强>
方法1:顺序传参法
1。不使用@param注解传递多个参数的情况
注:使用jdk1.7得到的是:[1 0 param1 param2]
使用1.8得到的则是:[__arg1、arg0, param1 param2]
#{}里面的数字代表你传入参数的顺序。
这种方法不建议使用,sql层表达不直观,且一旦顺序调整容易出错。
举个栗子:Dao层
List,演示(int userid, String 名称),
对应的XML编写
<强> jdk1.7 强>
& lt; select id=癲emo", resultMap=癠ser"比; select * ,得到user where  user_id=#{0},以及name=, # {1} ,& lt;/select>
<强> jdk1.8之后强>
第一种写法
& lt; select id=癲emo", resultMap=癠ser"比; select * ,得到user where  user_id=# {arg0},以及name=, # {__arg1} ,& lt;/select>
第二种写法
& lt; select id=癲emo", resultMap=癠ser"比; select * ,得到user where  user_id=# {param0},以及name=, # {param1} ,& lt;/select>如何在MyBatis中传递多个参数