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 方法引用,改实体类即可
相关推荐
Gauss松鼠会23 分钟前
GaussDB(DWS) GUC参数修改、查看
java·数据库·sql·数据库开发·gaussdb
米高梅狮子28 分钟前
Ceph 分布式存储 部署
linux·运维·数据库·分布式·ceph·docker·华为云
滴滴答答哒28 分钟前
.NET Core 基于 AOP + Polly 实现数据库死锁自动重试
数据库·.netcore·sqlsugar
向日的葵0061 小时前
从IO视角深度对比:BST、红黑树、B树、B+树
数据结构·b树
yuzhiboyouye1 小时前
所有的 SQL 都要经过 Explain 优化,是什么意思
数据库·sql
洛水水1 小时前
Redis 实现限流功能的几种方法
数据库·redis·缓存
l1t1 小时前
DeepSeek总结的postgresql 数据分析师 vs width_bucket()
数据库·postgresql
米高梅狮子1 小时前
Redis
数据库·redis·mysql·缓存·docker·容器·github
dinl_vin1 小时前
FastAPI 系列 ·(四):数据库集成——SQLAlchemy 2.0 异步 ORM 与 Alembic 迁移
java·数据库·fastapi
小羊在睡觉1 小时前
力扣239. 滑动窗口最大值
数据结构·后端·算法·leetcode·go