mybatis plus 判断字段为null

快来打我* 2023-03-03 05:50 93阅读 0赞
  1. if(country != null){
  2. if(country != 6L){
  3. wrapper.eq("country", String.valueOf(country));
  4. }else{
  5. wrapper.isNull("country");
  6. }
  7. }

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

format_png

唐大麦 2017-03-19 00:02:40 format_png 1 14885 format_png 2 收藏 1

分类专栏: -———【Mybatis】 MyBatis学习教程

版权

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

Mapper接口文件:

  1. public int delete(int id) throws Exception;
  • 1

MapperL配置文件:

  1. <delete id="delete" parameterType="int">
  2. delete from user where id=#{id}
  3. </delete>

接口中我们定义了delete(int id),形参的名称为id。顺理成章的在sql段里就用#{id}去获取。
其实这里的”参数名”可以是任意的。
因为JAVA反射只能获取方法参数的类型,但无从得知方法参数的名字的
上面这个例子把#{id}换成#{di},一样运行。当然为了便于阅读代码,还是用#{id}
_parameter则是java对通过反射获取参数后,给参数取的别名。所以用#{_parameter}也行。

但有几种情况你必须得用_parameter

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

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

因为要使用模糊查询。要在入参前后加上%,所以不能用占位符#{},而要用拼接字符串。因此我们理所当然的接入。因此我们理所当然的接入{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’

问题就出在拼接字符串${searchkey}。和占位符#{}不同的是,java不会自动将${searchkey}对应成_parameter。因此只能自己写

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

OK,一切又正常了。
可是你没有觉得这种写法太不赏必悦目了?

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

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

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

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

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

  1. public List<User> findByName(@Param(value="searchkey") String searchkey) throws Exception;

发表评论

表情:
评论列表 (有 0 条评论,93人围观)

还没有评论,来说两句吧...

相关阅读