Mybatis-plus queryWrapper的使用

基础概念对比(MyBatis vs. MyBatis-Plus)​

操作 MyBatis(XML/注解) MyBatis-Plus(QueryWrapper
​查询所有用户​ <select id="selectAll">SELECT * FROM user</select> userMapper.selectList(null)
​条件查询​ <select id="selectByName">SELECT * FROM user WHERE name = #{name}</select> queryWrapper.eq("name", "张三")
​只查部分字段​ SELECT id, name FROM user queryWrapper.select("id", "name")
​排序​ ORDER BY age DESC queryWrapper.orderByDesc("age")
​分页​ LIMIT #{offset}, #{size} Page<User> page = new Page<>(1, 10); userMapper.selectPage(page, queryWrapper)

queryWrapper基本语法

基本查询

ini 复制代码
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name","张三");
List<User> users = userMapper.selectList(queryWrapper);

多条件查询

ini 复制代码
// 查询 name = "张三" AND age > 18 的用户
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三")
           .gt("age", 18);  // WHERE name = '张三' AND age > 18
List<User> users = userMapper.selectList(queryWrapper);

还有.like("name","张") 模糊查询
.orderByDesc("age") 排序 .select("id","name") 只查询部分字段等方法

3.LambdaQueryWrapper (推荐写法 安全)

QueryWrapper 用字符串写列名容易拼错,LambdaQueryWrapper 可以用方法引用,避免硬编码:

ini 复制代码
// 查询 name = "张三" 的用户(推荐)
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getName, "张三");  // WHERE name = '张三'
List<User> users = userMapper.selectList(queryWrapper);

4. 结合 Service 层使用​

如果你的 Service 继承了 IService,可以直接用 lambdaQuery()

scala 复制代码
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    public List<User> findByName(String name) {
        // 直接使用 lambdaQuery() 方法
        return lambdaQuery()
                .eq(User::getName, name)
                .list();
    }
}

​5. 对比 MyBatis 原生写法​

假设你要查询 name = "张三" AND age > 18 的用户:

​(1) MyBatis(XML 方式)​

xml 复制代码
xml
复制
<!-- UserMapper.xml -->
<select id="selectByNameAndAge" resultType="User">
    SELECT * FROM user 
    WHERE name = #{name} AND age > #{age}
</select>
ini 复制代码
// Java 调用
List<User> users = userMapper.selectByNameAndAge("张三", 18);

​(2) MyBatis-Plus(QueryWrapper 方式)​

ini 复制代码
// 直接构造查询条件,不用写 XML
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三")
           .gt("age", 18);
List<User> users = userMapper.selectList(queryWrapper);

​6. 总结​

场景 MyBatis MyBatis-Plus (QueryWrapper)
​简单查询​ 需要写 XML/注解 直接 Java 代码构造
​条件变化​ 需要改 SQL 或加 if 动态 SQL 直接 .eq().gt() 链式调用
​安全性​ 容易 SQL 注入(${} 错误使用) 自动预编译,防注入
​维护性​ 改字段名要改所有 SQL LambdaQueryWrapper 方法引用,改实体类即可
相关推荐
日行月白1 分钟前
Day14:关于MySQL的索引——创、查、删
数据库·mysql
strive-debug41 分钟前
上篇:《排序算法的奇妙世界:如何让数据井然有序?》
数据结构·算法·排序算法
异常君1 小时前
深入解析 InnoDB 死锁:从案例到方案,全流程透视指南
数据库·后端·mysql
꧁坚持很酷꧂1 小时前
Qt实现文件传输服务器端(图文详解+代码详细注释)
开发语言·数据库·qt
苏牧keio1 小时前
安装MySQL8.0
数据库
半糖土豆爱编码_1 小时前
【mysql】Mac 通过 brew 安装 mysql 、启动以及密码设置
数据库·mysql·macos
PHASELESS4111 小时前
Java堆结构深度解析:原理、实现与应用全指南
java·开发语言·数据结构
杀神lwz2 小时前
数据结构和算法(六)--栈&队列&堆
数据结构
Lary_Rock2 小时前
ubuntu20.04 Android14编译环境配置
大数据·数据库·elasticsearch
烂漫心空2 小时前
Windows 系统如何使用Redis 服务
数据库·数据仓库·redis·mysql·缓存·数据库架构