基础概念对比(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 方法引用,改实体类即可 |