如何接入
https://baomidou.com/getting-started/
简单使用方法
使用 MyBatis-Plus 时,大多数场景下不需要编写 XML 和 SQL,因为它提供了强大的通用 CRUD 操作和条件构造器。但以下情况可能需要手动编写 SQL:
1. 不需要写 XML/SQL 的场景
(1) 通用 CRUD 操作
- MyBatis-Plus 的
BaseMapper
接口已经内置了通用的增删改查方法,例如:userMapper.selectById(1L); // 根据 ID 查询 userMapper.insert(user); // 插入数据 userMapper.updateById(user); // 根据 ID 更新 userMapper.deleteByMap(conditions); // 根据条件删除
(2) 条件查询
- 使用
QueryWrapper
或LambdaQueryWrapper
动态构建查询条件:QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("name", "John") .between("age", 20, 30) .orderByDesc("create_time"); List<User> users = userMapper.selectList(wrapper);
(3) 分页查询
- 结合
Page
对象和分页插件实现分页:Page<User> page = new Page<>(1, 10); // 第1页,每页10条 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.like("name", "A"); Page<User> result = userMapper.selectPage(page, wrapper);
2. 需要手动编写 SQL 的场景
(1) 复杂 SQL 或关联查询
- 多表联查、嵌套查询等复杂 SQL,可能需要手动编写 XML 或使用注解。
- 示例(注解方式):
@Select("SELECT u.*, a.address FROM user u LEFT JOIN address a ON u.id = a.user_id WHERE u.id = #{id}") User getUserWithAddress(Long id);
(2) 存储过程/自定义函数
- 调用数据库的存储过程或函数时,需要手动定义 SQL。
(3) 动态 SQL 的复杂逻辑
- 虽然 MyBatis-Plus 的
QueryWrapper
可以处理大多数动态条件,但极端复杂的逻辑可能需要 XML 的<if>
、<foreach>
标签:<!-- XML 动态 SQL 示例 --> <select id="selectByConditions" resultType="User"> SELECT * FROM user <where> <if test="name != null">AND name = #{name}</if> <if test="status != null">AND status = #{status}</if> </where> </select>
3. 如何选择:注解 vs XML
(1) 注解方式(推荐简单场景)
- 直接在 Mapper 接口方法上使用
@Select
、@Update
等注解:@Select("SELECT * FROM user WHERE age > #{age}") List<User> selectUsersOlderThan(Integer age);
(2) XML 方式(适合复杂 SQL)
- 在
resources/mapper
目录下创建 XML 文件:<!-- UserMapper.xml --> <mapper namespace="com.example.mapper.UserMapper"> <select id="selectCustom" resultType="User"> SELECT * FROM user WHERE name LIKE CONCAT(#{prefix}, '%') </select> </mapper>
4. 对比总结
场景 | MyBatis-Plus 方案 | 是否需要手动 SQL/XML |
---|---|---|
单表 CRUD | BaseMapper 内置方法 |
不需要 |
动态条件查询 | QueryWrapper /LambdaQueryWrapper |
不需要 |
分页查询 | Page + 分页插件 |
不需要 |
多表联查/复杂 SQL | 注解或 XML | 需要 |
存储过程/数据库函数 | 注解或 XML | 需要 |
5. 最佳实践
- 优先使用 MyBatis-Plus 的内置方法,减少重复代码。
- 简单自定义 SQL 用注解,保持代码简洁。
- 复杂 SQL 或动态逻辑用 XML,提高可维护性。
- 始终通过
QueryWrapper
处理条件,避免手动拼接 SQL 字符串。
示例代码
注解方式实现自定义查询
public interface UserMapper extends BaseMapper<User> {
// 注解方式查询年龄大于指定值的用户
@Select("SELECT * FROM user WHERE age > #{age}")
List<User> selectByAgeGreaterThan(Integer age);
}
XML 方式实现复杂查询
<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserWithRole" resultType="User">
SELECT u.*, r.role_name
FROM user u
LEFT JOIN user_role ur ON u.id = ur.user_id
LEFT JOIN role r ON ur.role_id = r.id
WHERE u.status = 1
</select>
</mapper>
通过合理利用 MyBatis-Plus 的特性,可以显著减少 XML 和 SQL 的编写,提升开发效率!