本文首发于公众号《andyqian》,期待你的关注java
前言mysql
今天记录几个Mybatis常见错误。在使用Mybatis时,或多或少的会碰到这些问题。问题自己并不难,解决起来也很是简单。下面会一一介绍各个问题出现的场景,发生缘由以及解决方案。最后统一说说如何避免这类问题的发生。spring
这个问题在使用Mybatis时,属于比较常见的低级错误。sql
问题描述:数据库
### 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 []
主要缘由:apache
Mybatis XML中的SQL语句查询的列,不在数据库中。windows
新增SQL语句中的列不在数据库中,或列对应的值,数据类型不一致。跨域
解决办法: 根据项目实际状况,一般有如下三种解决办法:服务器
修改SQL语句中,将不存在的列从语句中去掉。数据结构
在数据库中,新增该不存在的列。
在新增时,不要使用中文符号的``表示字符串。也就是~符号对应的键。
注意事项:
删除了数据库中的列。在SQL语句中,没有同步删除该字段的。会比较容易出现该问题。
这里还有一个比较特殊的场景,会致使上述问题的发生。
如下SQL在windows环境下会显示上述错误,不会进行新增操做:
insert into t_base_user(name,created_time,updated_time)values(`name`,now(),now());
但在Linux环境下,其会进行新增操做。可是 name 的值不会进行新增。
问题描述:
### 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字段。
问题描述:
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语句使其只返回一个符合条件的结果。
描述:
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致使。
解决办法: 重命名其中一个方法名便可。
描述:
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,没有在数据库中执行。
没有写单元测试。
因而可知,单元测试可以为咱们排除掉一些比较低级,甚至是手误带来的bug。也能为咱们节省很多时间来解决更复杂,更有挑战性的问题。
推荐阅读:
扫码关注,一块儿进步
我的博客: http://www.andyqian.com