MyBatis-Plus 是 MyBatis 的增強工具,旨在簡化開發、提高效率并保持 MyBatis 的靈活性。本文將詳細介紹 MyBatis-Plus 的高級用法,幫助開發者最優化持久層開發。
一、MyBatis-Plus 簡介
MyBatis-Plus 是一個 ORM 框架,提供了 CRUD 接口、條件構造器、代碼生成器等功能,簡化了常見的持久層開發工作。
核心功能
- CRUD 接口:簡單的增刪改查操作。
- 條件構造器:動態生成 SQL 查詢條件。
- 分頁插件:簡化分頁查詢操作。
- 邏輯刪除:輕松實現軟刪除功能。
- 代碼生成器:自動生成實體類、Mapper 接口等代碼。
二、快速入門
1. 添加依賴
在 pom.xml
中添加 MyBatis-Plus 依賴:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3.4</version>
</dependency>
?
2. 配置數據源
在 application.yml
中配置數據源:
spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
?
3. 創建實體類
創建一個實體類 User
:
@Data
@TableName("user")
public class User {private Long id;private String name;private Integer age;private String email;
}
?
4. 創建 Mapper 接口
創建 Mapper 接口并繼承 BaseMapper
:
public interface UserMapper extends BaseMapper<User> {
}
?
5. 編寫服務類
編寫服務類使用 UserMapper
:
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public List<User> getAllUsers() {return userMapper.selectList(null);}
}
?
6. 編寫控制器
編寫控制器調用服務類:
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/list")public List<User> list() {return userService.getAllUsers();}
}
?
三、高級用法
1. 條件構造器
MyBatis-Plus 提供了 QueryWrapper
和 UpdateWrapper
用于動態構造查詢和更新條件。
1.1 QueryWrapper
QueryWrapper
用于構建查詢條件:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John");
List<User> users = userMapper.selectList(queryWrapper);
?
1.2 UpdateWrapper
UpdateWrapper
用于構建更新條件:
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("name", "John").set("age", 30);
userMapper.update(null, updateWrapper);
?
2. 分頁插件
分頁插件簡化了分頁查詢:
@Autowired
private UserMapper userMapper;public IPage<User> getUsersByPage(int pageNum, int pageSize) {Page<User> page = new Page<>(pageNum, pageSize);return userMapper.selectPage(page, null);
}
?
3. 邏輯刪除
邏輯刪除不刪除數據,只是標記為已刪除。首先在實體類中配置邏輯刪除字段:
@TableLogic
private Integer deleted;
?
在 application.yml
中啟用邏輯刪除:
mybatis-plus:global-config:db-config:logic-delete-value: 1logic-not-delete-value: 0
?
使用時直接調用 deleteById
方法即可:
userMapper.deleteById(1L);
?
4. 代碼生成器
代碼生成器自動生成實體類、Mapper 接口、Service 類和 Controller 類。以下是代碼生成器的簡單示例:
@Data
public class CodeGenerator {public static void main(String[] args) {AutoGenerator autoGenerator = new AutoGenerator();// 數據源配置DataSourceConfig dataSourceConfig = new DataSourceConfig();dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mydb");dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");dataSourceConfig.setUsername("root");dataSourceConfig.setPassword("root");autoGenerator.setDataSource(dataSourceConfig);// 包名配置PackageConfig packageConfig = new PackageConfig();packageConfig.setParent("com.example.demo");autoGenerator.setPackageInfo(packageConfig);// 策略配置StrategyConfig strategyConfig = new StrategyConfig();strategyConfig.setInclude("user"); // 表名strategyConfig.setNaming(NamingStrategy.underline_to_camel);strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);strategyConfig.setEntityLombokModel(true);autoGenerator.setStrategy(strategyConfig);autoGenerator.execute();}
}
?
5. 自定義 SQL 注入器
可以自定義 SQL 注入器,實現個性化需求。例如,添加一個批量插入的方法:
@Component
public class MySqlInjector extends AbstractSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass) {List<AbstractMethod> methodList = super.getMethodList(mapperClass);methodList.add(new InsertBatchSomeColumn());return methodList;}
}
?
四、最佳實踐
1. 分層架構
建議遵循分層架構,將控制器、服務、數據訪問層分開,提高代碼的可維護性。
2. 統一異常處理
使用 @ControllerAdvice
統一處理異常,提升系統的健壯性。
3. 使用事務管理
在服務層使用 @Transactional
注解管理事務,確保數據一致性:
@Transactional
public void updateUser(User user) {userMapper.updateById(user);
}
?
4. 性能優化
- 使用批量操作:對于大批量數據操作,使用 MyBatis-Plus 提供的批量操作接口,提高性能。
- 索引優化:確保數據庫中相關表和字段有適當的索引,提升查詢性能。
五、總結
MyBatis-Plus 通過簡化常見的持久層開發任務,提高了開發效率和代碼的可維護性。通過合理使用條件構造器、分頁插件、邏輯刪除和代碼生成器等高級功能,可以進一步優化持久層開發,提升系統性能和穩定性。