从 MyBatis 到 MyBatis-Plus:我的技术进阶之路

os:作为一名开发者,我在使用 MyBatis 的过程中,逐渐发现了一些痛点:重复的 CRUD 代码、繁琐的 XML 配置、手动处理分页和逻辑删除等。这些问题让我开始寻找更高效的解决方案,直到我遇到了 MyBatis-Plus。今天,我想通过这篇文章,和大家一起梳理 MyBatis 和 MyBatis-Plus 的核心内容,并分享它们之间的区别,帮助大家更好地选择和使用这两个框架。


一、MyBatis:经典但略显繁琐

MyBatis 是一个优秀的持久层框架,它通过 XML 或注解的方式将 SQL 与 Java 代码解耦,提供了极大的灵活性。我在使用 MyBatis 时,最大的感受是它的“自由”和“可控性”。我可以完全掌控 SQL 的编写,优化查询性能,但也因此需要花费大量时间在重复的 CRUD 操作和配置上。

MyBatis 的核心特点:
  1. 灵活的 SQL 编写:支持 XML 和注解两种方式,适合复杂查询场景。
  2. 手动管理连接和事务:需要开发者手动处理数据库连接、事务等。
  3. 学习成本较低:API 简单直观,适合初学者快速上手。

但随着时间的推移,我发现 MyBatis 的缺点也逐渐显现:

  • 重复代码多:每个实体类都需要手动编写 CRUD 方法。
  • 配置繁琐:XML 文件过多,维护成本高。
  • 功能有限:分页、逻辑删除等功能需要手动实现。
MyBatis 示例代码:
// UserMapper.java
public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User selectUserById(int id);

    @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
    int insertUser(User user);

    @Update("UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}")
    int updateUser(User user);

    @Delete("DELETE FROM user WHERE id = #{id}")
    int deleteUserById(int id);
}

二、MyBatis-Plus:效率与优雅的完美结合

MyBatis-Plus 是 MyBatis 的增强工具,它在 MyBatis 的基础上提供了更多开箱即用的功能,极大地简化了开发流程。我第一次使用 MyBatis-Plus 时,就被它的“自动化”和“高效”所吸引。

MyBatis-Plus 的核心特点:
  1. 强大的 CRUD 封装:通过继承 BaseMapper,无需编写任何 CRUD 方法。
  2. 内置分页插件:只需简单配置即可实现分页查询。
  3. 逻辑删除支持:通过注解轻松实现逻辑删除功能。
  4. 代码生成器:自动生成实体类、Mapper 接口和 XML 文件,减少重复劳动。
  5. Lambda 表达式支持:让查询代码更加简洁优雅。
MyBatis-Plus 的优势:
  • 开发效率高:减少了大量重复代码,专注于业务逻辑。
  • 配置简单:大部分功能只需通过注解或配置文件启用。
  • 功能丰富:提供了许多 MyBatis 没有的实用功能,如自动填充字段、乐观锁等。
MyBatis-Plus 示例代码:
// User.java
@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    @TableLogic
    private Integer deleted; // 逻辑删除字段
}

// UserMapper.java
public interface UserMapper extends BaseMapper {
    // 无需编写 CRUD 方法,直接继承 BaseMapper
}

// 使用示例
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public void testMyBatisPlus() {
        // 插入用户
        User user = new User();
        user.setName("John");
        user.setAge(25);
        userMapper.insert(user);

        // 查询用户
        User selectedUser = userMapper.selectById(1L);
        System.out.println(selectedUser);

        // 分页查询
        Page page = new Page<>(1, 10); // 第1页,每页10条
        QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().ge(User::getAge, 20); // 查询年龄大于20的用户
        IPage userPage = userMapper.selectPage(page, queryWrapper);
        System.out.println(userPage.getRecords());

        // 逻辑删除
        userMapper.deleteById(1L); // 实际执行的是 UPDATE user SET deleted = 1 WHERE id = 1
    }
}

三、MyBatis 和 MyBatis-Plus 的区别

特性 MyBatis MyBatis-Plus
CRUD 操作 需要手动编写 通过 BaseMapper 自动实现
分页功能 需要手动实现 内置分页插件,配置简单
逻辑删除 需要手动实现 通过注解轻松实现
代码生成 需要第三方工具 内置代码生成器
Lambda 支持 不支持 支持,查询代码更简洁
学习成本 较低,适合初学者 略高,但功能更强大

四、我的选择与建议

在实际开发中,我会根据项目的需求选择使用 MyBatis 还是 MyBatis-Plus:

  • 如果项目需要高度定制化的 SQL 或对性能有极高要求,我会选择 MyBatis,因为它提供了更大的灵活性。
  • 如果项目以业务逻辑为主,且需要快速开发,我会毫不犹豫地选择 MyBatis-Plus,因为它能显著提升开发效率。

对于初学者,我建议先学习 MyBatis,掌握其核心原理和基本用法,然后再过渡到 MyBatis-Plus,感受它的便利和强大。


五、总结

MyBatis 和 MyBatis-Plus 各有优劣,但它们的目标都是帮助我们更高效地完成数据库操作。通过这篇文章,我希望大家能够更清晰地理解两者的区别,并在实际开发中做出更合适的选择。如果你也在使用 MyBatis 或 MyBatis-Plus,欢迎在评论区分享你的经验和心得,让我们一起进步!


小tips:如果你对 MyBatis-Plus 感兴趣,可以访问它的官方文档获取更多详细信息和示例代码。相信它会成为你开发路上的得力助手!觉得这篇文章对你有帮助的话,麻烦点一个赞吧!

你可能感兴趣的:(mybatis,mybatisplus)