MyBatis使用resultMap查询返回null结果问题求助
排查MyBatis无返回数据但SQL在Toad正常的问题
这种情况我踩过好几次坑了!既然SQL在Toad里能正常返回数据,那问题肯定出在MyBatis的参数传递、映射配置或者服务端的数据库连接上,咱们一步步来排查:
1. 先确认参数是不是真的传对了
- 检查DAO接口方法的参数名和XML里的引用是否一致:比如方法是
List<ParentClass> getParentList(@Param("parentKey") String parentKey),那XML里必须用#{parentKey},不能写错名字。 - 核对参数类型:比如Oracle的
VARCHAR2对应Java的String,别把数字类型参数传成字符串,或者反过来。最直接的方法是开启MyBatis的SQL日志,看实际执行的带参数的SQL是什么样的——把这个SQL复制到Toad里跑,如果也没数据,那就是参数传递的问题。 - 开启SQL日志的配置(以Spring Boot为例):在
application.properties里加一行:
这样控制台就会打印出MyBatis实际执行的完整SQL,包括代入的参数值。mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
2. 检查POJO和结果集的映射是否正确
- 自动映射的坑:MyBatis默认是驼峰转下划线的自动映射规则,比如POJO里的
parentName要对应SQL返回的PARENT_NAME列。如果你的列名是PARENTNAME这种不带下划线的,自动映射就会失败,这时候要么给SQL列加别名,要么用resultMap手动指定映射关系。 - 嵌套对象的映射:对于ParentClass里的ChildClass,一定要在
resultMap里用association标签正确配置,比如:
这里要注意:父类的唯一标识列(比如<resultMap id="ParentResultMap" type="com.yourpackage.ParentClass"> <id column="PARENT_KEY" property="parentKey"/> <!-- 父类其他字段映射 --> <association property="childClass" javaType="com.yourpackage.ChildClass"> <id column="CHILD_ID" property="childId"/> <!-- 子类其他字段映射 --> </association> </resultMap>PARENT_KEY)必须用<id>标签定义,不能用<result>,否则MyBatis无法区分不同的父对象,会导致映射混乱甚至丢失数据。
3. 核对数据库连接环境
- 别犯低级错误:确认Spring服务连接的数据库实例、schema和你在Toad里用的是同一个!我之前就碰到过代码连测试库,自己在Toad查生产库的情况,结果当然对不上。
- 事务隔离级别问题:如果查询方法被事务包裹,可能因为隔离级别导致看不到最新数据。可以试试在DAO方法上加
@Transactional(readOnly = true),或者临时去掉事务注解测试。
4. 检查SQL的XML语法是否有隐藏问题
- 虽然SQL在Toad里能跑,但MyBatis的XML解析有特殊规则:比如SQL里的小于号
<要转成<,否则会被当成XML标签解析错误(不过这种情况一般会报错,你说没报错的话可能性不大)。 - 核对XML里的SQL和Toad里的是否完全一致:有没有少写了表别名、函数调用,或者多了不必要的空格?
最后一招:直接调试
如果上面都排查完还是没结果,就手动调试:
- 在DAO方法入口打断点,确认传入的参数值正确;
- 跟踪MyBatis的结果集处理逻辑,看看ResultSet里到底有没有数据——如果ResultSet有数据但POJO是空的,那就是映射配置的问题;如果ResultSet本身是空的,那还是参数或者环境的问题。
内容的提问来源于stack exchange,提问作者TheNotoriousWMB
相关产品推荐
相关产品推荐

