前言
作為一名開發者,數據庫操作是我們日常工作中不可或缺的部分。傳統的MyBatis雖然強大,但需要編寫大量XML映射文件,這在快速開發的今天顯得效率不足。MyBatis-Plus(簡稱MP)作為MyBatis的增強工具,在保留MyBatis所有特性的基礎上,極大地簡化了開發流程。本文將帶你全面了解如何在SpringBoot項目中整合MyBatis-Plus,實現零XML配置的高效CRUD操作。
一、MyBatis-Plus簡介:JPA vs MyBatis vs MyBatis-Plus
在開始整合之前,我們先了解下這三種持久層框架的特點和差異:
特性 | JPA | MyBatis | MyBatis-Plus |
---|---|---|---|
ORM支持 | 全自動ORM | 半自動ORM | MyBatis增強 |
SQL控制 | 自動生成,可控性低 | 完全手動控制 | 自動生成+手動控制 |
XML配置 | 無 | 需要大量XML | 零XML |
CRUD操作 | 方法命名自動生成 | 需手動編寫 | 內置通用Mapper |
學習曲線 | 中等 | 較高 | 低(MyBatis基礎上) |
適用場景 | 簡單標準業務 | 復雜SQL業務 | 各種業務場景 |
MyBatis-Plus的核心優勢:
-
無侵入:只做增強不做改變,引入它不會對現有工程產生影響
-
損耗小:啟動即會自動注入基本CRUD,性能基本無損耗
-
強大CRUD:內置通用Mapper、通用Service,少量配置即可實現單表大部分CRUD操作
-
多種插件:支持分頁、性能分析、樂觀鎖、邏輯刪除等
二、SpringBoot整合MyBatis-Plus
1. 添加依賴
首先在pom.xml
中添加必要依賴:
<!-- SpringBoot Starter -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- MyBatis-Plus Starter -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency><!-- 數據庫驅動(以MySQL為例) -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency><!-- Lombok簡化實體類開發 -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
2. 配置數據庫連接
在application.yml
中配置數據源和MyBatis-Plus相關配置:
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mp_demo?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456mybatis-plus:configuration:# 下劃線轉駝峰map-underscore-to-camel-case: true# 日志實現log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:# 主鍵類型 AUTO:"數據庫ID自增", INPUT:"用戶輸入ID", ID_WORKER:"全局唯一ID", UUID:"全局唯一UUID"id-type: auto# 邏輯刪除字段名logic-delete-field: deleted# 邏輯刪除值logic-delete-value: 1# 邏輯未刪除值logic-not-delete-value: 0
三、實體類注解詳解
MyBatis-Plus通過注解簡化了實體類與數據庫表的映射關系:
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;import java.util.Date;@Data
@TableName("t_user") // 指定表名,省略時默認使用類名作為表名
public class User {@TableId(type = IdType.AUTO) // 主鍵自增private Long id;private String username;private String password;@TableField("real_name") // 指定數據庫字段名private String realName;private Integer age;private String email;@TableField(fill = FieldFill.INSERT) // 插入時自動填充private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE) // 插入和更新時自動填充private Date updateTime;@Version // 樂觀鎖版本字段private Integer version;@TableLogic // 邏輯刪除字段private Integer deleted;
}
常用注解說明:
-
@TableName
:指定實體類對應的表名 -
@TableId
:指定主鍵字段,可配置主鍵生成策略 -
@TableField
:指定非主鍵字段與數據庫列的映射關系 -
@Version
:樂觀鎖注解 -
@TableLogic
:邏輯刪除注解
四、Mapper接口與Service層開發
1. 創建Mapper接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;public interface UserMapper extends BaseMapper<User> {// 繼承BaseMapper后已包含基本CRUD方法// 可在此添加自定義SQL方法
}
2. Service層實現
MyBatis-Plus提供了通用的Service接口:
public interface UserService extends IService<User> {// 可擴展自定義方法
}@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {// 實現類只需繼承ServiceImpl即可
}
3. 基礎CRUD示例
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;// 新增@PostMappingpublic boolean save(@RequestBody User user) {return userService.save(user);}// 刪除@DeleteMapping("/{id}")public boolean remove(@PathVariable Long id) {return userService.removeById(id);}// 修改@PutMappingpublic boolean update(@RequestBody User user) {return userService.updateById(user);}// 查詢單個@GetMapping("/{id}")public User getById(@PathVariable Long id) {return userService.getById(id);}// 分頁查詢@GetMapping("/page")public IPage<User> page(@RequestParam(defaultValue = "1") Integer current,@RequestParam(defaultValue = "10") Integer size) {return userService.page(new Page<>(current, size));}
}
五、高級功能實戰
1. 分頁插件配置
MyBatis-Plus的分頁功能需要先配置分頁插件:
@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 分頁插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}
使用示例:
// 基本分頁
Page<User> page = new Page<>(1, 10); // 當前頁,每頁大小
userMapper.selectPage(page, null);// 自定義SQL分頁
@Select("SELECT * FROM t_user WHERE age > #{age}")
IPage<User> selectPageByAge(IPage<User> page, @Param("age") Integer age);
2. 自動填充功能
實現MetaObjectHandler
接口來處理自動填充字段:
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", Date.class, new Date());this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());}
}
3. 條件構造器Wrapper
MyBatis-Plus提供了強大的條件構造器,可以構建復雜查詢條件:
// 查詢年齡大于18且名字包含"張"的用戶
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.gt(User::getAge, 18).like(User::getUsername, "張");
List<User> users = userMapper.selectList(wrapper);// 更新操作
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(User::getUsername, "張三").set(User::getAge, 25);
userMapper.update(null, updateWrapper);
4. 邏輯刪除配置
在application.yml
中已經配置了邏輯刪除,實體類字段添加@TableLogic
注解后,刪除操作將自動變為更新操作:
// 實際執行的是UPDATE t_user SET deleted=1 WHERE id=? AND deleted=0
userMapper.deleteById(1L);// 查詢時會自動加上WHERE deleted=0條件
userMapper.selectList(null);
5. 樂觀鎖實現
樂觀鎖通過版本號機制實現:
-
實體類添加
@Version
注解 -
配置樂觀鎖插件:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 樂觀鎖插件interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;
}
?使用示例:
// 先查詢獲取version
User user = userMapper.selectById(1L);
// 修改數據
user.setUsername("new name");
// 執行更新,會帶上version條件
userMapper.updateById(user);
六、性能優化建議
-
批量操作:使用
saveBatch
、updateBatchById
等方法提高批量操作效率 -
SQL打印:開發環境可開啟SQL打印方便調試,生產環境應關閉
-
索引優化:為常用查詢條件添加數據庫索引
-
查詢字段控制:避免使用
select *
,明確指定查詢字段 -
邏輯刪除:對于大表,邏輯刪除可能影響性能,需考慮歸檔策略
七、常見問題解決方案
-
表名/字段名不一致:
-
使用
@TableName
和@TableField
注解明確指定 -
配置全局的下劃線轉駝峰命名
-
-
主鍵策略問題:
-
IdType.AUTO
:數據庫自增 -
IdType.ASSIGN_ID
:雪花算法生成ID(默認) -
IdType.ASSIGN_UUID
:UUID生成
-
-
分頁失效:
-
確保配置了分頁插件
-
檢查Page參數是否正確傳遞
-
-
邏輯刪除無效:
-
檢查
application.yml
中的邏輯刪除配置 -
確保實體類字段添加了
@TableLogic
注解
-
結語
通過本文的介紹,相信你已經掌握了SpringBoot整合MyBatis-Plus的核心要點。MyBatis-Plus的強大功能可以讓我們從繁瑣的XML配置中解放出來,專注于業務邏輯的實現。在實際項目中,你可以根據需求組合使用各種功能,如分頁+條件查詢、邏輯刪除+自動填充等,構建出高效可靠的數據訪問層。