mybatis查询数据查不到问题解决

本文介绍了一次使用SSM框架开发过程中遇到的问题:由于数据库字段与代码对象字段不一致,导致MyBatis无法正确封装数据。通过详细SQL语句及字段别名设置解决了这一问题。

今天在使用ssm框架写一个简单的功能,突然就遇到一个任何的逻辑和代码没有错误的情况下,就是查不到数据,只能查到一个id值,很纳闷,经过仔细的排查问题,最后知道了问题的所在。

原来是因为数据库和字段和代码中的对象的字段不一致,导致mybatis无法进行封装。

解决:

需要些详细的sql语句,即给数据库的字段起个别名,而这个别名就是代码中对象的字段名称。

        select id,user_sex as userSex,user_email as userEmail,user_name as userName,user_phone as userPhone,user_birthday,user_id as userId from m_userInfo where user_email = #{name}

即可。

<think>嗯,用户遇到了MyBatis-Plus的selectPage查询数据问题,但直接执行SQL却能查到数据。我需要先回忆一下可能的原因。首先,根据引用[4],分页插件没有正确配置会导致total为0。用户可能没配置PaginationInterceptor,或者配置有误,比如方言设置不正确。然后是逻辑删除的问题,引用[3]提到逻辑删除字段可能被自动过滤了,如果用户的数据被标记为已删除,而查询时没有排除逻辑删除条件,可能查不到数据。这时候需要检查实体类的逻辑删除注解是否正确,或者在查询时手动排除条件。 另外,SQL语句是否有问题?比如自定义的XML文件中分页参数是否正确传递,或者是否有其他拦截器干扰了分页功能。还要看看是否手动添加了limit导致冲突,或者返回类型是否正确,比如是否误用了Page对象而不是具体的实体类型。此外,MyBatis-Plus版本兼容性也是一个可能因素,旧版本可能存在分页bug,需要升级到稳定版本。最后,日志输出是否显示了正确的分页SQL,可以开启日志检查生成的SQL是否符合预期。总结下来,需要逐步排查分页配置、逻辑删除、SQL语句、版本兼容性等方面,用户可以根据这些步骤检查自己的代码配置。</think>### MyBatis-Plus `selectPage` 查询数据的原因及解决方案 #### 一、分页插件未正确配置 **原因**: MyBatis-Plus 的分页功能依赖于分页插件 `PaginationInterceptor`。若未配置或配置错误(如未指定数据库方言),会导致分页查询生成的 SQL 语句异常,返回空数据或 `total=0`[^4]。 **解决方案**: 1. 在 Spring Boot 配置类中添加分页插件: ```java @Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor page = new PaginationInterceptor(); page.setDialectType("mysql"); // 根据实际数据库类型设置 return page; } } ``` 2. 检查依赖版本是否兼容(如 MyBatis-Plus ≥3.4.0 需使用 `MybatisPlusInterceptor`)。 --- #### 二、逻辑删除干扰查询 **原因**: 若实体类中配置了逻辑删除字段(如 `@TableLogic`),MyBatis-Plus 会自动过滤已标记为“删除”的数据,导致查询结果为空[^3]。 **解决方案**: 1. **临时忽略逻辑删除**: 手动添加查询条件覆盖全局逻辑删除配置: ```java QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("is_deleted", 0); // 显式添加未删除条件 userMapper.selectPage(page, wrapper); ``` 2. **关闭逻辑删除**(不推荐): 修改实体类注解或全局配置,但可能影响其他业务逻辑。 --- #### 三、自定义 SQL 未适配分页 **原因**: 若使用 XML 自定义 SQL 且未添加分页参数,或未使用 `Page` 对象接收结果,会导致分页失效。 **解决方案**: 1. XML 中正确使用分页参数: ```xml <select id="selectCustomPage" resultType="User"> SELECT * FROM user WHERE age > #{param1.age} LIMIT #{param2.current}, #{param2.size} </select> ``` 2. 确保返回类型为 `IPage<T>`: ```java IPage<User> page = new Page<>(1, 10); userMapper.selectCustomPage(page, 18); ``` --- #### 四、其他常见问题 1. **手动添加 `LIMIT` 导致冲突**: 自定义 SQL 中避免同时使用 `LIMIT` 和分页插件,否则会生成重复的 `LIMIT` 子句。 2. **返回类型错误**: 确保方法返回类型为 `IPage<T>`,而非 `List<T>`。 3. **日志排查**: 开启 SQL 日志,检查实际执行的 SQL 是否包含分页参数: ```properties mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl ``` --- #### 五、版本兼容性问题 **原因**: 旧版本 MyBatis-Plus 可能存在分页功能缺陷(如 `total` 统计错误)。 **解决方案**: 升级到最新稳定版本(如 ≥3.5.3),并检查更新日志中是否修复了相关问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值