1. 程式人生 > >Mybatis異常解決之:java.sql.SQLException: Parameter index out of range

Mybatis異常解決之:java.sql.SQLException: Parameter index out of range

mybatis使用過程中遇到下面一個異常:

org.springframework.dao.TransientDataAccessResourceException:
### Error querying database.  Cause: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
### The error may exist in conf/entitymap/diseaseMapper.xml
### The error may involve diseaseMapper.queryCountByName-Inline
### The error occurred while setting parameters
### SQL: select         count(1)         from tb_disease where 1=1                       AND name like CONCAT('%','?','%')
### Cause: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
; SQL []; Parameter index out of range (1 > number of parameters, which is 0).; nested exception is java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
  at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:106) ~[spring-jdbc-3.2.9.RELEASE.jar:3.2.9.RELEASE]
  at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) ~[spring-jdbc-3.2.9.RELEASE.jar:3.2.9.RELEASE]
  at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) ~[spring-jdbc-3.2.9.RELEASE.jar:3.2.9.RELEASE]
  at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) ~[spring-jdbc-3.2.9.RELEASE.jar:3.2.9.RELEASE]
  at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73) ~[mybatis-spring-1.2.2.jar:1.2.2]
  at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:371) ~[mybatis-spring-1.2.2.jar:1.2.2]
  at com.sun.proxy.$Proxy70.selectOne(Unknown Source) ~[na:na]
  at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:163) ~[mybatis-spring-1.2.2.jar:1.2.2]

根據錯誤資訊 

select count(1) from tb_disease where 1=1 AND name like CONCAT('%','?','%')

找到相應配置如下,發現原來是#{diseaseName}用法有誤:CONCAT('%','#{diseaseName}','%')

mapper檔案配置如下:

select id="queryCountByName" resultType="java.lang.Long" parameterType="java.util.HashMap">
        select
        count(1)
        from tb_disease where 1=1
        <if test="diseaseName!=null and diseaseName!=''">
            AND name like CONCAT('%','#{diseaseName}','%')
        </if>
    </select>

在mapper檔案中使用#佔位符傳參時,一定不要在兩側新增引號,否則會導致引數解析異常。

正確的配置方式應該是以下這樣:

<select id="queryCountByName" resultType="java.lang.Long" parameterType="java.util.HashMap">
        select
        count(1)
        from tb_disease where 1=1
        <if test="diseaseName!=null and diseaseName!=''">
            AND name like CONCAT('%',#{diseaseName},'%')
        </if>
    </select>

另外,或者可以把#改成$,但是mapper檔案中使用$會有sql注入漏洞,所以不建議使用!

附:Mybatis模糊查詢MySQL中記錄的的常用三種方法