3、项目初始化:使用Spring Boot + MyBatis Plus搭建项目骨架,配置数据源与日志

好,咱们正式开始动手了。

这一章,说白了就是搭地基。地基稳不稳,直接决定后面几十层楼会不会歪。我见过太多项目,前期图快随便搞个脚手架,结果后面改数据源、调日志、加拦截器,改得想哭。所以这一章,咱们一步一个脚印,把骨架搭结实。

3.1 为什么选Spring Boot + MyBatis Plus?

你可能会问:现在微服务这么火,为什么不直接上Spring Cloud?

我的回答很简单:客户生命周期管理系统,核心是业务逻辑,不是架构炫技。 Spring Boot足够轻量,MyBatis Plus能帮我们省掉80%的CRUD模板代码。我个人习惯是,先让项目跑起来,再考虑拆分和扩展。

我记得有一次,团队里一个小伙子一上来就搞了十几个微服务,结果连个用户登录都调了半天。嗯,后来我让他全部推倒,从Spring Boot单体应用开始,两天就交付了核心功能。所以,别迷信“大而全”,适合当前阶段的才是最好的。

核心选型理由:
  • Spring Boot:自动配置、内嵌Tomcat、生产就绪
  • MyBatis Plus:代码生成器、分页插件、Lambda查询,开发效率翻倍
  • HikariCP:Spring Boot默认数据源,性能极佳,号称“史上最快连接池”

3.2 初始化Spring Boot项目

我建议直接用 Spring Initializrstart.spring.io)生成,别自己手写pom.xml,容易漏依赖。

关键依赖如下:

<!-- 核心起步器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- MyBatis Plus(注意用最新稳定版) -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

<!-- MySQL驱动 -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- Lombok(省去getter/setter,我必加) -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
避坑指南: 我曾经因为MyBatis Plus版本和Spring Boot 3.x不兼容,导致启动报错“NoClassDefFoundError”。后来发现,Spring Boot 3.x必须用MyBatis Plus 3.5.3+。所以,版本号一定要对上

3.3 配置数据源——这一步最容易踩坑

数据源配置,说白了就是告诉程序:“你的数据库在哪,用户名密码是什么”。

我个人习惯用 application.yml,比properties更清晰。来看一个典型配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/crm?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver
    # HikariCP连接池配置(我一般只调这两个)
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5

mybatis-plus:
  configuration:
    # 开启驼峰命名映射(user_name -> userName)
    map-underscore-to-camel-case: true
    # 打印SQL日志(开发阶段必开)
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      # 逻辑删除(后面章节会细讲)
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0

你想想看,这里最容易出什么问题?

  • 时区问题: 不加 serverTimezone=Asia/Shanghai,插入时间可能差8小时。我踩过这个坑,排查了整整一下午。
  • 驱动类名: 新版本MySQL驱动是 com.mysql.cj.jdbc.Driver,老版本是 com.mysql.jdbc.Driver。别搞混了。
  • 连接池大小: 不是越大越好。我一般按“核心线程数*2”来估算,20够用了。

3.4 配置日志——别等出问题了才想起来

日志这东西,平时觉得没用,一出线上bug你就知道它的好了。我曾经有一次,客户说系统慢,我打开日志一看,发现有个SQL执行了8秒——嗯,少了个索引。

我推荐用 Logback(Spring Boot默认),配合 SLF4J 接口。配置如下:

# application.yml 中设置日志级别
logging:
  level:
    # 打印MyBatis的SQL日志(重要!)
    com.baomidou.mybatisplus: debug
    # 自己项目的包,建议从info开始
    com.yourcompany.crm: info
  file:
    # 日志文件路径(生产环境一定要配)
    name: logs/crm.log
    # 单个文件最大100MB,保留30天
    max-size: 100MB
    max-history: 30
注意: 生产环境千万别把 log-impl 设为 StdOutImpl,否则所有SQL都会打印到控制台,性能会受影响。我一般用 org.apache.ibatis.logging.slf4j.Slf4jImpl,配合日志级别控制。

3.5 验证项目是否启动成功

配置完了,咱们得跑一下看看。写一个简单的启动类:

@SpringBootApplication
@MapperScan("com.yourcompany.crm.mapper")
public class CrmApplication {
    public static void main(String[] args) {
        SpringApplication.run(CrmApplication.class, args);
    }
}

启动后,看到类似下面的日志,就说明成功了:

2024-01-15 10:30:00.123  INFO 12345 --- [main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2024-01-15 10:30:00.456  INFO 12345 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http)
2024-01-15 10:30:00.789  INFO 12345 --- [main] com.yourcompany.crm.CrmApplication       : Started CrmApplication in 3.456 seconds

如果启动报错,别慌。90%的情况是:

  • 数据库没连上(检查URL、用户名、密码)
  • 端口被占用(换个端口,或者杀掉占用进程)
  • 依赖版本冲突(看看控制台有没有红色异常栈)

3.6 项目骨架结构一览

初始化完成后,我习惯这样组织包结构:

包名 作用 举例
controller 接收HTTP请求,返回结果 CustomerController
service 业务逻辑层 CustomerService
mapper 数据库操作接口 CustomerMapper
entity 数据库表对应的实体类 Customer
config 配置类(拦截器、跨域等) MyBatisPlusConfig
common 公共工具类、统一返回结果 Result, PageResult

这个结构,我用了五六年了。小项目够用,大项目也能平滑扩展。你想想看,如果一开始就搞什么DDD分层、六边形架构,新手直接懵了。咱们先跑起来,后面再重构,不丢人。

3.7 本章小结

这一章,咱们干了三件事:

  1. 用Spring Initializr生成了项目,加了核心依赖
  2. 配置了MySQL数据源和HikariCP连接池
  3. 配好了Logback日志,并验证了启动

嗯,到这里,骨架已经搭好了。下一章,咱们开始写第一个实体类和CRUD接口。到时候你会发现,MyBatis Plus的代码生成器有多香。

我的小建议: 把今天的配置保存成一个模板项目。以后每次新开项目,直接复制改改数据库名就行。我自己的GitHub上就有一个这样的模板,省了不少时间。