我们知道,从本质上来说,MyBatis就是一个映射器,它分为两部分映射:SQL语句映射和查询结果的映射。
在组装SQL语句的时候,往往需要各种参数,可以使用@param注解来映射参数,也可以使用XML的parameterType属性来映射参数,但最终都离不开XML语句中的SQL参数占位符。关于@param注解和parameterType属性的详细介绍,请移步这里,http://www.mybatis.cn/archives/920.html,不再赘述。本文主要讲一下SQL参数占位符的写法。
如果参数只有一个,并且为原始类型或简单数据类型(比如Integer和String,因为没有其它属性,会用它们的值来作为参数),此时参数可以随意命名。如下所示:
select id, username, password
from users
where id = #{id}
但是,当有多个参数的时候,SQL参数占位符该如何写,则需要关注useActualParamName属性的设置。
useActualParamName的作用useActualParamName的作用:允许使用方法签名中的名称作为语句参数名称。从3.4.1版本开始,MyBatis的全局配置useActualParamName默认为true。当然,我们也可以设置为false,如下所示:
备注:MyBatis的xml配置文件中声明settings属性的useActualParamName参数值为true。
useActualParamName的属性值与SQL参数占位符的关系useActualParamName的属性值与SQL参数占位符有什么关系呢?请看下面的例子介绍:
public interface UserDao
{
User findUserById(int id, String name);
}
如果useActualParamName设置为true时,则传递参数需要使用
#{arg0}-#{argn}或者#{param1}-#{paramn}
比如:
select * from t_users where id = #{arg0} and name =#{arg1}
或者
select * from t_users where id = #{param1} and name =#{param2}
如果useActualParamName设置为false时,则传递参数需要使用
#{0}-#{n}或者#{param1}-#{paramn}
比如:
select * from t_users where id = #{0} and name =#{1}
或者
select * from t_users where id = #{param1} and name =#{param2}
下面的写法是错误的,因为直接写参数名:
select * from t_users where id = #{id} and name =#{name}
这个时候要注意参数的设置问题了。另外还有个特例:如果方法只有一个参数是可以用参数名代替的,其实如果只有一个参数,任何名称都是可以的。
关注微信公众号获取更多VSCode编程信息,定时发布干货文章
全部评论