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 方法引用,改实体类即可
相关推荐
-Initiation1 天前
数据库的安全与保护(下)
java·数据库·oracle
yuuki2332331 天前
【数据结构】顺序表的实现
c语言·数据结构·后端
Leon-Ning Liu1 天前
Oracle 19c 归档日志挖掘(Log Mining)完全指南
数据库·oracle
信奥卷王1 天前
[GESP202506 五级] 奖品兑换
数据结构·算法
泡沫冰@1 天前
数据结构(11)
数据结构
奶茶树1 天前
【数据结构】二叉搜索树
数据结构·算法
小苏兮1 天前
【数据结构】二叉搜索树
开发语言·数据结构·c++·学习·1024程序员节
晨曦(zxr_0102)1 天前
CSP-X 2024 复赛编程题全解(B4104+B4105+B4106+B4107)
数据结构·c++·算法
Q16849645151 天前
提高命令行运行效率-正则 表达式
数据库·mysql
盒马coding1 天前
PostgreSQL 空闲空间映射(FSM)深度解读
数据库·postgresql