mybatis plus 分页的时候 没有group by就不会套一层 select 再count吗
时间: 2023-07-31 18:09:37 浏览: 109
MyBatis Plus 在进行分页查询时,如果没有 group by 语句,会自动优化 SQL,避免套一层 SELECT 再 COUNT。具体的优化策略是,在原 SQL 的基础上添加 LIMIT 子句,限制查询的行数,并统计查询结果的总行数。这样就不需要再套一层 SELECT 进行 COUNT 了。
例如,对于以下的 SQL 语句:
```sql
SELECT * FROM user WHERE age > 18 LIMIT 0, 10;
```
MyBatis Plus 会自动优化成:
```sql
SELECT SQL_CALC_FOUND_ROWS * FROM user WHERE age > 18 LIMIT 0, 10;
SELECT FOUND_ROWS();
```
其中,SQL_CALC_FOUND_ROWS 是 MySQL 的一个特殊语法,表示查询结果的总行数不包括 LIMIT 子句所限制的行数。而 FOUND_ROWS() 则是 MySQL 的一个函数,用于查询上一条 SELECT 语句的结果集中的行数。
这样,MyBatis Plus 就能够在不套一层 SELECT 的情况下,完成分页查询并统计总行数了。
相关问题
mybatis plus分组统计数量
### 使用 MyBatis Plus 进行分组统计数量
为了实现分组统计数据的功能,可以利用 `Wrapper` 来构建查询条件,并通过调用 `selectMaps` 或者自定义 SQL 实现复杂查询。下面是一个具体的例子来展示如何使用 MyBatis Plus 对学生表按班级进行分组并统计每班的学生人数。
#### 创建 Mapper 接口
首先创建一个继承于 `BaseMapper<T>` 的接口用于操作数据库中的记录:
```java
package com.example.demo.mapper;
import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.Student;
@Mapper
public interface StudentMapper extends BaseMapper<Student> {
}
```
#### 编写 Service 方法
接着编写服务层逻辑,在这里可以通过封装好的方法完成分页、排序等功能;对于复杂的聚合查询,则需借助 LambdaQueryWrapper 构建动态SQL语句:
```java
package com.example.demo.service.impl;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.mapper.StudentMapper;
import com.example.demo.entity.Student;
import com.example.demo.service.IStudentService;
@Service
@RequiredArgsConstructor
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student>
implements IStudentService {
private final StudentMapper studentMapper;
/**
* 获取各班级学生的总数.
*/
public List<Map<String, Object>> getStudentCountByClass() {
return studentMapper.selectMaps(
Wrappers.<Student>lambdaQuery()
.groupBy(Student::getClassName)
.select(Student::getClassName,
SqlFunc.COUNT(Student::getId).as("student_count"))
);
}
}
```
上述代码片段展示了如何基于 MyBatis Plus 和 Lambda 表达式的组合来进行分组统计[^1]。注意这里的 `SqlFunc.COUNT()` 是用来计算特定字段的数量,而 `.as("alias")` 则指定了返回结果集中该列的别名以便后续处理。
此外还可以直接在 XML 文件内定义更灵活多变的 SQL 查询语句,适用于更加复杂的业务场景需求。
mybatis-plus 分组计算百分比
好的,您可以按照以下步骤来实现 mybatis-plus 分组计算百分比:
1. 在 Mapper 接口中定义对应的 SQL 语句,使用 GROUP BY 子句进行分组,并统计每组的总数。
```java
@Select("SELECT type, COUNT(*) AS total FROM my_table GROUP BY type")
List<Map<String, Object>> countByType();
```
2. 在实体类中添加计算百分比的属性,并在对应的 getter 方法中进行计算。
```java
public class MyEntity {
private String type;
private int total;
private double percentage;
// Getter and Setter ...
public void setPercentage(double percentage) {
this.percentage = percentage;
}
public double getPercentage() {
return ((double) total / (double) totalCount) * 100.0;
}
}
```
3. 在 Service 类中调用 Mapper 接口的方法获取统计数据,并将数据封装到实体类中。
```java
@Service
public class MyService {
@Autowired
private MyMapper myMapper;
public List<MyEntity> countPercentageByType() {
List<Map<String, Object>> countList = myMapper.countByType();
int totalCount = countList.stream().mapToInt(map -> Integer.parseInt(map.get("total").toString())).sum();
List<MyEntity> resultList = new ArrayList<>();
for (Map<String, Object> countMap : countList) {
MyEntity entity = new MyEntity();
entity.setType(countMap.get("type").toString());
entity.setTotal(Integer.parseInt(countMap.get("total").toString()));
entity.setTotalCount(totalCount);
resultList.add(entity);
}
return resultList;
}
}
```
4. 在 Controller 类中调用 Service 类的方法获取统计数据,并将数据返回给前端展示。
```java
@RestController
public class MyController {
@Autowired
private MyService myService;
@GetMapping("/countPercentage")
public List<MyEntity> countPercentage() {
return myService.countPercentageByType();
}
}
```
以上就是使用 mybatis-plus 分组计算百分比的简单实现方式。需要注意的是,如果统计数据量较大,建议使用数据库的分页查询功能,避免一次性查询过多数据导致性能问题。
阅读全文