当前位置:首页 > Java技术 > MyBatis中的常见错误

MyBatis中的常见错误

2022年09月16日 16:05:54Java技术4

mybatis中的常见错误:

错误1:There is no getter for property named ‘…’ in ‘class …’

### Error querying database.  Cause: org.apache.ibatis.reflection.ReflectionException: 
There is no getter for property named 'values' in 'class java.lang.String'  
### Cause: org.apache.ibatis.reflection.ReflectionException: 
There is no getter for property named 'values' in 'class java.lang.String'  
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)  
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:122)  
......

错误原因:Mapper文件中 #{id}, #{title}, #{type} …接收输入参数的内容有单词拼写错误

<insert id="insertDutyReceiveMain"
		parameterType="com.dcits.forestry.duty.bean.DutyReceiveMain">
		INSERT INTO	DUTY_RECEIVE_MAIN(
				ID,TITLE,'TYPE',ISSUE,SEND_ORGAN_ID,SEND_ORGAN_NAME,SEND_TIME,RECEIVE_ORGAN_ID,RECEIVE_ORGAN_NAME,STATUS,SIGN_TIME,ARCHIVE_TIME,REJECTION_REASON,
		DP_ID, KEYWORD, MESSAGE_TYPE,ISSUED_PERSONNEL,PHONENUMBER
		)
		VALUES(
			#{id},#{title},#{type},#{issue},#{sendOrganId},#{sendOrganName},#{sendTime},#{receiveOrganId},#{receiveOrganName},#{status},#{signTime},#{archiveTime},#{rejectionReason},#{dpId},#{keyWord},#{messageType},#{issuedPersonnel},#{phoneNumber}
			)
</insert>

错误2:Expected one result (or null) to be returned by selectOne(), but found: 7

org.apache.ibatis.exceptions.TooManyResultsException: 
Expected one result (or null) to be returned by selectOne(), but found: 7  
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)  
    at com.sniper.mybatis.first.MybatisFirst.findUserByName(MybatisFirst.java:86)  
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)  
......

错误原因:结果集中包含了多条记录,不应该使用selectOne,应该使用selectList

<!-- 错误写法:
	List<User> list = sqlSession.selectOne("test.findUserByName", "小明");
-->
    List<User> list = sqlSession.selectList("test.findUserByName", "小明");  

错误3:A query was run and no Result Maps were found for the Mapped Statement ‘test.insertUser!selectKey’. It’s likely that neither a Result Type nor a Result Map was specified.

### Error updating database.  Cause: org.apache.ibatis.executor.ExecutorException: 
A query was run and no Result Maps were found for the Mapped Statement 'test.insertUser!selectKey'.  
It's likely that neither a Result Type nor a Result Map was specified.  

### The error may exist in sqlmap/User.xml  
### The error may involve test.insertUser!selectKey  
### The error occurred while handling results  
### SQL: SELECT LAST_INSERT_ID()  
### Cause: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'test.insertUser!selectKey'.  It's likely that neither a Result Type nor a Result Map was specified.  
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)  
    at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:172)  
.....

错误原因:Mapper文件中没有指定返回的类型

<select id="getTotalNumber" resultType="int"
		parameterType="hashMap">
		SELECT * FROM RECEIVE_MAIN
		<where>
			<if test="id!=null and id!=''"> AND ID=#{id} </if>
			<if test="title!=null and title!=''"> AND TITLE=#{title} </if>
			<if test="type!=null and type!=''"> AND TYPE=#{type} </if>
		</where>
	</select>

错误4:Type interface com.sniper.mybatis.mapper.UserMapper is not known to the MapperRegistry.

org.apache.ibatis.binding.BindingException: Type interface com.sniper.mybatis.mapper.UserMapper is not known to the MapperRegistry.  
    at org.apache.ibatis.binding.MapperRegistry.getMapper(MapperRegistry.java:47)  
    at org.apache.ibatis.session.Configuration.getMapper(Configuration.java:689)  
    at org.apache.ibatis.session.defaults.DefaultSqlSession.getMapper(DefaultSqlSession.java:250)  
......

错误原因:mapper.xml问没有注册到到mybatis的配置文件中

<pre name="code" class="html"><!-- 加载映射文件 -->  
  <mappers>  
     <mapper resource="sqlmap/User.xml"/>  
     <mapper resource="mapper/UserMapper.xml"/>  
  </mappers> 

错误5:Could not resolve type alias ‘users’. Cause: java.lang.ClassNotFoundException: Cannot find class: users

### Error building SqlSession.  
### The error may exist in mapper/UserMapper.xml  
### Cause: org.apache.ibatis.builder.BuilderException: 
Error parsing SQL Mapper Configuration. 
Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'users'.  
Cause: java.lang.ClassNotFoundException: Cannot find class: users  
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)  
    at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:82)  
 ......

错误原因:类路径或者别名写错了

<select id="findUserByName" parameterType="java.lang.String" resultType="user">  
       <!-- 使用${}会有sql注入的问题 -->  
       <!-- SELECT * FROM USER WHERE username LIKE '%${value}%' -->  
         SELECT * FROM USER WHERE username LIKE '%'||#{value}||'%'  
     </select>	

错误5:Mapping is missing column attribute for property null

### Error building SqlSession.  
### The error may exist in com/sniper/mybatis/mapper/OrdersCustomMapper.xml  
### The error occurred while processing mapper_resultMap[OrdersUserResultMap]_association[user]  
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. 
    Cause: java.lang.IllegalStateException: Mapping is missing column attribute for property null  
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)  
    at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:82)  
......

错误原因:
映射文件格式有问题
1.检查mapper.xml文件里的方法有没有resultType
2.如果是注解方式请检查mapper的方法返回值类型

<resultMap
		type="com.dcits.forestry.duty.bean.DutyReceiveMain"
		id="dutyReceiveMain">
		<result property="id" column="ID" />
		<result property="title" column="TITLE" />
		<result property="sendTime" column="SEND_TIME" />
</resultMap>

问题一 (不存在的列)

Unknown column ‘name’ in ‘field list’

这个问题在使用Mybatis时,属于比较常见的低级错误。
问题描述:

    ### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'name' in 'field list'
    ### The error may involve defaultParameterMap
    ### The error occurred while setting parameters
    ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'name' in 'field list'
    ; bad SQL grammar []

主要原因:
Mybatis XML中的SQL语句查询的列,不在数据库中。
新增SQL语句中的列不在数据库中,或列对应的值,数据类型不一致。

解决办法: 根据项目实际情况,通常有以下三种解决办法:
修改SQL语句中,将不存在的列从语句中去掉。
在数据库中,新增该不存在的列。
在新增时,不要使用中文符号的``表示字符串。也就是~符号对应的键。

注意事项:
删除了数据库中的列。在SQL语句中,没有同步删除该字段的。会比较容易出现该问题。
这里还有一个比较特殊的场景,会导致上述问题的发生。

以下SQL在windows环境下会显示上述错误,不会进行新增操作:
insert into t_base_user(name,created_time,updated_time)values(name,now(),now());
但在Linux环境下,其会进行新增操作。但是 name 的值不会进行新增。

问题二 (模棱两可的字段)

Column ‘oid’ in field list is ambiguous

问题描述:

### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'oid' in field list is ambiguous
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'oid' in field list is ambiguous; SQL []; Column 'oid' in field list is ambiguous

主要原因:连接查询时没有指定共有字段的所属表。 也就是说。A表有name字段,B表也有name字段。连接查询时查询name时。SQL服务器不知道返回哪个表的name字段导致。

解决方案:明确查询列的所属表。
例如:
表结构在文章最后,有兴趣的童鞋可以测试。执行以下SQL即可还原上述问题,

    select  u.id,name from t_base_user as u RIGHT JOIN
    	t_base_user_role as r  on u.id = r.user_id

注意事项: 将上述语句中的 u.id 修改为 id 也能正常运行。因为id不是公共字段,只有user表才id字段。

问题三 (不一致的接收对象)

TooManyResultsException:

问题描述:

Exception in thread "main" org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 9

主要原因:在接口中指定单个返回对象。但执行SQL后,有多条符合条件的数据。

解决方案:
根据实际的业务场景,通常有以下两种解决办法:
修改接口的返回结果为集合。
修改SQL语句使其只返回一个符合条件的结果。

问题四 (重复的方法名)

Mapped Statements collection already contains value for UserDao.getUserByName

描述:

Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.RuntimeException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for UserDao.getUserByName

原因: 在UserDao中,有两个同名方法getUserByName导致。

解决办法: 重命名其中一个方法名即可。

问题五 (重复的方法名)

Mapped Statements collection does not contain value for ‘xxx’

描述:

Cause: java.lang.IllegalArgumentExeception:  Mapped Statements collection does not contain value for 'xxx'

原因: "Mapper的结果不包含 ‘xxx’ ",因为xxx在全局配置文件中没有加载该类的mapper.xml

解决办法: 重命名其中一个方法名即可。

问题六 (不存在的属性)

There is no getter for property named ‘username’ in ‘com.andyqian.user.bean.User’

描述:

    Error updating database.  Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'username' in 'com.andyqian.user.bean.User'
    Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'education' in 'class com.andyqian.user.bean.User'

原因: SQL中查询的列,在其实体对象中不存在对应的属性。

解决办法: 在对应的实体对象上,添加上缺失的属性即可。

数据结构

在本文中,所有测试均使用以下表结构。SQL语句如下所示,有兴趣的童鞋可以进行实验。

    create table t_base_user_role(
    oid bigint(20) not null primary key auto_increment comment "",
    user_id bigint(20) null comment "",
    name varchar(50) null comment "",
    create_time datetime null comment "",
    update_time datetime null comment ""
    )
     
    CREATE TABLE `t_base_user` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(50) CHARACTER SET utf8mb4 DEFAULT NULL,
      `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `deleted` tinyint(4) NOT NULL DEFAULT '1',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8

最后

上述几个都属于比较常见且容易解决的问题。基本上能够通过描述,就能定位到问题的原因。之所以能够发生。简答归纳为以下两点:

xml文件中的SQL,没有在数据库中执行。
没有写单元测试。

作者:Xxacker的Latitude
来源链接:https://blog.csdn.net/Xxacker/article/details/89083604

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/41931.html

标签: Exception
分享给朋友:

“MyBatis中的常见错误” 的相关文章

解决ADT不显示javadoc An exception occurred while getting the javadoc

这几天发现ADT在网速特别差的情况下,鼠标悬停不会显示javadoc,而自己写的注释则没有问题. 在网络畅通的时候又会显示javadoc. 所以我猜测ADT会在本地查找文档失败时候尝试联网查找. 一般来说,如果你之前鼠标悬停会显示javadoc,最近突然不显示了...

ERROR org.hibernate.search.exception.impl.LogErrorHandler

2019-06-12 10:17:42 [Hibernate Search: entityloader-1] ERROR org.hibernate.search.exception.impl.LogErrorHandler - HSEARCH000058: HSEARCH0...

An exception occurred applying plugin request [id: ‘com.android.application‘]

An exception occurred applying plugin request [id: ‘com.android.application‘]

记一次编译异常 An exception occurred applying plugin request [id: 'com.android.application'] > Failed to apply plugin 'com.android.internal.a...

DAX: RPC error: RPC exception 5 in Ping occurred in session 36

Issue: BC Proxy account fails to start for the SSRS reports in Enterprise Portal with RPC exception 5 When Enterprise Portal starts for...

Error no matching function for call to 'std::exception::exception(const char [15])'

Error no matching function for call to 'std::exception::exception(const char [15])'

Error no matching function for call to 'std::exception::exception(const char [15])' Error 'logic_error' was not declared in this scope 错误...

Android studio中导入开源库出现com.android.ide.common.process.ProcessException 错误

今天在Android Studio 上导入一个gitthub 开源项目的时候发现 gradle构建项目的时候出现错误: Error:Execution failed for task :myapp:dexDebug. com.android.ide.common.proce...

Error和Exception有什么区别?

Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;Exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。...

Exception 和 Error 有什么区别么

Exception 和 Error 有什么区别么

声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的《Java核心技术36讲》,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题。 所以,本篇正文中的知识点,是我从课程中将知识点消耗后,用个人的理解、观念所表达出来的文字,参考了原文,但由于是个...

Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyExce

Error setting property values ; nested exception is org.springframework.beans.NotWritablePropertyException <!-- 添加一个dao类&...

Android -- Exception大全

异常类型 Exception ArithmeticExecption 算术异常类 NullPointerException...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。