不推荐使用mybatisplus
时间: 2023-10-07 18:04:59 浏览: 205
MyBatis-Plus是一个封装了MyBatis的框架,它的设计初衷是为了提高开发效率和降低SQL报错的概率。然而,使用MyBatis-Plus可能会导致代码的复用性和层次结构的清晰度降低,增加代码修改和维护的成本。与纯MyBatis相比,在使用MyBatis-Plus时需要重复复制相同的代码,这在项目中会造成代码冗余。此外,MyBatis-Plus的特性可能会让代码变得整洁,但在开发过程中可能会隐藏一些底层的SQL细节,这可能会导致开发者对于SQL的优化和调试有所局限。
因此,如果您更加注重代码的复用性、层次结构的清晰度,以及对底层SQL的灵活调优和调试,那么推荐使用纯MyBatis而非MyBatis-Plus。
相关问题
mybatisplus使用max
### 在 MyBatisPlus 中使用 `max` 函数
在 MyBatisPlus 中,可以通过多种方式查询表中的最大值。以下是几种常见的实现方法:
#### 方法一:使用 Wrapper 查询条件构建器
可以借助 `QueryWrapper` 或者 `LambdaQueryWrapper` 来编写 SQL 片段,从而获取指定字段的最大值。
```java
// 假设有一个实体类 User 对应 users 表
UserMapper userMapper = ...;
// 创建 LambdaQueryWrapper 并设置查询条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.select(User::getId).select(User::getAge);
// 调用 selectObjs 获取结果集并从中提取最大年龄
List<Object> ageList = userMapper.selectObjs(wrapper);
if (!ageList.isEmpty()) {
Integer maxAge = Collections.max((List<Integer>) ageList);
}
```
这种方法较为直观,但是效率不高,因为先取出了所有记录再做 Java 层面的计算[^1]。
#### 方法二:直接执行聚合函数
更推荐的方式是让数据库引擎完成这一操作,即直接调用 `MAX()` 聚合函数。这不仅提高了性能,也减少了应用程序内存占用。
```java
// 定义接口继承 BaseMapper<T>
public interface UserMapper extends BaseMapper<User> {}
// 实现自定义 Mapper 接口
@Mapper
public class CustomUserMapper {
@Select("SELECT MAX(age) FROM users")
public Integer getMaxAge();
}
// 使用时只需像普通方法一样调用即可得到最大值
CustomUserMapper customUserMapper = ...;
Integer maxAge = customUserMapper.getMaxAge();
```
这种方式充分利用了数据库的能力,在大型数据集中表现尤为出色[^2]。
#### 方法三:利用 Mp 提供的帮助类
对于不想手写 SQL 的开发者来说,还可以考虑使用 MyBatis Plus 自带的选择器 SelectOneService 和 Wrappers 工具类组合来达成目的。
```java
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import static com.baomidou.mybatisplus.extension.service.IService.*;
...
// 构建 lambda 形式的查询封装器
LambdaQueryWrapper<User> queryWrapper = Wrappers.<User>lambdaQuery()
.select(User::getMaxAge); // 这里假设存在 getMaxAge 字段映射到 max(age)
// 执行单条记录查询服务,默认只会返回一条记录
User recordWithMaxAge = userService.getOne(queryWrapper, true);
System.out.println(recordWithMaxAge != null ? recordWithMaxAge.getMaxAge() : "No data");
```
需要注意的是上述代码片段中关于 `getMaxAge` 的部分并不真实存在于框架内;实际应用时应当按照具体需求调整逻辑[^3]。
mybatisplus使用count接收
### MyBatis Plus 中使用 `count` 进行统计查询
在 MyBatis Plus 中执行统计查询非常简便,主要通过 `selectCount` 方法配合条件构造器来实现。这允许开发者根据特定条件获取符合条件的数据条目数量。
对于简单的统计查询,可以创建一个不带任何条件的 `QueryWrapper` 实例并调用 `selectCount` 方法:
```java
// 创建一个新的 QueryWrapper 对象
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 执行计数查询
Long totalUsers = userMapper.selectCount(queryWrapper);
```
当需要基于某些字段设置过滤条件时,则可以在构建 `QueryWrapper` 时加入这些条件。例如,要计算年龄大于18岁的用户总数:
```java
// 构建带有条件的 QueryWrapper
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 18); // 设置 age > 18 的条件
// 获取满足条件的记录数目
Long adultsCount = userMapper.selectCount(queryWrapper)[^3];
```
如果希望进一步细化查询逻辑,比如结合多个条件或应用更复杂的表达式,还可以利用 `LambdaQueryWrapper` 来保持类型安全性的同时简化代码编写过程[^2]。
#### 使用 LambdaQueryWrapper 进行高级统计查询
为了提高代码可读性和维护性,在处理较为复杂的查询场景下推荐使用 `LambdaQueryWrapper`。下面是一个例子展示如何查找指定部门内所有员工的数量,并按入职日期降序排列:
```java
// 定义 LambdaQueryWrapper 并添加筛选条件
LambdaQueryWrapper<Employee> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(Employee::getDepartmentId, specificDeptId).orderByDesc(Employee::getHireDate);
// 调用 selectCount 方法得到最终的结果
long employeeCountInDept = employeeMapper.selectCount(lambdaQueryWrapper);
```
此方式不仅能够有效减少错误的发生几率,而且使得意图更加清晰明了。
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)