MyBatis XML 中使用包含占位符的注释,会导致异常:java.sql.SQLException: 序列号无效
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='id', mode=IN, javaType=class java.lang.String, 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: 序列号无效
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
at com.sun.proxy.$Proxy128.update(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:294)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy185.updateReportInfo(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:197)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy186.updateReportInfo(Unknown Source)
... ...
所谓包含占位符的注释
-
示例如下:
<update id="updateUser" parameterType="org.devsong.domain.vo.UserVo"> update t_user set user_name = #{userName}, --age = #{age}, email = #{email} where id = #{id} </update>
其中的注释
-- age = #{age}
-
在匹配参数解析时依然会当成一个占位符进行匹配,导致以上异常。删除对应的注释即可。
注意: --注释一般是放在sql值后面的,例如下面这样
<update id="updateUser" parameterType="org.devsong.domain.vo.UserVo">
update t_user
set user_name = #{userName},
age = #{age} --年龄,
email = #{email}
where id = #{id}
</update>
想注掉这个 age=#{age},使用 <!-- -->。改成下面这样就可以了
<update id="updateUser" parameterType="org.devsong.domain.vo.UserVo">
update t_user
set user_name = #{userName},
<!-- age = #{age}, -->
email = #{email}
where id = #{id}
</update>