MyBatis-Plus作为MyBatis的增强工具包,在保留原生特性的基础上,提供了多项开箱即用的功能:
使用Spring Initializr创建项目时选择以下依赖:
# application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mp_demo?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
# MyBatis-Plus配置
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.global-config.db-config.id-type=assign_id
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
@Data
@TableName("t_user")
public class User {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String username;
private Integer age;
private String email;
@TableField("create_time")
private LocalDateTime createTime;
}
public interface UserMapper extends BaseMapper<User> {
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
public interface UserService extends IService<User> {
}
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
// 单个新增
@PostMapping
public Result addUser(@RequestBody User user) {
return Result.success(userService.save(user));
}
// 批量新增
@PostMapping("/batch")
public Result batchAdd(@RequestBody List<User> users) {
return Result.success(userService.saveBatch(users));
}
}
// 根据ID删除
@DeleteMapping("/{id}")
public Result deleteById(@PathVariable Long id) {
return Result.success(userService.removeById(id));
}
// 条件删除
@DeleteMapping
public Result deleteByCondition(@RequestBody Map<String, Object> params) {
QueryWrapper<User> wrapper = new QueryWrapper<>();
params.forEach((key, value) -> wrapper.eq(key, value));
return Result.success(userService.remove(wrapper));
}
// 全量更新
@PutMapping
public Result updateUser(@RequestBody User user) {
return Result.success(userService.updateById(user));
}
// 条件更新
@PatchMapping("/{id}")
public Result partialUpdate(@PathVariable Long id,
@RequestBody Map<String, Object> updates) {
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("id", id);
updates.forEach((key, value) -> wrapper.set(key, value));
return Result.success(userService.update(wrapper));
}
// ID查询
@GetMapping("/{id}")
public Result getById(@PathVariable Long id) {
return Result.success(userService.getById(id));
}
// 全量列表
@GetMapping
public Result listAll() {
return Result.success(userService.list());
}
// 条件构造器查询
@GetMapping("/search")
public Result searchUsers(@RequestParam String username,
@RequestParam Integer minAge) {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("username", username)
.ge("age", minAge)
.orderByDesc("create_time");
return Result.success(userService.list(wrapper));
}
@GetMapping("/page")
public Result pageQuery(@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer size) {
Page<User> pageParam = new Page<>(page, size);
return Result.success(userService.page(pageParam));
}
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
// 实现MetaObjectHandler
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
# 开启逻辑删除
mybatis-plus.global-config.db-config.logic-delete-field=deleted
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
@Bean
@Profile({"dev", "test"})
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor interceptor = new PerformanceInterceptor();
interceptor.setMaxTime(1000);
interceptor.setFormat(true);
return interceptor;
}
使用LambdaQueryWrapper避免硬编码字段名
LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
wrapper.like(User::getUsername, "Tom")
.ge(User::getAge, 18);
复杂查询建议使用XML映射文件
批量操作注意事务管理
定期检查MyBatis-Plus的版本更新
通过本文的整合实践,我们实现了SpringBoot与MyBatis-Plus的无缝对接,覆盖了日常开发中的常见场景。MyBatis-Plus的强大功能可以显著提升开发效率,但其设计哲学是只做增强不做改变,这保证了与原生MyBatis的良好兼容性。建议在实际项目中根据团队规范合理使用各种特性,在提高开发效率的同时保证代码质量。