MyBatis与MyBatis-Plus区别

一、框架定位与核心差异

1.1 框架定

  • MyBatis :一款优秀的半自动化持久层框架,专注于SQL灵活性,需手动编写SQL语句和结果映射。
  • MyBatis-Plus(MP) :MyBatis的增强工具 ,在MyBatis基础上只做增强不做改变,旨在简化开发、提高效率。

1.2 核心差异对比

特性 MyBatis MyBatis-Plus
CRUD操作 需手动编写XML或注解SQL 内置通用Mapper/Service,零SQL实现CRUD
条件构造 需手动拼接动态SQL(如<if>标签) 提供QueryWrapper/LambdaQueryWrapper
分页功能 需集成第三方插件(如PageHelper) 内置物理分页插件,配置后直接使用
代码生成 无内置工具 内置代码生成器,支持生成全层代码
主键策略 需手动配置 支持4种主键策略(含分布式ID生成器)
全局拦截 需自定义插件 内置全表删除/更新阻断,预防误操作

二、实例代码对比

2.1 基础CRUD操作

MyBatis实现

1. Mapper接口

bash 复制代码
public interface UserMapper {
    User selectById(Long id);
    int insert(User user);
    int updateById(User user);
    int deleteById(Long id);
}

2. XML映射文件

bash 复制代码
<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectById" resultType="User">
        SELECT * FROM user WHERE id = #{id}
    </select>
    <insert id="insert" parameterType="User">
        INSERT INTO user(name, age) VALUES (#{name}, #{age})
    </insert>
    <!-- 更新/删除类似 -->
</mapper>
MyBatis-Plus实现

1. Mapper接口(仅需继承BaseMapper)

bash 复制代码
public interface UserMapper extends BaseMapper<User> {
    // 无需编写方法,直接继承BaseMapper的CRUD方法
}

2. 调用示例

bash 复制代码
@Autowired
private UserMapper userMapper;

// 查询
User user = userMapper.selectById(1L);

// 新增
User newUser = new User();
newUser.setName("张三");
newUser.setAge(20);
userMapper.insert(newUser);

// 更新
user.setAge(21);
userMapper.updateById(user);

// 删除
userMapper.deleteById(1L);

2.2 条件查询

MyBatis实现(XML动态SQL)
bash 复制代码
<select id="selectByCondition" parameterType="Map" resultType="User">
    SELECT * FROM user
    <where>
        <if test="name != null">AND name LIKE CONCAT('%', #{name}, '%')</if>
        <if test="age != null">AND age > #{age}</if>
    </where>
</select>
MyBatis-Plus实现(条件构造器)
bash 复制代码
// 普通方式
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "张").gt("age", 18);
List<User> userList = userMapper.selectList(queryWrapper);

// Lambda方式(避免字段名硬编码)
LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
lambdaQuery.like(User::getName, "张").gt(User::getAge, 18);
List<User> userList = userMapper.selectList(lambdaQuery);

2.3 分页查询

MyBatis实现(需集成PageHelper)
bash 复制代码
// 配置PageHelper插件
PageHelper.startPage(1, 10);
List<User> userList = userMapper.selectAll();
PageInfo<User> pageInfo = new PageInfo<>(userList);
MyBatis-Plus实现(内置分页插件)

1. 配置分页插件

bash 复制代码
@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

2. 使用分页

bash 复制代码
Page<User> page = new Page<>(1, 10); // 第1页,每页10条
Page<User> resultPage = userMapper.selectPage(page, null);
List<User> userList = resultPage.getRecords();
long total = resultPage.getTotal(); // 总记录数

三、高级特性对比

3.1 主键自动生成

  • MyBatis :需手动配置@GeneratedValue或XML中的useGeneratedKeys。

  • MyBatis-Plus :支持4种策略(如雪花算法),通过注解快速配置:

    bash 复制代码
    @TableId(type = IdType.ASSIGN_ID) // 雪花算法ID
    private Long id;

3.2 逻辑删除

  • MyBatis :需手动在SQL中添加WHERE deleted=0。

  • MyBatis-Plus :通过注解自动实现逻辑删除:

    bash 复制代码
    @TableLogic // 逻辑删除字段(0-未删,1-已删)
    private Integer deleted;

3.3 代码生成器

  • MyBatis:无内置工具,需借助第三方插件。

  • MyBatis-Plus :内置代码生成器,支持生成Entity、Mapper、Service、Controller:

    bash 复制代码
    AutoGenerator mpg = new AutoGenerator();
    // 配置数据源、包路径、策略等
    mpg.execute(); // 生成全层代码

四、使用场景建议

优先选择MyBatis-Plus的场景

  • 快速开发的中小项目,需减少重复SQL编写。
  • 单表CRUD操作频繁,需提高开发效率。
  • 需要内置分页、逻辑删除等通用功能。

优先选择MyBatis的场景

  • 复杂SQL场景(如多表关联、存储过程),需完全控制SQL。
  • 已有MyBatis项目且无升级必要。
  • 对框架轻量化有严格要求。

五、总结

MyBatis-Plus在MyBatis基础上提供了通用CRUD、条件构造器、分页插件 等增强功能,大幅减少样板代码,适合快速开发;而MyBatis更适合需要高度自定义SQL的复杂场景。两者完全兼容,可根据项目需求灵活选择。

相关推荐
SensorFlow2 小时前
看板有漏斗阶段,为什么转化率仍可能是假的?用 ClickHouse 检查演示埋点
后端
LucianaiB2 小时前
【TextIn xParse 与 Workbuddy实践】我把答辩材料丢给 AI 审了一遍,它开始追着我要证据
后端
王中阳Go2 小时前
读者问"你用的什么 Agent":3 个 AI 员工的分工表和工具链
人工智能·后端·ai编程
BadQiang2 小时前
Java 调用 Python 服务,报错后该从哪里查起?
后端
Hashan2 小时前
Vibe Coding 下前后端怎么对接接口?后端不给力的兜底方案
前端·后端·vibecoding
小蒜学长2 小时前
基于SpringBoot+Vue的小学数学智能出题系统(代码+数据库+LW)
java·数据库·spring boot·后端·智能出题系统
小朱爱编程1233 小时前
我用 Jev 做了三个实用工具:整理标签页、分诊飞书反馈、找回 GitHub 收藏
java·开发语言·人工智能·后端·python·架构·ai编程
明月_清风3 小时前
企业买了 Codex、WorkBuddy,AI 为什么还是没落地?我用 FDE + AKA 做深度定制
人工智能·后端
喵个咪4 小时前
RushWind Admin — 用 Rust 写的企业级中后台,开源了
后端·rust·开源
喵个咪4 小时前
RushWind Admin — 契约驱动:203 条路由零手写的工程化拆解
后端·rust·开源