解決Mybatis映射文件mapper.xml中的註釋問題
Mybatis映射文件mapper.xml的註釋問題
從昨天夜晚9點到今天中午,一直被項目bug所困惑,中間這段時間一直未解決這個問題,也咨詢很多群裡大佬,也未能解決
有的說是我代碼寫的有問題,如mapper文件中沒有寫入參數類型parameterType,也有說是我項目結構目錄構建出錯,按照他們的建議進行修正,也是未盡人意,啟動項目運行始終報出同一個錯誤,現在問題解決瞭,感覺有必要記錄這個很不經意的問題,造成這個bug的問題根本原因還是自己編碼不規范造成。
報錯信息
12:12:11 [http-nio-8081-exec-8] ERROR w.g.z.c.exception.BDExceptionHandler – nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='limit', mode=IN, javaType=int, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Parameter index out of range (4 > number of parameters, which is 3).
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='limit', mode=IN, javaType=int, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Parameter index out of range (4 > number of parameters, which is 3).
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:79)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:447)
at com.sun.proxy.$Proxy104.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:231)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy120.list(Unknown Source)
項目報錯根本原因在下面的xml文件中
DuesMapper.xml
<select id="list" resultType="whut.glxiang.zqly.dues.domain.DuesDO"> /*select `d.user_id`,`su.username`,`d.dues`,`d.status`,`d.total_price`,`d.pay_time` from dues as d left join sys_user as su where d.user_id=su.user_id and d.user_id=#{userId}*/ select d.user_id, su.username, d.dues, d.status, d.total_price, d.pay_time from dues d left join sys_user su on d.user_id=su.user_id <where> <if test="userId != null and userId != ''"> and d.user_id = #{userId} </if> </where> <choose> <when test="sort != null and sort.trim() != ''"> order by ${sort} ${order} </when> <otherwise> order by d.user_id desc </otherwise> </choose> <if test="offset != null and limit != null"> limit #{offset}, #{limit} </if> </select>
解決辦法
首先檢查自己的mapper.xml文件中是否存在註釋?xml文件中的註釋不能是 /**/,要不然就會報出上面的錯誤信息,隻能以<!開頭,和 > 結尾
其次就是檢查自己的sql語句是否寫的有問題或者映射的實體類屬性是否與sql查詢的字段一致
總之,項目編碼一定要規范,這樣才能減少找bug的時間,提高效率,上面項目運行報錯就是因為這個xml註釋不規范,大傢還是多要註意!!! 編碼不規范,自己兩行淚。
mapper.xml文件中的註釋
註釋方式
在mapper.xml文件中,註釋方式為<!–existence of query content–>,直接采用Java代碼方式的註釋/*existence of query content*/會報錯,尤其是在SQL語句中出現這種註釋方式時。
‘無效的列索引’bug和解決
昨天在導入數據時需要對數據進行驗證,在mapper文件中對表中數據進行查詢,將作廢sql註釋時選擇瞭Java方式,此時會報錯。
<select id="getSeqNameCount" parameterClass="java.util.HashMap" resultClass="java.lang.Integer"> SELECT COUNT(*) COUN FROM tablename A WHERE A.id=#id# and A.name=#name# /*SELECT * FROM tablename A WHERE A.id=#id# and A.name=#name#*/ </select>
在解析時由於會將參數位置解析為占位符‘?’,所以此時以下的sql會在後臺解析成如下,但是傳入的參數隻有兩個,所以這個時候會報 “Caused by: java.sql.SQLException: 無效的列索引”,因為傳入的參數和占位符數量不等。
SELECT COUNT(*) COUN FROM tablename A WHERE A.id=? and A.name=? /*SELECT * FROM tablename A WHERE A.id=? and A.name=?/
小結一下
1、mapper.xml文件中註釋方式為<!–existence of query content–>;
2、“Caused by: java.sql.SQLException: 無效的列索引”錯誤一般由sql語句中占位符引起:
傳入參數數量不等與占位符的數量;
SQL語句中的占位符?是中文版;
SQL語句中的占位符?被放在字符串內;
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- MyBatis查詢無記錄時的返回值問題
- mybatis相同的sql查詢第二次查不出結果問題
- Mybatis的TypeHandler加解密數據實現
- Mybatis結果集映射與生命周期詳細介紹
- mybatis mapper.xml 註釋帶參數的坑及解決