当前位置: 首页 > news >正文

Mybtis和Mybatis-Plus区别

MyBatis 和 MyBatis-Plus 是 Java 中常用的持久层框架,MyBatis-Plus 是在 MyBatis 基础上增强的工具包,让开发更便捷、高效。下面是两者主要的区别:


✅ 核心区别总结:

特性MyBatisMyBatis-Plus
配置复杂度需要手写大量 XML 或注解极简配置,自动生成 SQL
CRUD 操作手写 Mapper 方法 + SQL内置通用 CRUD 方法
分页功能需要手写分页逻辑或第三方插件内置分页插件,开箱即用
条件构造器无,需要手写 where 条件内置 Lambda 条件构造器
代码生成提供代码生成器(Code Generator)
主键策略需要手动配置内置多种主键生成策略
乐观锁自己实现提供内置乐观锁插件
审计字段(如创建时间、修改时间)自行维护提供自动填充功能
性能分析需要额外工具内置 SQL 性能分析插件
兼容性灵活、手动控制高完全兼容 MyBatis,可随时退回

🧩 1. 配置复杂度

✅ MyBatis:
  • 需要创建 Mapper 接口 + Mapper.xml 文件

  • SQL 都需要手动写,配置较繁琐

  • 实体类、字段和表结构需要手动映射(resultMap 或 @Results)

<!-- MyBatis 的 select 示例 -->
<select id="selectById" resultType="User">SELECT * FROM user WHERE id = #{id}
</select>
✅ MyBatis-Plus:
  • 只需配置数据库连接、扫描 Mapper 包

  • 不需要写 XML,自动完成 SQL 拼接

  • 实体类字段与表字段名称一致可自动映射

// 简洁调用
User user = userMapper.selectById(1L);

🧩 2. CRUD 操作

✅ MyBatis:
  • 所有 CRUD 方法都需要手写

  • 如果实体类字段多,SQL 写起来冗长,易出错

✅ MyBatis-Plus:
  • 提供 BaseMapper<T>,自动拥有 20+ 个通用 CRUD 方法

  • 例如:

    • selectById, insert, updateById, deleteById

    • 批量插入、分页查询、条件查询等也支持

userMapper.insert(user); // 自动生成 insert SQL

🧩 3. 分页功能

✅ MyBatis:
  • 需要自己拼接分页 SQL(LIMIT/OFFSET)

  • 或接入第三方分页插件如 PageHelper

✅ MyBatis-Plus:
  • 提供 分页插件,配置一次后,使用非常方便

  • 统一使用 Page<T> 对象传参

Page<User> page = new Page<>(1, 10); // 页码1,每页10条
Page<User> result = userMapper.selectPage(page, null);

🧩 4. 条件构造器

✅ MyBatis:
  • 条件查询时需要手写 SQL 中的 where 子句
✅ MyBatis-Plus:
  • 提供 QueryWrapperLambdaQueryWrapper

  • 可链式编程、支持条件组合、动态拼接

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAge, 20).like(User::getName, "张");
List<User> users = userMapper.selectList(wrapper);

🧩 5. 代码生成

✅ MyBatis:
  • 没有自带代码生成工具,通常需要借助 MyBatis Generator 插件,且配置复杂
✅ MyBatis-Plus:
  • 自带 Code Generator,支持通过数据库自动生成:

    • 实体类、Mapper 接口、XML、Service、Controller 等
// 快速生成一整套文件,只需配置数据库和模板路径
AutoGenerator generator = new AutoGenerator();
// 配置略...
generator.execute();

🧩 6. 主键策略

✅ MyBatis:
  • 插入数据时需要手动指定主键或配置主键返回策略(如 useGeneratedKeys)
✅ MyBatis-Plus:
  • 支持多种主键生成方式:

    • 自增、UUID、雪花算法(默认使用雪花)
  • 只需在实体类中加注解即可

@TableId(type = IdType.ASSIGN_ID) // 使用雪花算法生成主键
private Long id;

🧩 7. 乐观锁

✅ MyBatis:
  • 需要手动实现版本字段逻辑和 SQL 拼接
✅ MyBatis-Plus:
  • 提供内置插件支持乐观锁,自动对 version 字段进行比较和更新
@Version
private Integer version; // 更新时会自动加入 version=... 的判断

🧩 8. 审计字段(创建时间、修改时间)

✅ MyBatis:
  • 需要手动在 insert/update 语句中维护 createTime, updateTime
✅ MyBatis-Plus:
  • 提供自动填充功能,支持插入/更新时自动填充字段
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
  • 需要配置 MetaObjectHandler,一次性设置全局规则

🧩 9. 性能分析

✅ MyBatis:
  • 需要自己接入日志框架或 SQL 监控工具(如 P6Spy)
✅ MyBatis-Plus:
  • 内置 SQL 执行分析插件(dev/test 环境下很实用)
// 开启性能分析插件
interceptor.addInnerInterceptor(new PerformanceInterceptor());

🧩 10. 兼容性

✅ MyBatis:
  • 灵活度高,自由度大,但需要手动控制 SQL
✅ MyBatis-Plus:
  • 100% 兼容原生 MyBatis

  • 可以只使用通用功能,特殊需求时照样写 XML、注解 SQL


🚀 使用场景建议:

  • MyBatis:适合 SQL 极度复杂、强定制化的项目,想完全控制 SQL。

  • MyBatis-Plus:适合大多数通用业务,追求开发效率、简洁的项目,尤其适合中后台管理系统。

相关文章:

  • 4月17日星期四今日早报简报微语报早读
  • 高效检测书签网址,告别无效链接烦恼
  • 新一代电子海图S-100标准
  • Python中如何加密/解密敏感信息(如用户密码、token)
  • C++面试
  • 蓝牙的AT指令
  • 第二届中国人形机器人与具身智能产业大会圆满闭幕,爱迪斯通动捕设备引瞩目
  • [终极版]Javascript面试全解
  • 【Dify 前端源码解读系列】MDX 让 API 文档焕发生机
  • jenkins凭据管理(配置github密钥)
  • 使用 OpenRewrite 简化 Java 和 SpringBoot 迁移
  • 2025年华中杯数学建模竞赛AI辅助全网专业性第一
  • 2.深入剖析 Rust+Axum 类型安全路由系统
  • 关于C语言的模拟物理模型
  • 新开设!!香港科技大学物理学(科学计算与先进材料物理与技术)理学硕士2025年9月入学机会!广州大学城招生宣讲会
  • 网络安全领域的AI战略准备:从概念到实践
  • mybatis 单值或多值传参存在风险举例分析
  • 《似锦》:画饼之—你画给我我画给你
  • SVM-RF回归预测matlab代码
  • C++lambda表达式及其在Qt中的使用
  • 长江财险一季度净亏1449.81万元,去年曾实现扭亏为盈
  • 同日哑火丢冠,双骄的下山路,手牵手一起走
  • 媒体:酒店、民宿临时毁约涨价,怎么管?
  • 4月译著联合书单|心爱之物:热爱如何联结并塑造我们
  • 亮剑浦江丨上海网信部门处罚一批医疗服务类互联网企业,三大类问题值得关注
  • 气温“过山车”现象未来或更频繁且更剧烈