mybatis方法参数报错:Parameter 'xxx' not found

一、Parameter 'xxx' not found

  今天看后台代码时在本地运行,发现一个问题报错:

Caused by: org.apache.ibatis.binding.BindingException: Parameter 'tag' not found

  然后就看代码:dao层里面的参数那个tag使用的 @RequestParam("tag")

// 错误
@RequestParam("tag") List<String> tag

// 改为正确的
@Param("tag") List<String> tag

    为什么呢?那就要了解一下:Spring 中@requestParam 和@param的区别

1、@RequestParam 用于controller层

(1)解决前台参数名称与后台接收参数变量名称不一致的问题,等价于request.getParam

(2)可设置:

  — value:指定参数名

  — default:指定变量初始值

  — require(true默认/false):指定参数是否为必传

2、@Param 用于dao层

  个人理解为修饰参数,使得mapper.xml中的参数与后台的参数对应上,也增强了可读性。

  如果两者参数名一致得话,spring会自动进行封装,不一致的时候就需要手动去使其对应上。

  @Param是mybatis中的注解,用注解来简化xml配置的时候,@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中 。请看下面的示例:

@Select("select s_id id,s_name name,class_id classid from student where s_name= #{aaaa} and class_id = #{bbbb}")
public Student select(@Param("aaaa") String name,@Param("bbbb")int class_id); 

二、MySQL的desc关键字作为了字段名称查询问题

  今天在开发的时候,由于业务需求,有个简介的字段,所有在产品表的数据库中多查询一个字段(产品描述信息),字段名称设计为desc。

  那么在执行查询的时候,比如:

select id, name, price, firstImgUrl, stock, productNo, desc from EntProduct where id = 11

  可能很多人觉得没问题,但是在执行的时候就报错了:syntax error at or near "desc"

  或者:unexpected token: desc near line 1, column 94

  错误信息应该很明显,就是新增的查询desc字段有问题。

  其实出现这个错误的原因是desc这个单词是MySQL数据库的关键字,比如 order by desc,所有sql语句执行到这里的时候觉得语句有问题。

  解决问题就是将 desc 改为 description 或其他字段即可。

三、id取值错乱问题

  做一个编辑功能,但是怎么编辑都没生效,后来发现原因是 id 取错了。

  我刚开始没写上面的 ms.id,看详情返回有 id 就没注意是 id 错了,应该是 mybatis 没想到它把 p.id 的值填进去了。

  排查问题:看执行的 sql 语句

Preparing: update cs_market_service SET description = ?, content_md = ?, content = ?, type = ?, num = ?, period = ?, status = ?, phone = ?, email = ? where id = ? 
2021-06-04 15:12:37.527 DEBUG 49984 --- [nio-8080-exec-1] c.e.emcs.market.dao.MarketDao.update     : ==> Parameters: 小视频剪辑222(String), (String), <p>一打好看小视频商超厉害的,好好的,好厉害,快来找我</p><p>是可敬的达康书记达康书记达康书记</p>(String), 1(Integer), 22(Integer), 全天22(String), 1(Integer), 17607168514(String), 11622918989@qq.com(String), 1424(Integer)
2021-06-04 15:12:37.557 DEBUG 49984 --- [nio-8080-exec-1] c.e.emcs.market.dao.MarketDao.update     : <==    Updates: 0

  updates: 0,说明更新没成功,再看 id 传的是 1424,感觉不对劲,id 不应该这么小。这样才找到了原因。

  我本来p.id是要取product.id的,没写 ms.id 的话,这个p.id就也会搞成ms.id。

  解决方案:在 select 语句里加上 ms.id 就正常了。

四、ERROR:syntax error at or near "$8" in postgres

  碰到这种问题,通常是 xml 写的有问题,符号类,比如:

  手残的开发人员在写mybatis的xml文件时,多写了一个”}”符号。

where no= #{no,jdbcType=BIGINT}}

  我报这个错是因为插入的时候

#{userId}),
#{realName},
#{alipayAccount}

  写成这样了,因为后面2个是后加的,没注意。

五、column reference "user_id" is ambiguous

  上面的意识是:列引用“user_id”不明确。

  问题原因是下面这里少写了 eu.

原文地址:https://www.cnblogs.com/goloving/p/14847256.html