springboot mybatis-plus(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在现代 Java 开发中,Spring Boot 和 MyBatis-Plus 的组合已成为快速构建企业级应用的热门选择。Spring Boot 通过简化配置和依赖管理,让开发者更专注于业务逻辑;而 MyBatis-Plus 则通过增强 MyBatis 的功能,提供了更高效的数据操作能力。本文将从基础概念到实战案例,逐步讲解如何利用 Spring Boot MyBatis-Plus 快速搭建高可用的数据库交互层。
一、环境搭建与快速入门
1.1 项目初始化
首先需要创建一个 Spring Boot 项目。通过 Spring Initializr 选择以下依赖:
- Spring Web:提供 RESTful API 支持
- Spring Data JPA(可选,用于对比 MyBatis-Plus)
- MySQL Driver:数据库驱动
在 pom.xml
中添加 MyBatis-Plus 依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
1.2 数据库配置
在 application.properties
中配置数据库连接:
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
mybatis-plus.mapper-locations=classpath:mapper/*.xml
1.3 快速验证
创建一个简单的 UserController
:
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/users")
public List<User> list() {
return userMapper.selectList(null);
}
}
通过访问 /users
接口即可验证 MyBatis-Plus 是否正常工作。
二、核心功能详解
2.1 自动化配置
MyBatis-Plus 通过 @MapperScan
注解自动扫描 Mapper 接口,无需手动编写 XML 配置。例如:
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisPlusConfig {
}
这类似于 Spring 的自动装配机制,减少了开发者的手动配置工作量。
2.2 魔法方法(Magic Methods)
MyBatis-Plus 提供了 20+ 通用方法,覆盖常见的 CRUD 操作:
| 方法名 | 作用 |
|-----------------------|--------------------------------|
| selectById(id)
| 根据主键查询单条记录 |
| insert(entity)
| 插入单条记录 |
| updateById(entity)
| 根据主键更新记录 |
| deleteById(id)
| 根据主键删除记录 |
示例:
// 插入一条用户数据
User user = new User();
user.setName("John Doe");
userMapper.insert(user);
2.3 条件构造器(QueryWrapper)
通过 QueryWrapper
可以灵活构建动态查询条件:
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("age", 18).ge("score", 90);
List<User> list = userMapper.selectList(wrapper);
这里 eq
表示等于,ge
表示大于等于,类似乐高积木,可自由拼接条件。
三、代码生成器:解放生产力
3.1 一键生成代码
MyBatis-Plus 提供了代码生成器 AutoGenerator
,可自动生成实体类、Mapper、Service 等代码。例如:
AutoGenerator generator = new AutoGenerator();
generator.setDataSource(new DataSourceConfig()
.setUrl("jdbc:mysql://localhost:3306/test"));
generator.setGlobalConfig(new GlobalConfig().setOutputDir("src/main/java"));
generator.execute();
运行后,系统会根据数据库表结构自动生成代码,极大提升开发效率。
3.2 生成代码的结构优化
通过配置 FileOverride
可以覆盖已有文件,避免重复生成:
GlobalConfig gc = new GlobalConfig();
gc.setFileOverride(true);
generator.setGlobalConfig(gc);
四、分页与性能优化
4.1 分页插件(PageHelper)
MyBatis-Plus 支持分页插件 PageHelper
,只需简单配置即可实现分页查询:
Page<User> page = new Page<>(1, 10);
userMapper.selectPage(page, new QueryWrapper<User>().gt("age", 20));
返回的 Page
对象包含总记录数、当前页数据等信息,方便前端分页展示。
4.2 逻辑删除
通过 @TableLogic
注解实现软删除,避免直接删除数据:
@Data
public class User {
@TableId
private Long id;
@TableLogic
private Integer deleted; // 0=未删除,1=已删除
}
使用 selectList()
时,会自动过滤 deleted=1
的记录。
五、实战案例:用户权限系统
5.1 需求分析
设计一个简单的用户权限系统,包含以下功能:
- 用户注册与登录
- 角色管理(管理员、普通用户)
- 权限控制(基于角色的接口访问限制)
5.2 数据库设计
创建 user
和 role
表:
CREATE TABLE `user` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL UNIQUE,
`password` VARCHAR(100) NOT NULL,
`role_id` BIGINT NOT NULL,
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE `role` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL UNIQUE
);
5.3 实现角色关联
通过 @TableField
注解关联 role
表:
@Data
public class User {
private Long id;
private String username;
private String password;
@TableField(exist = false)
private Role role; // 非数据库字段,用于存储关联对象
}
5.4 权限控制拦截器
通过 HandlerInterceptor
实现角色校验:
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
String role = ((User) request.getSession().getAttribute("user")).getRole().getName();
if (!role.equals("admin") && request.getRequestURI().contains("/admin")) {
response.sendRedirect("/login");
return false;
}
return true;
}
}
六、进阶特性与最佳实践
6.1 动态数据源
通过 DynamicDataSource
实现读写分离:
@Configuration
public class DataSourceConfig {
@Bean
public DynamicDataSource dynamicDataSource() {
DynamicDataSource dataSource = new DynamicDataSource();
dataSource.setTargetDataSources(
Map.of(
"master", masterDataSource(),
"slave", slaveDataSource()
)
);
return dataSource;
}
}
6.2 缓存优化
结合 Redis 缓存高频查询数据:
@Cacheable(value = "user", key = "#id")
public User getUserById(Long id) {
return userMapper.selectById(id);
}
6.3 异常处理统一化
通过 @ControllerAdvice
捕获全局异常:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(EntityNotFoundException.class)
public ResponseEntity<String> handleEntityNotFound() {
return ResponseEntity.status(404).body("Resource not found");
}
}
结论
通过本文的讲解,开发者可以掌握 Spring Boot MyBatis-Plus 的核心功能与实战技巧。无论是快速搭建基础项目,还是实现复杂业务场景,MyBatis-Plus 的自动化特性与扩展性都能显著提升开发效率。建议读者通过实际项目不断实践,并参考官方文档探索更多高级功能。记住,技术的掌握需要结合实践,不断优化代码结构,才能真正发挥框架的优势。
如果对本文中的案例或代码有疑问,欢迎在评论区留言讨论!