mybatis查询没有返回结果,程序不继续执行

本文详细解析了在使用MyBatis框架时,由于驼峰命名规则与数据库字段命名不一致导致的问题及解决方案。从排查SQL执行情况到检查resultType返回类型,再到配置mapper风格,一步步引导读者如何定位并解决此类命名不匹配问题。

产生这个原因首先排查原因:

第一步:排查mapper中sql语句执行了没

              通过日志输出查看,如果能看到查询,并且有查询的结果,说明没问题

第二步:查看resultType 返回值类型正确不正确

 第三步:查看你的mapper配置,是不是开启驼峰命名规则转化

mapper:   style:normal     //这个配置,如果什么也不填写会默认

       normal,                                      //原值
       camelhump,                               //驼峰转下划线
       uppercase,                                //转换为大写
       lowercase,                                //转换为小写
       camelhumpAndUppercase,      //驼峰转下划线大写形式
       camelhumpAndLowercase,      //驼峰转下划线小写形式

 

 

我产生这个问题的原因是开启了这个  style 参数造成查询返回值与我实体类不匹配,导致程序不向下执行

我实体类是驼峰命名法,我数据库是 采用下划线命名方法   

  如:实体类某一个属性   nickname    而数据库的字段  nick_name

 

在使用 MyBatis 进行查询时,如果出现查询返回结果,但将相同的 SQL 语句在数据库客户端中执行却能正确返回数据的情况,这通常MyBatis 的 Bug,而是由以下几个常见原因造成的: ### 1. SQL 语句格式问题 在 XML 文件中编写 SQL 语句时,如果 SQL 语句中存在换行或多余的空格,可能会导致实际执行的 SQL 语句与预期一致。例如,在 `<where>` 子句中换行可能导致注释符号 `#` 被误认为是单行注释的开始,从而导致 SQL 语句被截断。这种情况下,MyBatis 实际执行的 SQL 语句可能如下所示: ```sql SELECT id, username, password FROM user where username = 'aaa' # '' and password = 'xxx' ``` 在这个例子中,`#` 后面的内容会被当作注释处理,导致 `and password = 'xxx'` 部分被忽略,从而导致查询结果一致 [^2]。 ### 2. 参数传递问题 MyBatis 中的参数传递方式可能会影响 SQL 语句的构建。如果参数传递正确,或者参数名称与 SQL 语句中的占位符匹配,也可能导致查询条件完整或错误。例如,使用 `#{}` 占位符时,如果参数名拼写错误或未正确传递,可能会导致 SQL 语句中的条件缺失,进而影响查询结果。 ### 3. 缓存问题 MyBatis 提供了一级缓存和二级缓存功能。如果启用了缓存,并且之前的查询结果已经被缓存,那么即使数据库中的数据发生了变化,MyBatis 可能仍然返回缓存中的旧结果。为了确保查询结果的准确性,可以尝试清除缓存或禁用缓存进行测试。 ### 4. 数据库连接池配置问题 某些数据库连接池(如 HikariCP、Druid 等)可能会对 SQL 语句进行预处理或优化,导致实际执行的 SQL 语句与 MyBatis 构建的 SQL 语句一致。此外,连接池的配置问题(如最大连接数、超时时间等)也可能影响查询结果。 ### 5. 日志输出问题 MyBatis 默认会输出完整的 SQL 语句,尤其是在使用日志框架(如 Log4j、SLF4J 等)时,可能只输出部分 SQL 语句或参数值。为了排查问题,建议启用 MyBatis 的 SQL 日志功能,确保能够看到完整的 SQL 语句及其参数值。可以通过以下配置启用 SQL 日志: ```properties # application.properties logging.level.com.example.mapper=DEBUG ``` 其中 `com.example.mapper` 是你的 Mapper 接口所在的包名。 ### 6. 字符编码问题 如果数据库、MyBatis 配置或应用程序之间的字符编码一致,可能会导致 SQL 语句中的字符串参数被错误解析,从而影响查询结果。确保所有组件使用的字符编码一致(如 UTF-8),并检查数据库表的字符集设置。 ### 7. 数据库权限问题 有时候,应用程序使用的数据库用户可能没有足够的权限访问某些表或字段,导致查询结果为空。检查数据库用户的权限设置,确保其具有访问所需表和字段的权限。 ### 解决方案 1. **检查 SQL 语句格式**:确保 XML 文件中的 SQL 语句没有多余的换行或空格,避免使用 `#` 作为注释符号。 2. **验证参数传递**:检查参数名称是否与 SQL 语句中的占位符匹配,确保参数值正确传递。 3. **清除缓存**:如果启用了缓存,尝试清除缓存或禁用缓存进行测试。 4. **启用 SQL 日志**:配置 MyBatis 输出完整的 SQL 语句及其参数值,以便调试。 5. **检查字符编码**:确保数据库、MyBatis 配置和应用程序使用的字符编码一致。 6. **验证数据库权限**:检查数据库用户的权限设置,确保其具有访问所需表和字段的权限。 通过以上方法,可以有效排查并解决 MyBatis 查询返回结果的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mhi()

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值