MyBatis-Plus接入和简单使用

发布于:2025-03-17 ⋅ 阅读:(17) ⋅ 点赞:(0)

如何接入

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) 条件查询
  • 使用 QueryWrapperLambdaQueryWrapper 动态构建查询条件:
    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. 最佳实践

  1. 优先使用 MyBatis-Plus 的内置方法,减少重复代码。
  2. 简单自定义 SQL 用注解,保持代码简洁。
  3. 复杂 SQL 或动态逻辑用 XML,提高可维护性。
  4. 始终通过 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 的编写,提升开发效率!