Mabatis-Plus (查)使用条件构造器查询的3种方法(QueryWrapper、LambdaQueryWrapper、LambdaQueryChainWrapper)

通过本片:你将学习到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.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);

你可能感兴趣的:(mybatis,mybatis,java,数据库)