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 方法引用,改实体类即可
相关推荐
IvorySQL9 小时前
PostgreSQL 日报|修复截断 zstd 备份检测(10 月 9 日)
数据库·postgresql
刘胡子大叔10 小时前
SQL 脚本的导入顺序
数据库·sql
代码什么用10 小时前
Spring对IoC的实现
数据库·spring
hz5678912 小时前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
码完就睡12 小时前
数据结构——红黑树
数据结构
广州浮点FLOATLIC12 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
程序员Sunday12 小时前
MySQL 为什么使用 B+ 树索引?把范围查询、回表和覆盖索引连起来
数据库·mysql
码爸12 小时前
数据结构详细介绍
数据结构
半杯咖啡半行码13 小时前
Qt开发实战:数据库、MV 模式、QProcess与串口通信全攻略
数据库·qt
小米里的大麦13 小时前
16 MySQL 事务
数据库·mysql