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 Initializr(start.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>
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 本章小结
这一章,咱们干了三件事:
- 用Spring Initializr生成了项目,加了核心依赖
- 配置了MySQL数据源和HikariCP连接池
- 配好了Logback日志,并验证了启动
嗯,到这里,骨架已经搭好了。下一章,咱们开始写第一个实体类和CRUD接口。到时候你会发现,MyBatis Plus的代码生成器有多香。