mybatis plus 分页查询出现count()

出现问题现象

使用mybatisplus分页时候count语句出错,控制台打印的sql为### The error may involve defaultParameterMap, The error occurred while setting parameters

查看打印的sql

SQL: SELECT COUNT() FROM common_sys_log

不知道为啥不是count(*)而是count()导致分页报错

出现问题的原因和解决办法

因为mybatisplus 3.4.2版本的分页逻辑写的有问题,换到3.5.1就好了
<think>嗯,用户之前让我介绍了包括MyBatis-Plus在内的多个技术,现在他们特别想深入了解MyBatis-Plus分页查询功能。我需要仔细回想之前的回答,确保现在的内容不重复但更深入。 首先,用户可能已经知道MyBatis-PlusMyBatis的增强工具,所以不需要再重复基本概念。他们需要的是分页查询的具体使用方法、配置步骤以及实际案例。可能他们正在项目中遇到分页需求,或者想优化现有的分页实现。 接下来,我得考虑用户的使用场景。可能是开发一个需要分页展示数据的后台管理系统,比如用户列表、订单记录等。这时候,分页查询的性能和易用性非常重要。用户可能关心如何快速集成,是否需要编写大量SQL,以及如何避免性能问题,比如内存溢出。 用户的身份可能是Java后端开发人员,对Spring Boot和MyBatis有一定了解,但可能对MyBatis-Plus的高级功能不熟悉。他们需要明确的步骤和代码示例,以便快速应用到项目中。同时,他们可能也关心分页插件的工作原理,比如是否使用了物理分页,以及如何防止SQL注入等安全问题。 此外,用户可能没有明说的深层需求包括分页查询的优化,比如缓存机制、多表联查时的分页处理,或者在分布式系统中分页的一致性。不过,根据当前的问题,可能主要集中在基础实现和配置上,所以需要先覆盖这些内容,再适当提及高级用法。 需要确保回答结构清晰,分步骤说明配置、基本使用、进阶功能,并提供示例代码。还要注意使用中文,避免技术术语的混淆,同时保持代码的正确性和规范性。最后,综合案例部分可以加强用户的理解,展示如何在实际项目中应用这些知识。</think>以下是 MyBatis-Plus 分页查询的详细说明,分模块解析其实现原理、使用步骤和实际案例: --- ### 一、分页查询原理 MyBatis-Plus分页查询基于 **物理分页**(直接通过 SQL 的 `LIMIT` 语句实现),而非内存分页。 **核心流程**: 1. 创建分页参数对象(页码、每页条数) 2. 自动在 SQL 末尾追加 `LIMIT offset, size` 3. 执行查询并封装分页结果(包含总记录数、当前页数据) --- ### 二、基础配置(Spring Boot 集成) #### 1. 添加分页插件 在配置类中注入 `PaginationInterceptor`(旧版本)或 `MybatisPlusInterceptor`(新版本): ```java @Configuration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } } ``` #### 2. 配置分页参数(可选) 通过 `Page` 对象指定分页参数: ```java Page<User> page = new Page<>(1, 10); // 第1页,每页10条 ``` --- ### 三、基础使用方式 #### 1. Service 层分页查询 直接调用 `page` 方法: ```java // 查询所有用户(无条件) Page<User> userPage = userService.page(page); // 带条件查询(使用 QueryWrapper) QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.like("name", "张"); Page<User> userPage = userService.page(page, wrapper); ``` #### 2. Mapper 层自定义 SQL 分页 Mapper 接口定义: ```java @Select("SELECT * FROM user WHERE age > #{age}") Page<User> selectByAge(Page<User> page, @Param("age") Integer age); ``` --- ### 四、进阶功能 #### 1. 不查询总记录数(提升性能) ```java Page<User> page = new Page<>(1, 10).setSearchCount(false); ``` #### 2. 多表联查分页 在 XML 中编写 SQL,注意 `LIMIT` 必须放在最后: ```xml <select id="selectUserWithRole" resultType="UserVO"> SELECT u.*, r.role_name FROM user u LEFT JOIN role r ON u.role_id = r.id ${ew.customSqlSegment} <!-- 自动拼接 WHERE 条件 --> </select> ``` --- ### 五、实际案例:订单分页查询 #### 场景需求 - 按订单状态筛选 - 按时间倒序排序 - 每页显示 15 条 #### 实现代码 ```java // 1. 创建分页对象 Page<Order> page = new Page<>(currentPage, 15); // 2. 构建查询条件 LambdaQueryWrapper<Order> wrapper = Wrappers.lambdaQuery(); wrapper.eq(Order::getStatus, 1) // 状态为已支付 .orderByDesc(Order::getCreateTime); // 3. 执行分页查询 Page<Order> result = orderService.page(page, wrapper); // 4. 获取结果 List<Order> records = result.getRecords(); // 当前页数据 long total = result.getTotal(); // 总记录数 ``` --- ### 六、注意事项 1. **数据库类型**:需正确配置 `DbType`(如 `DbType.MYSQL`) 2. **性能优化**:大数据量时建议关闭 `count` 查询 3. **SQL 注入防护**:避免直接拼接用户输入参数 4. **排序字段**:推荐使用数据库字段名而非 Java 属性名 --- 通过 MyBatis-Plus 的分页机制,开发者可以快速实现高性能分页功能,减少模板代码量,典型应用于后台管理系统中的表格数据展示场景。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值