解決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。

推薦閱讀: