通过本片:你将学习到Mybatis-Plus查询的3种用法
基本覆盖了单表查询的业务需求,( •̀ ω •́ )y
业务场景-举个栗子:现在有一张"用户表(User)",且每个用户的用户名(username)唯一
我们想通过字段"用户名(username)“———查找"用户表”———用户
这里大致介绍一下:
1.QueryWrapper:查询最基础的条件构造器
2.LambdaQueryWrapper: 基于QueryWrapper
3.LambdaQueryChainWrapper:基于LambdaQueryWrapper
话不多说,来人!上Impl层代码(○´・д・)ノ
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
private final UserMapper userMapper;
public UserServiceImpl(UserMapper userMapper) {
this.userMapper = userMapper;
}
/**
* 通过"用户名(username)"查询用户(唯一)
* 数据源:user表
* @param username
* @return
*/
@Override
public User getUserByUsername(String username) {
// 第 1 种方法 QueryWrapper
// 方法1.1 --- 参数名为:数据库表的实际字段名
QueryWrapper<User> queryWrapper1 = new QueryWrapper<>();
queryWrapper1.eq("username", username);
User user1 = userMapper.selectOne(queryWrapper1);
// 方法1.2 --- 不想用方法1.1的数据库表字段名,可以用lambda,使用实体类映射数据库表的字段
QueryWrapper<User> queryWrapper2 = new QueryWrapper<>();
queryWrapper2.lambda().eq(User::getUsername, username);
User user2 = userMapper.selectOne(queryWrapper2);
// 第 2 种方法 LambdaQueryWrapper
// 方法2.1 --- Lambda查询条件构造器,
// 1.1、1.2的封装,可以少写: lambda()
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getUsername, username);
User user3 = userMapper.selectOne(lambdaQueryWrapper);
// 方法2.2 --- Wrappers.<E>lambdaQuery()
// E是实体类对象 2.1的封装版
// 2.1的封装版, 少写:new LambdaQueryWrapper对象
LambdaQueryWrapper<User> lambdaQueryWrappers1 = Wrappers.<User>lambdaQuery().eq(User::getUsername, username);
User user4 = userMapper.selectOne(lambdaQueryWrappers1);
// 方法2.3 --- Wrappers.lambdaQuery(E.class)
// 效果:等同方法2.2
// 区别:实体类对象放置位置不同
LambdaQueryWrapper<User> lambdaQueryWrappers2 = Wrappers.lambdaQuery(User.class).eq(User::getUsername, username);
User user5 = userMapper.selectOne(lambdaQueryWrappers2);
// 第 3 种方法 LambdaQueryChainWrapper
// 链式查询,个人认为此种写法最美观,推荐!!!
User user6 = new LambdaQueryChainWrapper<>(userMapper)
.eq(User::getUsername, username)
.one(); // 这步骤是查询一条记录,查询列表用:.list()
return user1;
}
}
总结:
综上所述,
使用链式查询方法:LambdaQueryChainWrapper
查询的方式最为优雅!推荐使用这种!
lambda表达式还有很多种用法:
or()
orderByAsc(“xxx”)
orderByDesc(“xxx”)
……
这里用法差不多就不一一举栗了
有啥疑虑||错误,欢迎指正!(○´・д・)ノ
看到这里,Mybatis-Plus查询就会用了,
下面内容可选择自行观看,
是对上面代码写法的一些优化,以及一个小坑点
来人,上代码!(○´・д・)ノ
@Override
public User getUserByUsername(String username) {
// 方法2.2 (上面的代码)
LambdaQueryWrapper<User> lambdaQueryWrappers1 = Wrappers.<User>lambdaQuery().eq(User::getUsername, username);
User user4 = userMapper.selectOne(lambdaQueryWrappers1);
// 方法2.2 (简化的代码)
User user4 = userMapper.selectOne(Wrappers.<User>lambdaQuery()
.eq(User::getUsername, username));
// 方法2.3 (上面的代码)
LambdaQueryWrapper<User> lambdaQueryWrappers2 = Wrappers.lambdaQuery(User.class).eq(User::getUsername, username);
User user5 = userMapper.selectOne(lambdaQueryWrappers2);
// 方法2.3 (简化的代码)
User user5 = userMapper.selectOne(Wrappers.lambdaQuery(User.class)
.eq(User::getUsername, username));
return user4;
}
来人,上小坑点!(○´・д・)ノ
// 方法2.1 正确的
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getUsername, username);
User user3 = userMapper.selectOne(lambdaQueryWrapper);
// 方法2.1 错误的
// 这里有个小坑,因为LambdaQueryWrapper构造函数未实现 E::getXXX
// 所以2.1不能简写成这样:
// 这里会提示:Non-static method cannot be referenced from a static context
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>().eq(User::getUsername, username);
User user3 = userMapper.selectOne(lambdaQueryWrapper);