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 方法引用,改实体类即可
相关推荐
无名-CODING几秒前
Java Spring 事务管理深度指南
java·数据库·spring
txinyu的博客3 分钟前
map和unordered_map的性能对比
开发语言·数据结构·c++·算法·哈希算法·散列表
想唱rap7 分钟前
MYSQL在ubuntu下的安装
linux·数据库·mysql·ubuntu
蕨蕨学AI8 分钟前
【Wolfram语言】45.2 真实数据集
java·数据库
The Sheep 202315 分钟前
MongoDB与.Net6
数据库·mongodb
im_AMBER21 分钟前
Leetcode 101 对链表进行插入排序
数据结构·笔记·学习·算法·leetcode·排序算法
予枫的编程笔记22 分钟前
【Java集合】深入浅出 Java HashMap:从链表到红黑树的“进化”之路
java·开发语言·数据结构·人工智能·链表·哈希算法
BryceBorder24 分钟前
SCAU--数据库
数据库·oracle·dba
有味道的男人29 分钟前
京东关键词API接口获取
数据库
X在敲AI代码43 分钟前
leetcodeD3
数据结构·算法