使用 IntelliJ IDEA + Spring JdbcTemplate 操作 MySQL 完全指南
一、开发环境搭建(基于 IDEA)
1. 创建 Spring Boot 项目
- 打开 IDEA → New Project → Spring Initializr
- 选择:
- Project SDK: Java 17+
- 依赖项:Spring Web, Spring Data JDBC, MySQL Driver
2. 手动添加依赖
2.1 手动添加 MySQL 依赖示例
<!-- pom.xml -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
3. 准备 MySQL 数据库
-- 执行以下 SQL 创建数据库和表
CREATE DATABASE spring_jdbc_demo;
USE spring_jdbc_demo;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
4. 配置数据源
# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/spring_jdbc_demo?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
二、基础 CRUD 操作
1. 实体类定义
public class User {
private Integer id;
private String name;
private String email;
private LocalDateTime createdAt;
// 省略构造函数、getter/setter、toString
}
2. 插入数据(Auto Increment 处理)
@Repository
public class UserRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
public int insert(User user) {
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
return jdbcTemplate.update(sql, user.getName(), user.getEmail());
}
// 获取自增主键
public Integer insertAndReturnId(User user) {
SimpleJdbcInsert insert = new SimpleJdbcInsert(jdbcTemplate)
.withTableName("users")
.usingGeneratedKeyColumns("id");
return insert.executeAndReturnKey(user.toMap()).intValue();
}
}
3. 查询数据
// 使用 BeanPropertyRowMapper 自动映射
public List<User> findAll() {
return jdbcTemplate.query(
"SELECT id, name, email, created_at as createdAt FROM users",
new BeanPropertyRowMapper<>(User.class)
);
}
// 带条件查询
public Optional<User> findById(int id) {
try {
return Optional.ofNullable(jdbcTemplate.queryForObject(
"SELECT * FROM users WHERE id = ?",
new Object[]{id},
(rs, rowNum) -> new User(
rs.getInt("id"),
rs.getString("name"),
rs.getString("email"),
rs.getTimestamp("created_at").toLocalDateTime()
)
));
} catch (EmptyResultDataAccessException e) {
return Optional.empty();
}
}
4. 更新与删除
public int updateEmail(int id, String newEmail) {
return jdbcTemplate.update(
"UPDATE users SET email = ? WHERE id = ?",
newEmail, id
);
}
public int deleteById(int id) {
return jdbcTemplate.update(
"DELETE FROM users WHERE id = ?",
id
);
}
三、高级功能实现
1. 批量操作(提升性能)
public int[] batchInsert(List<User> users) {
return jdbcTemplate.batchUpdate(
"INSERT INTO users (name, email) VALUES (?, ?)",
new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setString(1, users.get(i).getName());
ps.setString(2, users.get(i).getEmail());
}
public int getBatchSize() {
return users.size();
}
}
);
}
2. 事务管理实战
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void transferEmail(int fromId, int toId) {
User fromUser = userRepository.findById(fromId).orElseThrow();
User toUser = userRepository.findById(toId).orElseThrow();
userRepository.updateEmail(fromId, "old_" + fromUser.getEmail());
userRepository.updateEmail(toId, fromUser.getEmail());
}
}
3. 使用 NamedParameterJdbcTemplate
@Repository
public class UserNamedRepository {
private final NamedParameterJdbcTemplate namedTemplate;
public UserNamedRepository(DataSource dataSource) {
this.namedTemplate = new NamedParameterJdbcTemplate(dataSource);
}
public List<User> findByName(String name) {
MapSqlParameterSource params = new MapSqlParameterSource()
.addValue("name", "%" + name + "%");
return namedTemplate.query(
"SELECT * FROM users WHERE name LIKE :name",
params,
new BeanPropertyRowMapper<>(User.class)
);
}
}
四、IDEA 高效开发技巧
1. 数据库连接配置
- 打开 IDEA Database 面板(右侧边栏)
- 添加 MySQL 数据源 → 填写连接信息
- 开启自动同步功能(方便查看表结构变化)
2. SQL 语句验证
- 在代码中的 SQL 字符串上按
Alt+Enter
→Inject language or reference
→ 选择 SQL - 获得语法高亮和自动提示功能
3. 快速测试方法
- 在方法上右键 →
Run 'methodName()'
(需安装 JUnit) - 使用 Spring Boot Test 编写单元测试
五、常见问题排查
1. 时区问题解决方案
# 在连接字符串中添加时区参数
url: jdbc:mysql://localhost:3306/dbname?serverTimezone=Asia/Shanghai
2. 连接池配置优化
spring:
datasource:
hikari:
maximum-pool-size: 10
connection-timeout: 30000
idle-timeout: 600000
3. 中文乱码处理
url: jdbc:mysql://localhost:3306/dbname?characterEncoding=utf8
六、项目结构推荐
src/main/java
├── com.example.demo
│ ├── config # 配置类
│ ├── controller # 控制器
│ ├── model # 实体类
│ ├── repository # 数据访问层
│ └── service # 业务逻辑层
resources
├── sql # SQL脚本存放目录
└── application.yml
七、学习资源推荐
- 官方文档:Spring Framework Data Access
- 调试技巧:IDEA 的 Database 工具 + HTTP Client 测试 API
- 扩展学习:Spring Data JPA 对比学习
完整示例项目:
GitHub 仓库链接
(包含单元测试、API 示例和 SQL 脚本)# 使用 IntelliJ IDEA + Spring JdbcTemplate 操作 MySQL 完全指南
一、开发环境搭建(基于 IDEA)
1. 创建 Spring Boot 项目
- 打开 IDEA → New Project → Spring Initializr
- 选择:
- Project SDK: Java 17+
- 依赖项:Spring Web, Spring Data JDBC, MySQL Driver
2. 添加 MySQL 依赖
<!-- pom.xml -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
3. 准备 MySQL 数据库
-- 执行以下 SQL 创建数据库和表
CREATE DATABASE spring_jdbc_demo;
USE spring_jdbc_demo;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
4. 配置数据源
# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/spring_jdbc_demo?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
二、基础 CRUD 操作
1. 实体类定义
public class User {
private Integer id;
private String name;
private String email;
private LocalDateTime createdAt;
// 省略构造函数、getter/setter、toString
}
2. 插入数据(Auto Increment 处理)
@Repository
public class UserRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
public int insert(User user) {
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
return jdbcTemplate.update(sql, user.getName(), user.getEmail());
}
// 获取自增主键
public Integer insertAndReturnId(User user) {
SimpleJdbcInsert insert = new SimpleJdbcInsert(jdbcTemplate)
.withTableName("users")
.usingGeneratedKeyColumns("id");
return insert.executeAndReturnKey(user.toMap()).intValue();
}
}
3. 查询数据
// 使用 BeanPropertyRowMapper 自动映射
public List<User> findAll() {
return jdbcTemplate.query(
"SELECT id, name, email, created_at as createdAt FROM users",
new BeanPropertyRowMapper<>(User.class)
);
}
// 带条件查询
public Optional<User> findById(int id) {
try {
return Optional.ofNullable(jdbcTemplate.queryForObject(
"SELECT * FROM users WHERE id = ?",
new Object[]{id},
(rs, rowNum) -> new User(
rs.getInt("id"),
rs.getString("name"),
rs.getString("email"),
rs.getTimestamp("created_at").toLocalDateTime()
)
));
} catch (EmptyResultDataAccessException e) {
return Optional.empty();
}
}
4. 更新与删除
public int updateEmail(int id, String newEmail) {
return jdbcTemplate.update(
"UPDATE users SET email = ? WHERE id = ?",
newEmail, id
);
}
public int deleteById(int id) {
return jdbcTemplate.update(
"DELETE FROM users WHERE id = ?",
id
);
}
三、高级功能实现
1. 批量操作(提升性能)
public int[] batchInsert(List<User> users) {
return jdbcTemplate.batchUpdate(
"INSERT INTO users (name, email) VALUES (?, ?)",
new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setString(1, users.get(i).getName());
ps.setString(2, users.get(i).getEmail());
}
public int getBatchSize() {
return users.size();
}
}
);
}
2. 事务管理实战
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void transferEmail(int fromId, int toId) {
User fromUser = userRepository.findById(fromId).orElseThrow();
User toUser = userRepository.findById(toId).orElseThrow();
userRepository.updateEmail(fromId, "old_" + fromUser.getEmail());
userRepository.updateEmail(toId, fromUser.getEmail());
}
}
3. 使用 NamedParameterJdbcTemplate
@Repository
public class UserNamedRepository {
private final NamedParameterJdbcTemplate namedTemplate;
public UserNamedRepository(DataSource dataSource) {
this.namedTemplate = new NamedParameterJdbcTemplate(dataSource);
}
public List<User> findByName(String name) {
MapSqlParameterSource params = new MapSqlParameterSource()
.addValue("name", "%" + name + "%");
return namedTemplate.query(
"SELECT * FROM users WHERE name LIKE :name",
params,
new BeanPropertyRowMapper<>(User.class)
);
}
}
四、IDEA 高效开发技巧
1. 数据库连接配置
- 打开 IDEA Database 面板(右侧边栏)
- 添加 MySQL 数据源 → 填写连接信息
- 开启自动同步功能(方便查看表结构变化)
2. SQL 语句验证
- 在代码中的 SQL 字符串上按
Alt+Enter
→Inject language or reference
→ 选择 SQL - 获得语法高亮和自动提示功能
3. 快速测试方法
- 在方法上右键 →
Run 'methodName()'
(需安装 JUnit) - 使用 Spring Boot Test 编写单元测试
五、常见问题排查
1. 时区问题解决方案
# 在连接字符串中添加时区参数
url: jdbc:mysql://localhost:3306/dbname?serverTimezone=Asia/Shanghai
2. 连接池配置优化
spring:
datasource:
hikari:
maximum-pool-size: 10
connection-timeout: 30000
idle-timeout: 600000
3. 中文乱码处理
url: jdbc:mysql://localhost:3306/dbname?characterEncoding=utf8
六、项目结构推荐
src/main/java
├── com.example.demo
│ ├── config # 配置类
│ ├── controller # 控制器
│ ├── model # 实体类
│ ├── repository # 数据访问层
│ └── service # 业务逻辑层
resources
├── sql # SQL脚本存放目录
└── application.yml
七、学习资源推荐
- 官方文档:Spring Framework Data Access
- 调试技巧:IDEA 的 Database 工具 + HTTP Client 测试 API
- 扩展学习:Spring Data JPA 对比学习
完整示例项目:
GitHub 仓库链接
(包含单元测试、API 示例和 SQL 脚本)