【MyBatis学习06】_parameter:解决There is no getter for property named in class java.lang.String

咱们知道在mybatis的映射中传参数,只能传入一个。经过#{参数名} 便可获取传入的值。java

Mapper接口文件:sql

public int delete(int id) throws Exception;

MapperL配置文件:apache

<delete id="delete" parameterType="int"> delete from user where id=#{id} </delete>

接口中咱们定义了delete(int id),形参的名称为id。瓜熟蒂落的在sql段里就用#{id}去获取。
其实这里的”参数名”能够是任意的。
由于JAVA反射只能获取方法参数的类型,但无从得知方法参数的名字的
上面这个例子把#{id}换成#{di},同样运行。固然为了便于阅读代码,仍是用#{id}
_parameter则是java对经过反射获取参数后,给参数取的别名。因此用#{_parameter}也行。mybatis

但有几种状况你必须得用_parameterapp

第一种状况:拼接字符${}。咱这里先不去考虑SQL注入这些问题。ui

public List<User> findByName(String searchkey) throws Exception;
<select id="findByName" parameterType="String" resultType="twm.mybatisdemo.pojo.User"> select * from user where username like '%${searchkey}%' </select>

由于要使用模糊查询。要在入参先后加上%,因此不能用占位符#{},而要用拼接字符串atom

{searchkey}
一切都彷佛没有问题,运行,报错:
Exception in thread “main”
org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause:
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘searchkey’ in ‘class java.lang.String’ ### Cause:
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘searchkey’ in ‘class java.lang.String’spa

问题就出在拼接字符串${searchkey}。和占位符#{}不一样的是,java不会自动将${searchkey}对应成_parameter。所以只能本身写code

<select id="findByName" parameterType="String" resultType="twm.mybatisdemo.pojo.User"> select * from user where username like '%${_parameter}%' </select>

OK,一切又正常了。
但是你没有以为这种写法太不赏必悦目了?orm

mybatis考虑到这点,你只需在接口的方法参数前加上param注解就行了。
public List<User> findByName(@Param(value="searchkey") String searchkey) throws Exception;

第二种状况:动态SQL中的条件判断语句中

public List<User> findByName(String searchkey) throws Exception;
<select id="findByName" parameterType="String" resultType="twm.mybatisdemo.pojo.User"> <bind name="likestr" value="'%'+ searchkey +'%'"></bind> select * from user <where> <if test="searchkey !='' and searchkey !=null"> username like #{likestr} </if> </where> </select> 

 

在if和bind元素中涉及到参数searchkey。直接使用searchkey也会报上面同样的错误
解决办法就是用_parameter替换searchkey

或者在接口的方法参数前加上param注解。

public List<User> findByName(@Param(value="searchkey") String searchkey) throws Exception;
相关文章
相关标签/搜索