1. SpringBoot与MySQL本地开发环境搭建实战
作为Java开发者最常用的技术组合之一,SpringBoot与MySQL的整合几乎成为每个项目的标配。但看似简单的数据库连接背后,藏着不少新手容易踩的坑。最近在帮团队新人排查一个诡异的"连接超时"问题时,发现80%的初级问题其实都源于基础配置不当。本文将基于最新SpringBoot 3.x和MySQL 8.0,手把手演示从零开始的完整配置流程。
1.1 环境准备清单
开发环境建议采用以下组合:
- JDK 17(SpringBoot 3.x最低要求)
- MySQL Community Server 8.0.33
- IntelliJ IDEA 2023.2
- SpringBoot 3.1.0
- MyBatis 3.0.2
注意:MySQL 8.x默认使用caching_sha2_password认证插件,与旧版本mysql_native_password不兼容,这是导致连接失败的常见原因
1.2 MySQL安装关键步骤
- 官网下载MySQL Installer时选择"Developer Default"模式
- 配置界面务必记录初始root密码
- 在Authentication Method步骤选择:
- Use Strong Password Encryption (SHA256)
- 安装完成后创建测试数据库:
sql复制CREATE DATABASE demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 项目配置深度解析
2.1 pom.xml关键依赖
除了基础的spring-boot-starter-web,数据库相关依赖需要特别注意版本兼容性:
xml复制<dependencies>
<!-- 数据库核心依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- MyBatis整合包 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
</dependencies>
2.2 application.yml最佳实践
推荐使用YAML格式配置,比properties文件更清晰:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 10
connection-timeout: 30000
mybatis:
mapper-locations: classpath:mapper/*.xml
configuration:
map-underscore-to-camel-case: true
踩坑提醒:MySQL 8.x必须指定serverTimezone参数,否则会报时区错误。生产环境建议使用useSSL=true并配置证书
3. MyBatis整合实战技巧
3.1 实体类与Mapper设计
采用领域驱动设计思想,先创建用户实体:
java复制@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String email;
@TableField("create_time")
private LocalDateTime createTime;
}
Mapper接口建议添加@MapperScan注解批量扫描:
java复制@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User selectById(@Param("id") Long id);
@Insert("INSERT INTO user(username,email) VALUES(#{user.username},#{user.email})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(@Param("user") User user);
}
3.2 动态SQL高级用法
在复杂的查询场景中,XML映射文件更能体现MyBatis的优势:
xml复制<!-- src/main/resources/mapper/UserMapper.xml -->
<select id="selectByCondition" resultType="User">
SELECT * FROM user
<where>
<if test="username != null">
AND username LIKE CONCAT('%',#{username},'%')
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
ORDER BY create_time DESC
</select>
4. 连接池优化与监控
4.1 HikariCP参数调优
SpringBoot默认使用HikariCP连接池,关键参数需要根据服务器配置调整:
yaml复制spring:
datasource:
hikari:
minimum-idle: 5
maximum-pool-size: 20
idle-timeout: 600000
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
4.2 监控方案实现
通过SpringBoot Actuator暴露数据源健康状态:
-
添加依赖:
xml复制<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> -
配置端点暴露:
yaml复制management: endpoints: web: exposure: include: health,info,metrics endpoint: health: show-details: always -
访问
/actuator/health可查看数据库连接状态
5. 高频问题排查指南
5.1 连接超时问题
现象:Communications link failure错误
排查步骤:
- 检查MySQL服务是否启动
bash复制sudo systemctl status mysql - 验证网络连通性
bash复制
telnet localhost 3306 - 检查用户权限
sql复制SELECT host, user FROM mysql.user; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
5.2 时区异常处理
报错:The server time zone value 'xxx' is unrecognized
解决方案:
- 临时方案:JDBC URL添加时区参数
code复制serverTimezone=Asia/Shanghai - 永久方案:修改MySQL全局时区
sql复制SET GLOBAL time_zone = '+8:00';
5.3 MyBatis映射异常
常见错误:Invalid bound statement (not found)
检查清单:
- 确认mapper.xml文件是否在
resources/mapper目录 - 检查
application.yml中mybatis.mapper-locations配置 - 确保Mapper接口有
@Mapper注解或被@MapperScan扫描
6. 性能优化实战
6.1 索引优化建议
对于用户表的查询优化示例:
sql复制-- 添加复合索引
ALTER TABLE user ADD INDEX idx_username_email (username, email);
-- 使用EXPLAIN分析查询
EXPLAIN SELECT * FROM user WHERE username LIKE '张%';
6.2 批量操作技巧
使用MyBatis的批量插入提升性能:
java复制@Insert("<script>" +
"INSERT INTO user(username, email) VALUES " +
"<foreach collection='list' item='item' separator=','>" +
"(#{item.username}, #{item.email})" +
"</foreach>" +
"</script>")
void batchInsert(@Param("list") List<User> users);
6.3 二级缓存配置
在MyBatis中启用二级缓存:
-
全局开启缓存:
yaml复制mybatis: configuration: cache-enabled: true -
在Mapper接口添加注解:
java复制@CacheNamespace public interface UserMapper { //... } -
实体类实现Serializable接口
7. 安全加固方案
7.1 密码加密存储
使用Spring Security的密码编码器:
java复制@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
// 使用示例
String encodedPassword = passwordEncoder.encode("明文密码");
7.2 SQL注入防护
-
永远使用参数化查询:
java复制// 错误示范 @Select("SELECT * FROM user WHERE username = '" + username + "'") // 正确做法 @Select("SELECT * FROM user WHERE username = #{username}") -
禁用${}方式拼接SQL
-
使用MyBatis的
<where>标签自动处理AND条件
8. 扩展功能集成
8.1 MyBatis-Plus整合
简化CRUD操作的最佳实践:
-
添加依赖:
xml复制<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> -
继承BaseMapper:
java复制public interface UserMapper extends BaseMapper<User> { // 自定义方法 } -
分页查询示例:
java复制Page<User> page = new Page<>(1, 10); userMapper.selectPage(page, Wrappers.<User>query() .like("username", "张"));
8.2 多数据源配置
应对分库分表场景的配置方案:
java复制@Configuration
@MapperScan(basePackages = "com.demo.mapper.db1", sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class Db1DataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.db1")
public DataSource db1DataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionTemplate db1SqlSessionTemplate(
@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
return new SqlSessionTemplate(factory.getObject());
}
}
9. 测试策略保障
9.1 单元测试方案
使用SpringBootTest进行集成测试:
java复制@SpringBootTest
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
@Transactional
@Rollback
void testInsert() {
User user = new User();
user.setUsername("test");
user.setEmail("test@demo.com");
assertEquals(1, userMapper.insert(user));
assertNotNull(user.getId());
}
}
9.2 测试容器技术
使用Testcontainers实现真实数据库测试:
java复制@Testcontainers
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class IntegrationTest {
@Container
static MySQLContainer<?> mysql = new MySQLContainer<>("mysql:8.0");
@DynamicPropertySource
static void configureProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", mysql::getJdbcUrl);
registry.add("spring.datasource.username", mysql::getUsername);
registry.add("spring.datasource.password", mysql::getPassword);
}
// 测试方法...
}
10. 生产环境建议
10.1 连接池监控
推荐使用Druid连接池替代HikariCP以获得更全面的监控:
xml复制<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.16</version>
</dependency>
配置监控页面:
yaml复制spring:
datasource:
druid:
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: admin
10.2 慢SQL监控
开启MySQL慢查询日志:
ini复制# my.cnf配置
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
结合MyBatis拦截器实现应用层监控:
java复制@Intercepts(@Signature(type= StatementHandler.class,
method="query", args={Statement.class, ResultHandler.class}))
public class SlowSqlInterceptor implements Interceptor {
private static final long THRESHOLD = 1000; // 1秒
@Override
public Object intercept(Invocation invocation) throws Throwable {
long start = System.currentTimeMillis();
Object result = invocation.proceed();
long elapsed = System.currentTimeMillis() - start;
if(elapsed > THRESHOLD) {
StatementHandler handler = (StatementHandler) invocation.getTarget();
log.warn("慢SQL检测: {}ms - {}", elapsed, handler.getBoundSql().getSql());
}
return result;
}
}
在实际项目部署中,建议将数据库连接配置外移到配置中心,采用Vault等工具管理敏感信息,并通过Flyway或Liquibase管理数据库变更。对于高并发场景,还需要考虑引入读写分离、分库分表等架构方案。
