mybatis plus 分页的时候 没有group by就不会套一层 select 再count吗
时间: 2023-07-31 10:09:37 浏览: 105
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 分组计算百分比:
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 分组计算百分比的简单实现方式。需要注意的是,如果统计数据量较大,建议使用数据库的分页查询功能,避免一次性查询过多数据导致性能问题。
在基于SpringBladeX和MyBatis Plus框架下,编写接口方法来实现历史订单自定义分页查询,并统计订单数、每日收益、每日日期以及历史订单表的所有信息:
在基于 SpringBladeX 和 MyBatis Plus 框架下,你可以编写接口方法来实现历史订单的自定义分页查询,并统计订单数、每日收益、每日日期以及历史订单表的所有信息。
首先,在你的 Mapper 接口中定义一个方法来执行自定义分页查询和统计操作。例如:
```java
public interface HistoryOrderMapper extends BaseMapper<HistoryOrder> {
IPage<HistoryOrder> getCustomPage(Page<HistoryOrder> page, @Param("params") Map<String, Object> params);
List<Map<String, Object>> getOrderStatistics(@Param("params") Map<String, Object> params);
}
```
在上述代码中,`getCustomPage` 方法用于自定义分页查询历史订单表的所有信息,`getOrderStatistics` 方法用于自定义统计订单数、每日收益和每日日期的信息。
接下来,在对应的 XML 映射文件中编写 SQL 查询语句。对于 `getCustomPage` 方法,你可以使用 MyBatis Plus 提供的分页查询方法,并结合传入的参数进行条件查询。例如:
```xml
<select id="getCustomPage" resultMap="BaseResultMap">
SELECT *
FROM history_order_table
WHERE 1 = 1
<if test="params != null and params['startDate'] != null">
AND create_time >= #{params.startDate}
</if>
<if test="params != null and params['endDate'] != null">
AND create_time <= #{params.endDate}
</if>
</select>
```
在上述示例中,`history_order_table` 是历史订单表名,`startDate` 和 `endDate` 是用于日期范围查询的参数。
对于 `getOrderStatistics` 方法,你需要编写一个包含订单数、每日收益和日期的统计查询语句,并结合传入的参数进行条件查询。例如:
```xml
<select id="getOrderStatistics" resultType="java.util.Map">
SELECT COUNT(*) AS orderCount, SUM(earnings) AS dailyEarnings, DATE_FORMAT(create_time, '%Y-%m-%d') AS date
FROM history_order_table
WHERE 1 = 1
<if test="params != null and params['startDate'] != null">
AND create_time >= #{params.startDate}
</if>
<if test="params != null and params['endDate'] != null">
AND create_time <= #{params.endDate}
</if>
GROUP BY DATE_FORMAT(create_time, '%Y-%m-%d')
</select>
```
在上述示例中,`history_order_table` 是历史订单表名,`startDate` 和 `endDate` 是用于日期范围查询的参数。
最后,在服务层或控制器中调用上述方法来执行自定义分页查询和统计操作,并将结果返回给前端。
这样,你就可以使用 SpringBladeX 和 MyBatis Plus 框架编写接口方法来实现历史订单的自定义分页查询,并统计订单数、每日收益、每日日期以及历史订单表的所有信息了。
阅读全文