MyBatis 和 MyBatis-Plus 是 Java 中常用的持久層框架,MyBatis-Plus 是在 MyBatis 基礎上增強的工具包,讓開發更便捷、高效。下面是兩者主要的區別:
? 核心區別總結:
特性 | MyBatis | MyBatis-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:
-
提供
QueryWrapper
和LambdaQueryWrapper
-
可鏈式編程、支持條件組合、動態拼接
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:適合大多數通用業務,追求開發效率、簡潔的項目,尤其適合中后臺管理系統。