異常信息
org.apache.ibatis.binding.BindingException
nested exception is org.apache.ibatis.binding.BindingException: Parameter 'deviceNO' not found. Available parameters are [deviceNo, deviceId, param1, param2]
場景回溯
業務場景:車輛表,需要更新指定編號車輛的設備Id(編號和設備ID均非主鍵),因而在對應的mapper.xml中自定義了SQL語句,結果調用對應接口時爆出異常
當然可以直接使用Mybatis-plus的EntityWrapper,這樣做雖然方便,但是第一影響性能,第二造成職責划分不清(SQL的拼裝屬於dao層,它從來就不該在Service層完成)
原因排查
apache的ibatis將原因說的很清楚:Parameter 'deviceNO' not found. Available parameters are [deviceNo, deviceId, param1, param2] ,沒找到xml里使用占位符表示的參數(#{deviceNO}),能用的參數有deviceNo、deviceId等,很明顯是發生了拼寫錯誤
xml:
Mapper接口:
是一個字母的大小寫引發的錯誤
解決方法
更改參數名使xml和Mapper接口里一致即可
總結與反思
一個字母的大小寫錯誤,不僅僅是引發了BindingException異常,而且它還暴露了我極大的缺點:
- 命名不規范,Id還是ID,No還是NO,至今我還沒弄明白到底該選擇哪種命名
- 簡單CV工程師:xml文件為了減少錯誤,直接從已有的SQL語句粘貼而來(NO),可是Mapper接口我卻選擇自己去寫,采取了我的命名習慣(No)
一定要注意class與yml、xml之間的拼寫錯誤!
技術不分領域,思想一脈相承