mybatis使用遇到的坑

在此记录一下工作过程中使用mybatis时遇到的问题

问题描述:

mybatis中的sql代码
可以看到上图中给出了我编写的mybatis代码,很简单的查询语句,封装了几个子查询统计数据而已。下图是某个具体的子查询语句:
子查询sql
一个单表查询统计sql,where标签包含的是查询条件。下图是另一段子查询sql:
子查询sql
可以看到这里的查询语句没什么区别,现在讲讲我遇到的问题吧。

  1. 这个查询语句包含了若干个子查询,每个子查询都是对单张表格进行数据的统计,即count操作;
  2. 我们都知道,count操作返回的是符合条件的记录数,如果没有满足条件的记录则count的值为0;
  3. 然后我遇到的问题是,返回的对象字段映射到Javabean中居然返回了null,这个很不可思议的情况我排查了很久,因为有些字段不是null,有些是null,就连没有查询出数据的至少也是返回的0,但是返回null就不合理了;
  4. 我通过检查代码,通常这种情况出现,应该是返回的字段没有与javabean对应导致的,但是我确认了一下代码,不是这个问题,通过调试查看打印的sql,执行后返回的也确实是0啊,不应该是null才对;
  5. 几番检查,终于我发现了问题,查看第一张图,仔细观察,你会发现,我在代码中添加了几行注释,说明每个子查询的作用,但是注释的形式有点不太相同,居然有两种注释形式,分别是:
(1) <!--  -->
(2) /*  */
  1. 在xml文件中注释的写法我们应该都知道,是第一种的形式,第二种形式的注释是java中的,这两种注释的区别就是,在运行时,被第一种注释包含的内容不对被携带到sql中执行,而第二种注释则会跟随sql代码一起执行。所以问题就出现在这里,本该返回0的数据在映射到javabean时失败了,所以javabean在返回前端时返回了null值。

同样的问题,我还以另一种形式遇到

注释使用的另一种问题

  • 在上图中可以看到,编译器给出了错误提示,说choose标签应该包含when,otherwise标签,但是,是我瞎了吗?我写的难道不是when和otherwise标签在那?抱着怀疑编译器抽风的想法,我义无反顾地启动了项目,觉得应该不会影响项目的编译运行吧。
  • 结果,我不想看到的事情还是发生了,启动编译直接失败,控制台日志提示sql标签存在语法错误,我看着这个代码百思不得其解,对比着其他类似的sql代码查看,没毛病啊,为啥就我这个提示有误,纠结了半天,最后发现了,代码中存在的注释:
/*  */
  • 就是它影响了整个代码的编译,导致编译不通过,所以将注释形式修改为:
<!--  -->
  • 这种形式即可,或者直接删除掉注释,但是为了代码可读性,还是修改一下吧。

总结

出现以上问题的根本原因还是对xml中的语法理解不够透彻,还有就是我为什么会写出这种注释形式呢,明明在代码中有使用 这种格式的,怎么会使用不同的注释形式呢?仔细想想,我是使用了ide工具自带的注释快捷键,生成的注释,而有些ide如果没有手动修改过设置的话,是会生成不符合语法的注释的,所以在使用开发工具的过程中也要注意这个问题,我自己上面遇到的问题是在mac下使用的idea,所以出现这个问题后我立马修改了快捷键的设置。

发布了42 篇原创文章 · 获赞 10 · 访问量 7058

猜你喜欢

转载自blog.csdn.net/MCJPAO/article/details/100052323
今日推荐