Spring系统学习(五)——Spring数据库编程

news/2024/9/29 2:26:15/

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类来配置数据库连接信息:

    java">@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,并将其注入到需要使用的地方:

    java">@Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {return new JdbcTemplate(dataSource);
    }
    

JdbcTemplate的常用方法

JdbcTemplate提供了多种数据库操作方法。以下是一些常用的方法:

1. execute() 方法

用于执行SQL语句,通常用于DDL操作(如创建表、删除表等)。

java">jdbcTemplate.execute("CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50))");
2. update() 方法

用于执行插入、更新和删除操作,返回受影响的行数。

java">// 插入新用户
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对象。

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的实现示例:

java">public class UserRowMapper implements RowMapper<User> {@Overridepublic 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. 编程式事务管理

编程式事务管理是通过代码来显式地管理事务,适合需要高度控制事务边界的情况。

java">@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注解,它可以应用于类或方法上。

java">@Service
public class UserService {@Transactionalpublic void createUser(User user) {jdbcTemplate.update("INSERT INTO users (id, name) VALUES (?, ?)", user.getId(), user.getName());}
}
2.通过Spring的配置类或XML文件启用事务管理:
java">@EnableTransactionManagement
@Configuration
public class AppConfig {@Beanpublic 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实现
java">@Service
public class UserService {@Autowiredprivate 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实现
java">@RestController
public class UserController {@Autowiredprivate 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.ppmy.cn/news/1531224.html

相关文章

Unity3D入门(二) :Unity3D实现视角的丝滑过渡切换

1. 前言 上篇文章&#xff0c;我们已经初步了解了Unity3D&#xff0c;并新建并运行起来了一个项目&#xff0c;使相机视角自动围绕着立方体旋转。 这篇文章&#xff0c;我们来讲一下Unity3D怎么过渡地切换视角。 我们继续是我上篇文章中的项目&#xff0c;但是需要向把Camera…

JAIN SLEE 和 Spring Boot对比

在性能方面&#xff0c;JAIN SLEE 和 Spring Boot 各有优势&#xff0c;取决于使用场景。为了更好地比较两者的性能&#xff0c;以下从几个关键方面进行分析&#xff1a; 1. 设计目标与适用场景 JAIN SLEE&#xff1a;专门为电信级应用设计&#xff0c;擅长处理高并发、低延迟…

代码随想录打卡Day39

今天是打家劫舍专题&#xff0c;三道题全都看了讲解&#xff0c;第一次做感觉确实是无从下手。。。不过了解了原理之后代码很快就写出来了。 198.打家劫舍 这道题使用一维dp数组&#xff0c;首先确定dp数组的含义&#xff0c;dp[i]为考虑偷下标[0, i]家的情况下所能获得的最大…

QT 如何判断电脑已安装某个软件

如何判断Windows电脑是否已经安装了某个软件&#xff1f;一般而言&#xff0c;通过安装包形式安装的软件&#xff0c;都会把卸载信息写入到注册表&#xff0c;本文正是通过读取注册表的方式来判断是否已安装了该款软件&#xff0c;详见下面代码&#xff1a; #include <QCor…

【Vue】以RuoYi框架前端为例,ElementUI封装图片上传组件——将图片信息转成base64后提交到后端保存

RuoYi 框架本身对于图片上传功能&#xff0c;在ElementUI的 <el-upload> 组件的基础装封装了 /components/ImageUpload/index.vue 组件。本组件就是在 RuoYi 自定义的 <ImageUpload> 组件的基础上进行改造&#xff0c;将图片的信息在上传之前处理成 base64 格式&am…

如何选择高品质SD卡

如何选择高品质SD卡 SD卡&#xff08;Secure Digital Memory Card&#xff09;是一种广泛使用的存储器件&#xff0c;因其快速的数据传输速度、可热插拔的特性以及较大的存储容量&#xff0c;广泛应用于各种场景&#xff0c;例如在便携式设备如智能手机、平板电脑、运动相机等…

Xcode 16 Pod init 报错

pod init failed in Xcode 16 Issue #12583 CocoaPods/CocoaPods GitHub 根据你提供的步骤&#xff0c;以下是详细的操作指南来解决 CocoaPods 的问题&#xff1a; ### 步骤 1&#xff1a;在 Xcode 中转换项目文件夹为组 1. 打开你的 Xcode 项目。 2. 在左侧的项目导航器…

YOLOv8 Flask整合问题

YOLOv8 Flask整合问题 yolov8 flask 后代码没有进行推理问题。 Bug model.predict()pyinstallerHTTPServer/flask: not executing yolov8是异步线程调用了&#xff0c;flask打包exe后会应该异步问题&#xff0c;model.predict()不会进行返回&#xff0c;导致没有看着没有执行而…