MyBatis踩坑记录
报错信息:There is no getter for property named 'tablename' in 'class java.lang.String'
原因:
使用了${tablename}获取参数
解决:
只能用
或者给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,会自动添加单引号
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?