mybatis方法參數報錯:Parameter 'xxx' not found - @requestParam 和@param的區別、desc關鍵字作為了字段名稱查詢問題、id取值錯亂問題、ERROR:syntax error at or near "$8" in postgres


一、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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM