连接数据库(DataSource 与 JdbcTemplate)
Spring Boot 连接数据库只需要两步:引入依赖 + 写好配置,数据源的创建和连接池管理全部由自动装配完成。本篇讲清底层机制,并介绍最直接的 SQL 操作方式 JdbcTemplate。
第一步:引入依赖
<!-- MySQL 驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!-- Spring JDBC(含 JdbcTemplate) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
spring-boot-starter-jdbc 会连带引入 HikariCP 连接池(Spring Boot 默认连接池,性能优异)。
第二步:配置数据源
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: ${DB_PASSWORD} # 生产环境用环境变量
driver-class-name: com.mysql.cj.jdbc.Driver
hikari: # HikariCP 连接池调优
maximum-pool-size: 20 # 最大连接数
minimum-idle: 5 # 最小空闲连接
connection-timeout: 30000 # 获取连接超时(ms)
idle-timeout: 600000 # 空闲连接存活时间
max-lifetime: 1800000 # 连接最大生命周期
只要 spring.datasource.* 配置存在,DataSourceAutoConfiguration 就会自动创建 DataSource Bean 和 JdbcTemplate Bean,无需手写任何配置类。
底层发生了什么
classpath 存在 HikariCP + MySQL 驱动
→ @ConditionalOnClass 满足
→ DataSourceAutoConfiguration 生效
→ 读取 spring.datasource.* 创建 HikariDataSource
→ JdbcTemplateAutoConfiguration 创建 JdbcTemplate
→ 直接注入使用
其他数据库配置速查
| 数据库 | driver-class-name | url 示例 |
|---|---|---|
| MySQL 8 | com.mysql.cj.jdbc.Driver | jdbc:mysql://host:3306/db |
| PostgreSQL | org.postgresql.Driver | jdbc:postgresql://host:5432/db |
| Oracle | oracle.jdbc.OracleDriver | jdbc:oracle:thin:@host:1521:sid |
| SQL Server | com.microsoft.sqlserver.jdbc.SQLServerDriver | jdbc:sqlserver://host:1433;databaseName=db |
使用 JdbcTemplate 操作数据库
JdbcTemplate 是 Spring 对 JDBC 的封装,不用手动管理连接、Statement、ResultSet:
@Repository
public class UserDao {
private final JdbcTemplate jdbcTemplate;
public UserDao(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
// 查询单条
public User findById(Long id) {
String sql = "SELECT id, username, email, age FROM user WHERE id = ?";
return jdbcTemplate.queryForObject(sql, userRowMapper(), id);
}
// 查询列表
public List<User> findAll() {
return jdbcTemplate.query("SELECT * FROM user", userRowMapper());
}
// 新增(返回影响行数)
public int insert(User user) {
String sql = "INSERT INTO user(username, email, age) VALUES (?, ?, ?)";
return jdbcTemplate.update(sql, user.getUsername(), user.getEmail(), user.getAge());
}
// 更新 / 删除同样用 update
public int deleteById(Long id) {
return jdbcTemplate.update("DELETE FROM user WHERE id = ?", id);
}
// 行映射器:ResultSet → User
private RowMapper<User> userRowMapper() {
return (rs, rowNum) -> {
User u = new User();
u.setId(rs.getLong("id"));
u.setUsername(rs.getString("username"));
u.setEmail(rs.getString("email"));
u.setAge(rs.getInt("age"));
return u;
};
}
}
常用方法速查:
| 方法 | 用途 |
|---|---|
queryForObject(sql, mapper, args) | 查单条 |
query(sql, mapper, args) | 查列表 |
queryForMap / queryForList | 不想写实体时的临时查询 |
update(sql, args) | 增删改,返回影响行数 |
batchUpdate(sql, batchArgs) | 批量操作 |
打印 SQL 日志(调试用)
logging:
level:
org.springframework.jdbc.core: debug
什么时候不够用
JdbcTemplate 适合简单场景和学习理解原理。当 SQL 复杂、需要动态拼接、ORM 映射时,应上真正的持久层框架:
- MyBatis / MyBatis-Plus:SQL 可控、国内主流 → 见整合 MyBatis
- Spring Data JPA:面向对象、零 SQL 快速开发 → 见整合 JPA