跳到主要内容
版本:1.0

连接数据库(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-nameurl 示例
MySQL 8com.mysql.cj.jdbc.Driverjdbc:mysql://host:3306/db
PostgreSQLorg.postgresql.Driverjdbc:postgresql://host:5432/db
Oracleoracle.jdbc.OracleDriverjdbc:oracle:thin:@host:1521:sid
SQL Servercom.microsoft.sqlserver.jdbc.SQLServerDriverjdbc: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