1. 环境准备与工具选型
在开始构建SpringBoot3 + MyBatis-Plus项目之前,我们需要确保开发环境配置正确。我推荐使用以下组合:
- IntelliJ IDEA 2023.3.5:目前最稳定的版本,对SpringBoot3支持完善
- JDK 17:SpringBoot3的最低要求版本,推荐使用Amazon Corretto 17
- MySQL 8.0.27+:完全兼容MyBatis-Plus的最新特性
注意:如果使用其他版本的MySQL连接器,需要特别注意与SpringBoot3的兼容性问题。我遇到过MySQL 8.0.23与SpringBoot3.1.0的时区处理异常,最终通过升级驱动解决。
2. 创建SpringBoot工程的两种方式
2.1 使用Spring Initializr自动创建(推荐新手)
在IDEA中通过Spring Initializr创建项目是最快捷的方式:
- 选择File → New → Project → Spring Initializr
- 关键配置项:
- Type: Maven Project
- Language: Java
- Packaging: Jar
- Java Version: 17
- 依赖选择:
- 必须勾选Spring Web
- 建议勾选Lombok(后续会用到)
创建完成后,pom.xml会自动包含基础依赖。我建议立即执行以下操作:
mvn clean install这个步骤可以验证项目是否能够正常构建,避免后续添加依赖后出现隐藏的构建问题。
2.2 手动创建Maven项目(适合进阶用户)
对于需要更精细控制的项目,可以手动创建:
- 创建标准Maven项目(选择maven-archetype-quickstart)
- 在pom.xml中添加SpringBoot父依赖:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.4.1</version> </parent>- 添加基础依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>手动创建时最容易忽略的是资源目录的配置。必须确保:
- src/main/resources目录存在
- application.properties/yml文件位置正确
3. MyBatis-Plus整合详解
3.1 依赖配置关键点
在pom.xml中添加以下核心依赖:
<!-- MyBatis-Plus SpringBoot3专用starter --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.8</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>特别注意:SpringBoot3必须使用mybatis-plus-spring-boot3-starter,常规的mybatis-plus-boot-starter不兼容。
3.2 数据库配置最佳实践
推荐使用YAML格式配置,更清晰易读:
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志关键配置说明:
- 必须指定serverTimezone,否则可能遇到时区异常
- 建议开启SQL日志,方便调试
3.3 实体类与Mapper设计
使用Lombok简化实体类:
@Data @TableName("dept") // 显式指定表名 public class Dept { @TableId(type = IdType.AUTO) // 主键自增 private Integer id; private String name; private Integer age; private String sex; private String address; }Mapper接口只需简单继承:
@Mapper public interface DeptMapper extends BaseMapper<Dept> { // 无需任何方法,基础CRUD已由MyBatis-Plus提供 }经验:即使表字段与实体属性命名规范一致(如user_name → userName),也建议使用@TableField注解显式映射,避免后期表结构调整导致问题。
4. 服务层与控制器实现
4.1 服务层架构
采用接口+实现类的标准模式:
public interface DeptService extends IService<Dept> { // 可扩展自定义方法 } @Service public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements DeptService { // 实现类只需继承ServiceImpl即可获得完整CRUD能力 }4.2 控制器设计
RESTful风格控制器示例:
@RestController @RequestMapping("/api/dept") public class DeptController { @Autowired private DeptService deptService; @GetMapping public Result<List<Dept>> listAll() { return Result.success(deptService.list()); } @GetMapping("/{id}") public Result<Dept> getById(@PathVariable Integer id) { return Result.success(deptService.getById(id)); } }建议统一返回封装对象(如Result ),便于前端处理。
5. 常见问题排查指南
5.1 启动时报错"Failed to configure a DataSource"
可能原因:
- 数据库配置错误
- 依赖冲突
解决方案:
- 检查application.yml缩进(YAML对缩进敏感)
- 执行mvn dependency:tree检查依赖冲突
5.2 MyBatis-Plus方法不生效
典型表现:
- 调用baseMapper方法无效果
- SQL日志未打印
检查步骤:
- 确认Mapper接口有@Mapper注解
- 确认启动类有@MapperScan("com.xxx.mapper")
- 检查实体类@TableName配置
5.3 分页查询失效
必须添加分页插件:
@Configuration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } }6. 项目结构优化建议
标准项目结构示例:
src/main/java ├── com.example.demo │ ├── config # 配置类 │ ├── controller # 控制器 │ ├── entity # 实体类 │ ├── mapper # Mapper接口 │ ├── service # 服务接口 │ │ └── impl # 服务实现 │ └── DemoApplication.java src/main/resources ├── application.yml └── mapper # XML映射文件(可选)对于复杂项目,建议:
- 按业务模块分包
- 分离API和实现
- 使用DTO隔离实体与视图
7. 高级特性探索
7.1 自动填充功能
实现元数据自动填充:
@TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime;需要配置填充处理器:
@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()); } }7.2 逻辑删除配置
application.yml配置:
mybatis-plus: global-config: db-config: logic-delete-field: deleted # 逻辑删除字段名 logic-not-delete-value: 0 # 未删除值 logic-delete-value: 1 # 删除值实体类添加字段:
@TableLogic private Integer deleted;8. 性能优化建议
- 连接池配置:
spring: datasource: hikari: maximum-pool-size: 20 connection-timeout: 30000- 二级缓存:
@Configuration @EnableCaching public class CacheConfig { @Bean public RedisCacheManager cacheManager(RedisConnectionFactory factory) { // Redis缓存配置 } }- 批量操作:
// 使用Service的saveBatch方法 deptService.saveBatch(deptList, 1000); // 每批1000条9. 测试策略
9.1 单元测试示例
@SpringBootTest class DeptMapperTest { @Autowired private DeptMapper deptMapper; @Test void testSelect() { Dept dept = deptMapper.selectById(1); Assertions.assertNotNull(dept); } }9.2 集成测试建议
- 使用@Testcontainers进行数据库测试
- 配置独立的测试数据库
- 使用@Transactional实现测试回滚
10. 部署注意事项
- 打包插件配置:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>- 生产环境配置:
- 禁用开发工具(devtools)
- 关闭SQL日志
- 使用JVM参数调优
- 健康检查端点:
management: endpoints: web: exposure: include: health,info经过多个项目的实践验证,这套技术栈组合在开发效率和运行性能上取得了很好的平衡。特别是在快速迭代的业务场景中,MyBatis-Plus的自动化CRUD能力可以节省大量重复编码时间。对于复杂查询,仍然可以通过自定义XML映射文件实现灵活控制。