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,会自动添加单引号


 

posted @   danielzzz  阅读(48)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示