几个常见的Mybatis错误

前言

今天记录几个Mybatis常见错误。在使用Mybatis时,或多或少的会碰到这些问题。问题本身并不难,解决起来也非常简单。下面会一一介绍各个问题出现的场景,发生原因以及解决方案。最后统一说说如何避免这类问题的发生。

问题一 (不存在的列)

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

问题描述:

主要原因

Mybatis XML中的SQL语句查询的列,不在数据库中。

新增SQL语句中的列不在数据库中,或列对应的值,数据类型不一致。

解决办法: 根据项目实际情况,通常有以下三种解决办法:

修改SQL语句中,将不存在的列从语句中去掉。

在数据库中,新增该不存在的列。

在新增时,不要使用中文符号的``表示字符串。也就是~符号对应的键。

注意事项:

删除了数据库中的列。在SQL语句中,没有同步删除该字段的。会比较容易出现该问题。

这里还有一个比较特殊的场景,会导致上述问题的发生。

以下SQL在windows环境下会显示上述错误,不会进行新增操作:

但在Linux环境下,其会进行新增操作。但是 name 的值不会进行新增。

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

问题描述:

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

解决方案:明确查询列的所属表。

例如

表结构在文章最后,有兴趣的童鞋可以测试。执行以下SQL即可还原上述问题,

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

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

问题描述:

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

解决方案

根据实际的业务场景,通常有以下两种解决办法:

修改接口的返回结果为集合。

修改SQL语句使其只返回一个符合条件的结果。

问题四 (重复的方法名)

描述:

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

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

问题五 (不存在的属性)

描述:

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

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

数据结构

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

最后

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

xml文件中的SQL,没有在数据库中执行。

没有写单元测试。

由此可见,单元测试能够为我们排除掉一些比较低级,甚至是手误带来的bug。也能为我们节省不少时间来解决更复杂,更有挑战性的问题。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180804G1DUWT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券