当前位置: 首页 > article >正文

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事务管理可以确保数据操作的一致性,防止数据异常。通过编程式和声明式事务管理,我们可以灵活控制事务边界。


http://www.kler.cn/a/326407.html

相关文章:

  • STM32保护内部FLASH
  • (长期更新)《零基础入门 ArcGIS(ArcMap) 》实验一(下)----空间数据的编辑与处理(超超超详细!!!)
  • 传奇996_23——杀怪掉落,自动捡取,捡取动画
  • ASP.NET 部署到IIS,访问其它服务器的共享文件 密码设定
  • 计算机网络:运输层 —— TCP的流量控制
  • 录的视频怎么消除杂音?从录制到后期的杂音消除攻略
  • YOLOv8改进 | 主干改进篇,华为的轻量化架构GhostNetV2改进特征提取网络
  • 前端项目依赖包中的依赖包漏洞解决方案
  • springboot实战学习(10)(ThreadLoacl优化获取用户详细信息接口)(重写拦截器afterCompletion()方法)
  • 解决VRM格式模型在Unity中运行出现头发乱飞等问题
  • Java | Leetcode Java题解之第443题压缩字符串
  • ECCV 2024 | 融合跨模态先验与扩散模型,快手处理大模型让视频画面更清晰!
  • 数据中心解决方案
  • 手写体识别毕设——人工智能和深度学习技术的快速发展
  • 前端安装 lerna
  • Knots_3D 9.3.0 一款教你绑绳结的手机应用
  • 高标准农田灌区信息化:为农业可持续发展注入新动力
  • 开源模型应用落地-qwen2.5-7b-instruct-LoRA微调-LLaMA-Factory-单机单卡-V100(十八)
  • 抽象工厂模式和工厂模式的区别
  • 使用 IntelliJ IDEA 连接到达梦数据库(DM)
  • 大厂面试真题- RPC通讯协议如何保证数据完整性
  • 谷歌网站收录查询,怎么查看网站在谷歌的收录情况
  • 1. AOSP源码导入到AndroidStudio
  • JWT 令牌生成报错
  • Linux(含麒麟操作系统)如何实现多显示器屏幕采集录制
  • 8.代码风格调试%结课竞赛