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 方法引用,改实体类即可
相关推荐
陈天伟教授3 小时前
人工智能训练师认证教程(2)Python os入门教程
前端·数据库·python
不穿格子的程序员3 小时前
从零开始写算法——链表篇4:删除链表的倒数第 N 个结点 + 两两交换链表中的节点
数据结构·算法·链表
dragoooon343 小时前
[hot100 NO.19~24]
数据结构·算法
Elastic 中国社区官方博客4 小时前
Elasticsearch:在分析过程中对数字进行标准化
大数据·数据库·elasticsearch·搜索引擎·全文检索
聪明努力的积极向上4 小时前
【MYSQL】字符串拼接和参数化sql语句区别
数据库·sql·mysql
代码or搬砖4 小时前
RBAC(权限认证)小例子
java·数据库·spring boot
神仙别闹4 小时前
基于QT(C++)实现学本科教务系统(URP系统)
数据库·c++·qt
2301_768350234 小时前
MySQL为什么选择InnoDB作为存储引擎
java·数据库·mysql
上海蓝色星球4 小时前
迈向智慧电网新纪元:上海蓝色星球数字孪生变电主子站系统
运维·数据库
是大芒果4 小时前
数据库表设计
数据库