mybatisplus 分组统计数量
时间: 2023-07-05 21:27:45 浏览: 395
你可以使用 Mybatis-Plus 提供的 Wrapper 类,结合 SQL 的 GROUP BY 和 COUNT 函数来实现分组统计数量。下面是一个示例代码:
```
QueryWrapper<Entity> wrapper = new QueryWrapper<>();
wrapper.select("column1", "COUNT(column2) as count")
.groupBy("column1")
.orderByDesc("count");
List<Map<String, Object>> result = entityMapper.selectMaps(wrapper);
```
以上代码中,`wrapper.select("column1", "COUNT(column2) as count")` 指定了查询的字段,其中 `COUNT(column2) as count` 表示统计 column2 字段的数量,并将结果命名为 count。`wrapper.groupBy("column1")` 指定了分组的字段。最后,`entityMapper.selectMaps(wrapper)` 执行查询并返回结果。
返回的结果是一个 List<Map<String, Object>>,其中每个 Map 对象表示一条记录,包含了分组字段和统计数量。你可以根据需要进行进一步的处理。
相关问题
mybatisplus 分组查询数量
MybatisPlus是一个基于MyBatis的ORM框架增强工具,它提供了一些便利的功能,包括分组查询的数量统计。你可以使用`count()`方法配合group by语句来获取分组后的记录数。
例如,假设你有一个用户表(user),你想按照城市分组并计算每个城市的用户数量,可以这样编写SQL:
```java
List<User> users = UserMapper.selectCountByCity(); // 使用MybatisPlus的动态查询API
Map<String, Long> cityCounts = users.stream()
.collect(Collectors.groupingBy(User::getCity, Collectors.counting()));
```
这里,`UserMapper.selectCountByCity()`会生成类似这样的SQL(假设City是字段名):
```sql
SELECT COUNT(*) FROM user GROUP BY city;
```
这将返回一个map,其中键是城市名,值是该城市的用户数量。如果你想要直接得到数字,可以使用`users.size()`代替流处理。
三层架构mybatisplus分组统计
### 使用 MyBatisPlus 在三层架构中实现分组统计功能
#### 1. 数据库设计与准备
在三层架构中,数据库层的设计至关重要。假设我们有一个 `blog` 表记录博客文章的信息,其中包括作者 ID (`author_id`) 和阅读次数 (`read_count`) 字段。为了实现按作者分组并统计每篇文章总阅读量的功能,可以先定义 SQL 查询语句:
```sql
SELECT author_id, SUM(read_count) AS total_read FROM blog GROUP BY author_id;
```
此查询会返回每位作者的文章总阅读数。
#### 2. DAO 层 (Mapper 接口)
MyBatis-Plus 提供了强大的 Mapper 功能来简化 CRUD 操作以及自定义 SQL 的支持。可以通过继承 BaseMapper 并扩展方法完成分组统计操作。
创建 BlogMapper 类作为接口文件:
```java
@Mapper
public interface BlogMapper extends BaseMapper<Blog> {
List<Map<String, Object>> getAuthorTotalRead();
}
```
接着,在对应的 XML 文件或者通过注解形式定义具体的方法体内容。如果采用 XML 方式,则需新增如下片段于 mapper.xml 中:
```xml
<select id="getAuthorTotalRead" resultType="map">
SELECT author_id, SUM(read_count) as total_read
FROM blog
GROUP BY author_id
</select>
```
以上代码实现了基于作者维度的聚合计算[^1]。
#### 3. Service 层
Service 层负责处理业务逻辑和服务调用关系管理。通常情况下它封装了多个 Dao 方法组合而成复杂流程,并向 Controller 曝露统一入口。
构建服务类 BlogService 及其实现类 BlogServiceImpl 如下所示:
```java
@Service
public class BlogServiceImpl implements IBlogService {
@Autowired
private BlogMapper blogMapper;
public Map<Integer, Integer> listAuthorTotalRead() {
List<Map<String, Object>> resultList = blogMapper.getAuthorTotalRead();
HashMap<Integer,Integer> resultMap=new HashMap<>();
for(Map<String,Object> item:resultList){
int authorId=(int)item.get("author_id");
int totalRead=((BigDecimal)item.get("total_read")).intValue();
resultMap.put(authorId,totalRead);
}
return resultMap;
}
}
```
这里我们将原始结果转换成更易读的形式——键值对结构,其中 key 是作者ID而 value 则代表对应用户的全部博文累计访问数量[^2]。
#### 4. Controller 层
最后一步是在控制器(Controller)级别暴露 RESTful API 给前端应用消费这些统计数据。下面展示了一个简单的例子说明如何设置路径映射及其关联的服务实例化过程:
```java
@RestController
@RequestMapping("/api/blog")
public class BlogController {
@Resource
private IBlogService iBlogService;
@GetMapping("/authors-total-reads")
public ResponseEntity<?> fetchAuthorsTotalRead(){
try{
Map<Integer,Integer> data=iBlogService.listAuthorTotalRead();
return new ResponseEntity<>(data, HttpStatus.OK);
}catch(Exception e){
log.error(e.getMessage(),e);
return new ResponseEntity<>("Error occurred",HttpStatus.INTERNAL_SERVER_ERROR );
}
}
}
```
至此完成了整个三层架构下的分组统计功能开发工作流描述[^3]。
阅读全文
相关推荐
















