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