MyBatis踩坑记录
报错信息:There is no getter for property named 'tablename' in 'class java.lang.String'
原因:
使用了${tablename}获取参数
解决:
只能用${value}或${_parameter}获取;而#{}可以用任意名字获取参数值,如:#{xxx};
或者给DAO接口方法参数设置别名@Param("name"),即可使用${name}获取该参数。
拓展:
使用${}接收多个字面量类型的参数 【注意:${}需要手动加单引号】。使用arg或者param都行,要注意的是,arg是从arg0开始的,param是从param1开始的。arg 和 param 可以在同一个 SQL 语句中混合使用
DAO接口:
// 验证登录
User checkLogin(String username, String password);
Mapper文件:
select * from t_user where username = '${arg0}' and password = '${param2}'
注意:如果DAO接口中方法参数使用@Param取了别名,在Mapper文件中的sql就只能使用别名了,而不能使用arg或者param
DAO接口:
// 验证登录(使用@param注解)
User checkLoginByParam( @Param ( "username" ) String username, @Param ( "password" ) String password);
Mapper文件:
select * from t_user where username = '${username}' and password= '${password}'
-- 如果使用动态sql,if标签中的条件也应该与@Param中的值一致
select * from t_user
<where>
<if test="username != null and username != ''">
and username = #{username}
</if>
<if test="password != null and password != ''">
and password = #{password}
</if>
</where>
此处有小坑,如果jdbc配置文件是如下设置:
url=jdbc:mysql://localhost:3306/...
username=root
password=root
上述sql中 ${username} 获取的值为 root (mysql用户名称),而不是实际传递的参数值,而使用 #{username} 则可正常获取参数值
可以将配置文件改为:
mysql.url=jdbc:mysql://localhost:3306/...
mysql.username=root
mysql.password=root
总结:在使用过程中最好使用 实体类型的参数 和 @Param注解 来获取参数值
MyBatis获取参数值的两种方式:${}和#{}
${}的本质就是字符串拼接,#{}的本质就是占位符赋值
${} 使用字符串拼接的方式拼接 sql,需要手动加单引号;但是使用 #{} 占位符赋值的方式拼接sql,会自动添加单引号