自学内容网 自学内容网

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的核心步骤:

  1. 引入Spring JDBC依赖
    在Maven或Gradle项目中,加入spring-jdbc依赖。

    <!-- Maven依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.3.21</version>
    </dependency>
    
  2. 数据源配置
    需要配置数据库连接信息。通常我们使用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;
    }
    
  3. 配置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事务管理可以确保数据操作的一致性,防止数据异常。通过编程式和声明式事务管理,我们可以灵活控制事务边界。


原文地址:https://blog.csdn.net/2301_79858914/article/details/142562228

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!