解决Mybatis映射文件mapper.xml中的注释问题
作者:web小欣 发布时间:2023-09-17 15:06:30
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语句中的占位符?被放在字符串内;
来源:https://blog.csdn.net/m0_37422153/article/details/88061315


猜你喜欢
- ionic App 解决android端在真机上 tab处于顶部的Bug在app.js 页面中添加以下代码.config(function(
- ✨字符, 字节与字符串🎈字符与字符串字符串内部包含一个字符数组,String 可以和 char[] 相互转换.NO方法名称类型描述1publ
- Chart控件可以用来绘制波形图、柱状图、饼图、折线图等,用来进行数据表现是很不错的,现在简单说一下这个控件的使用方法XAML:<Wi
- 本文实例讲述了Android实现EditText控件禁止输入内容的方法。分享给大家供大家参考,具体如下:问题:android如何实现Edit
- 引言内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑。不过世界上不存在
- 本文实例讲述了C#图像伪彩色处理方法。分享给大家供大家参考。具体如下://灰度图转伪彩色图像函数public Bitmap PGrayToC
- 线程的作用和意义线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程
- java try catch异常后还会继续执行吗catch中如果你没有再抛出异常,那么catch之后的代码是可以继续执行的,但是try中,报
- 本文实例讲述了java旋转二维数组的操作,分享给大家供大家参考。具体实现方法如下:package test;/* * &
- Android Studio从3.0版本新增了许多功能,当然首当其冲就是从3.0版本新增了对 Kotlin 开发语言的支持,除此之外还有其他
- 本文为大家分享了Android Studio使用USB真机调试的具体方法,供大家参考,具体内容如下以小米4为例,先将手机通过USB连接电脑,
- 一、返回BufferedImage由于spring mvc不支持返回BufferedImage ,所以增加图片转换器@Configurati
- 问题有时候有些操作是防止用户在一次响应结束中再响应下一个。但有些测试用户就要猛点,狂点。像这种恶意就要进行防止。比如在客户端中,一些按钮一般
- 我们知道,值类型的变量是在堆栈上分配内存的,而引用类型包括System.Object的对象是在堆上分配内存的,基于这一特点,当值类型被类型转
- OSS不支持通过一个网络地址来上传图片,所以若想将网络上的图片上传到OSS上需要走点弯路。1、通过链接将图片下载到本地的一个文件夹下面2、用
- Android ListView仿聊天界面效果图的具体代码,供大家参考,具体内容如下1.首先页面总布局(ListView + LinearL
- 本文实例为大家分享了java实现在线聊天系统的具体代码,供大家参考,具体内容如下本博客是博主在观看相关视频后写下的代码,希望能够帮助大家掌握
- 前言:图片选择器基本上是每个App必备的东西,用公认好的第三方也可以,但是自己写的改起来方便,用起来顺手,而且这东西想想可能没动手之前想想比
- 一、简介 1、地图 地图展示:普通地图(2D,3D)、卫星图和实时交通图。 地图操作:可通过接口或手势控制来实
- private void btnCreate_Click(object sender, EventArgs e) ...{ int hWnd