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

MyBatis 与 MyBatis-Plus 的区别

在 Java 持久层框架中,MyBatis 和 MyBatis-Plus 是两款广泛使用的工具,它们既有紧密的联系,又存在显著差异。下面从核心特性、使用方式等方面详细对比两者的区别。

1. 核心定位不同

  • MyBatis
    是一款轻量级的持久层框架,它的核心思想是通过 XML 或注解方式将 SQL 语句与 Java 方法绑定,让开发者可以灵活控制 SQL 编写,避免了 JDBC 繁琐的代码编写。但 MyBatis 只提供基础的 CRUD 支持,很多通用操作需要开发者手动编写 SQL。

  • MyBatis-Plus
    是在 MyBatis 基础上开发的增强工具,遵循“只做增强,不做改变”的原则。它在保留 MyBatis 原有功能的同时,增加了大量实用特性,旨在简化开发,减少重复的 SQL 编写工作。

2. 通用 CRUD 操作支持

  • MyBatis
    对于基本的增删改查(CRUD)操作,需要开发者手动编写 SQL 语句(无论是在 XML 中还是通过注解)。例如,查询单条数据需要编写:

    <select id="selectById" resultType="User">SELECT * FROM user WHERE id = #{id}
    </select>
    
  • MyBatis-Plus
    提供了 BaseMapper 接口,该接口中封装了大量通用的 CRUD 方法,开发者只需让自己的 Mapper 接口继承 BaseMapper,即可直接调用这些方法,无需编写 SQL。例如:

    public interface UserMapper extends BaseMapper<User> {// 无需编写代码,直接使用 selectById、insert、update 等方法
    }
    // 调用示例
    User user = userMapper.selectById(1);
    

3. 条件构造器的差异

  • MyBatis
    当需要动态拼接 SQL 条件(如多条件查询)时,需使用 <if> <where> 等标签在 XML 中手动拼接,例如:

    <select id="selectByCondition" resultType="User">SELECT * FROM user<where><if test="name != null">AND name LIKE #{name}</if><if test="age != null">AND age > #{age}</if></where>
    </select>
    
  • MyBatis-Plus
    提供了 Wrapper 条件构造器,可以通过 Java 代码动态构建查询条件,无需编写 XML。例如:

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("name", "张").gt("age", 18);
    List<User> userList = userMapper.selectList(queryWrapper);
    

    这种方式更直观,且避免了 XML 中繁琐的标签拼接。

4. 其他增强功能

MyBatis-Plus 在 MyBatis 基础上增加了诸多实用功能,而这些是 MyBatis 不具备的:

  • 代码生成器:可以根据数据库表结构自动生成实体类、Mapper 接口、Service 等代码,大幅减少重复劳动。
  • 分页插件:内置分页功能,只需简单配置即可实现分页查询,无需手动编写分页 SQL。
  • 逻辑删除:通过注解即可实现逻辑删除(更新删除标识字段),无需手动编写更新语句。
  • 字段自动填充:支持对创建时间、修改时间等字段进行自动填充,无需在代码中手动设置。

底层关系与适用场景

  • MyBatis-Plus 是 基于 MyBatis 实现 的,完全兼容 MyBatis 的所有功能,两者可以无缝切换。
  • 若项目需要高度自定义 SQL,且不需要太多通用功能,MyBatis 足够轻量灵活。
  • 若项目存在大量重复的 CRUD 操作,或需要快速开发以提升效率,MyBatis-Plus 是更好的选择,它能显著减少代码量,降低开发成本。

总之,MyBatis-Plus 是 MyBatis 的“增强版”,在保留灵活性的同时,为开发者提供了更多便捷工具,尤其适合快速开发场景。

http://www.xdnf.cn/news/18038.html

相关文章:

  • STM32L051同时处理Alarm A和Alarm B中断
  • SSH协议的GIT转换
  • 系统介绍pca主成分分析算法
  • flutter开发(二)检测媒体中的静音
  • Day59--图论--47. 参加科学大会(卡码网),94. 城市间货物运输 I(卡码网)
  • 【DDIA】第二部分:分布式数据
  • 应用层协议——HTTP
  • 抽奖程序web程序
  • JavaScript 基础实战:DOM 操作、数据类型与常见需求实现
  • 项目管理工具
  • NPM 、 NPX
  • 清除 pnpm 缓存,解决不同源安装依赖包失败的问题
  • electron之win/mac通知免打扰
  • 【R语言】R 语言中 gsub 与正则表达式详解(含 POSIX 与 Perl 风格实例)
  • 汽车电子:现代汽车的智能核心
  • [激光原理与应用-287]:理论 - 波动光学 - 电磁波既能承载能量,又能承载信息?
  • 【软件设计模式】前置知识类图、七大原则(精简笔记版)
  • Spark 运行流程核心组件(二)任务调度
  • EN/IEC 55015 照明设备的电磁兼容标准安全
  • Docker Compose部署Clickhouse最新版
  • 【LINUX网络】HTTP协议基本结构、搭建自己的HTTP简单服务器
  • 为什么游戏会出现“卡顿”:`clock.tick()` v.s. `clock.get_fps()`
  • 【uni-app】根据角色/身份切换显示不同的 自定义 tabbar
  • 线性代数 · 直观理解矩阵 | 空间变换 / 特征值 / 特征向量
  • CERT/CC警告:新型HTTP/2漏洞“MadeYouReset“恐致全球服务器遭DDoS攻击瘫痪
  • 机械加工元件——工业精密制造的璀璨明珠
  • Day14: Flask太空站搭建指南:从零到超光速的Web开发之旅
  • git clone https://gh.llkk.cc/
  • C++从入门到实战(十九)C++ vector容器及其常用接口
  • 电子电路学习日记