Spring系统学习(五)——Spring数据库编程
Spring 数据库编程概述
在Spring中,数据库编程的核心模块是Spring JDBC和事务管理。Spring提供了简化数据库操作的工具和接口,例如JdbcTemplate
,大大减少了与JDBC API相关的繁琐代码。接下来,我们详细介绍Spring JDBC及其事务管理,重点讲解JdbcTemplate
的常用方法和事务管理方式,最后通过一个用户登录的案例来展示。
Spring JDBC
1. JdbcTemplate
概述
JdbcTemplate
是 Spring 提供的用于简化JDBC操作的工具类。它封装了数据库连接、SQL语句执行、结果集处理等复杂过程,使得开发者不必直接处理原始的JDBC API,减少了重复代码和潜在错误。
主要优点:
- 简化了数据库操作。
- 自动管理资源,如连接、语句和结果集。
- 提供对数据库查询、更新、批量操作、事务等的支持。
2. Spring JDBC的配置
配置JdbcTemplate
的核心步骤:
-
引入Spring JDBC依赖:
在Maven或Gradle项目中,加入spring-jdbc
依赖。<!-- Maven依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.21</version> </dependency>
-
数据源配置:
需要配置数据库连接信息。通常我们使用DataSource
接口来定义数据源,可以通过DriverManagerDataSource
类来配置数据库连接信息:@Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/mydb"); dataSource.setUsername("root"); dataSource.setPassword("password"); return dataSource; }
-
配置
JdbcTemplate
:
通过Spring配置类或XML配置文件来定义JdbcTemplate
,并将其注入到需要使用的地方:@Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); }
JdbcTemplate
的常用方法
JdbcTemplate
提供了多种数据库操作方法。以下是一些常用的方法:
1. execute()
方法
用于执行SQL语句,通常用于DDL操作(如创建表、删除表等)。
jdbcTemplate.execute("CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50))");
2. update()
方法
用于执行插入、更新和删除操作,返回受影响的行数。
// 插入新用户
String insertSql = "INSERT INTO users (id, name) VALUES (?, ?)";
jdbcTemplate.update(insertSql, 1, "Alice");
// 更新用户
String updateSql = "UPDATE users SET name = ? WHERE id = ?";
jdbcTemplate.update(updateSql, "Bob", 1);
// 删除用户
String deleteSql = "DELETE FROM users WHERE id = ?";
jdbcTemplate.update(deleteSql, 1);
3. query()
方法
用于执行查询操作,返回结果。可以通过RowMapper
接口将结果映射到Java对象。
// 查询单个用户
String querySql = "SELECT * FROM users WHERE id = ?";
User user = jdbcTemplate.queryForObject(querySql, new Object[]{1}, new UserRowMapper());
// 查询多个用户
String queryAllSql = "SELECT * FROM users";
List<User> users = jdbcTemplate.query(queryAllSql, new UserRowMapper());
RowMapper
的实现示例:
public class UserRowMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
return user;
}
}
Spring事务管理概述
事务管理是数据库操作中的一个关键概念,Spring为我们提供了简化事务管理的工具。Spring支持两种事务管理方式:编程式事务管理和声明式事务管理。
1. 事务管理的核心接口
Spring中的事务管理核心接口是PlatformTransactionManager
。常用实现类包括:
DataSourceTransactionManager
:适用于JDBC的事务管理。JpaTransactionManager
:适用于JPA的事务管理。
2. 编程式事务管理
编程式事务管理是通过代码来显式地管理事务,适合需要高度控制事务边界的情况。
@Transactional
public void executeTransaction() {
TransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
// 数据库操作
jdbcTemplate.update("INSERT INTO users (id, name) VALUES (?, ?)", 2, "Charlie");
// 提交事务
transactionManager.commit(status);
} catch (Exception e) {
// 回滚事务
transactionManager.rollback(status);
throw e;
}
}
声明式事务管理概述
声明式事务管理是通过配置(如注解或XML)来管理事务,不需要在代码中显式控制事务的开始、提交和回滚。
1. 通过注解实现声明式事务
最常用的方式是使用@Transactional
注解,它可以应用于类或方法上。
@Service
public class UserService {
@Transactional
public void createUser(User user) {
jdbcTemplate.update("INSERT INTO users (id, name) VALUES (?, ?)", user.getId(), user.getName());
}
}
2.通过Spring的配置类或XML文件启用事务管理:
@EnableTransactionManagement
@Configuration
public class AppConfig {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
实现用户登录案例
下面是一个简单的用户登录案例,通过Spring JDBC和声明式事务来实现。
1. 数据库表结构
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50),
password VARCHAR(50)
);
2. UserService实现
@Service
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
public User login(String username, String password) {
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
try {
return jdbcTemplate.queryForObject(sql, new Object[]{username, password}, new UserRowMapper());
} catch (EmptyResultDataAccessException e) {
return null; // 用户不存在或密码错误
}
}
}
3. Controller实现
@RestController
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/login")
public ResponseEntity<String> login(@RequestParam String username, @RequestParam String password) {
User user = userService.login(username, password);
if (user != null) {
return ResponseEntity.ok("登录成功");
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("用户名或密码错误");
}
}
}
小结
Spring JDBC和事务管理为开发者提供了简化数据库编程的工具。JdbcTemplate
封装了常见的数据库操作方法,使得我们能轻松执行增删改查。Spring事务管理可以确保数据操作的一致性,防止数据异常。通过编程式和声明式事务管理,我们可以灵活控制事务边界。