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 @ 2022-06-06 18:11  danielzzz  阅读(45)  评论(0编辑  收藏  举报