Spring - JDBC 框架概述

在使用普通的旧 JDBC 处理数据库时,编写不必要的代码来处理异常、打开和关闭数据库连接等变得很麻烦。但是,Spring JDBC 框架会处理从打开连接开始的所有低级细节,准备并执行SQL语句,处理异常,处理事务,最后关闭连接。

因此,您只需定义连接参数并指定要执行的 SQL 语句,并在从数据库中获取数据的同时为每次迭代执行所需的工作。

Spring JDBC 提供了几种方法和相应的不同类来与数据库接口。 我将采用经典且最流行的方法,它利用框架的 JdbcTemplate 类。 这是管理所有数据库通信和异常处理的核心框架类。


JdbcTemplate 类

JDBC Template 类执行 SQL 查询、更新语句、存储过程调用、对 ResultSet 执行迭代以及提取返回的参数值。 它还捕获 JDBC 异常并将它们转换为 org.springframework.dao 包中定义的通用、信息更丰富的异常层次结构。

JdbcTemplate 类的实例在配置后是threadsafe。 因此,您可以配置 JdbcTemplate 的单个实例,然后安全地将这个共享引用注入多个 DAO。

使用 JDBC Template 类时的一个常见做法是在 Spring 配置文件中配置一个 DataSource,然后将该共享 DataSource bean 依赖注入到 DAO 类中,并在 setter 中创建 JdbcTemplate 数据源。


配置数据源

让我们在数据库 TEST 中创建一个数据库表 Student。 我们假设您正在使用 MySQL 数据库,如果您使用任何其他数据库,那么您可以相应地更改您的 DDL 和 SQL 查询。

CREATE TABLE Student(
   ID   INT NOT NULL AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE  INT NOT NULL,
   PRIMARY KEY (ID)
);

现在我们需要为 JDBC 模板提供一个 DataSource,以便它可以配置自己以获取数据库访问权限。 您可以使用一段代码在 XML 文件中配置 DataSource,如以下代码段所示 −

<bean id = "dataSource" 
   class = "org.springframework.jdbc.datasource.DriverManagerDataSource">
   <property name = "driverClassName" value = "com.mysql.jdbc.Driver"/>
   <property name = "url" value = "jdbc:mysql://localhost:3306/TEST"/>
   <property name = "username" value = "root"/>
   <property name = "password" value = "password"/>
</bean>

数据访问对象 (DAO)

DAO代表Data Access Object,常用于数据库交互。 DAO 的存在是为了提供一种向数据库读取和写入数据的方法,它们应该通过一个接口公开此功能,应用程序的其余部分将通过该接口访问它们。

Spring 中的 DAO 支持使得以一致的方式使用数据访问技术(如 JDBC、Hibernate、JPA 或 JDO)变得容易。


执行 SQL 语句

让我们看看如何使用 SQL 和 JDBC 模板对象对数据库表执行 CRUD(创建、读取、更新和删除)操作。

查询 int 整数

String SQL = "select count(*) from Student";
int rowCount = jdbcTemplateObject.queryForInt( SQL );

查询 long

String SQL = "select count(*) from Student";
long rowCount = jdbcTemplateObject.queryForLong( SQL );

使用绑定变量的简单查询

String SQL = "select age from Student where id = ?";
int age = jdbcTemplateObject.queryForInt(SQL, new Object[]{10});

查询字符串

String SQL = "select name from Student where id = ?";
String name = jdbcTemplateObject.queryForObject(SQL, new Object[]{10}, String.class);

查询和返回对象

String SQL = "select * from Student where id = ?";
Student student = jdbcTemplateObject.queryForObject(
   SQL, new Object[]{10}, new StudentMapper());

public class StudentMapper implements RowMapper<Student> {
   public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
      Student student = new Student();
      student.setID(rs.getInt("id"));
      student.setName(rs.getString("name"));
      student.setAge(rs.getInt("age"));
      
      return student;
   }
}

查询并返回多个对象

String SQL = "select * from Student";
List<Student> students = jdbcTemplateObject.query(
   SQL, new StudentMapper());

public class StudentMapper implements RowMapper<Student> {
   public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
      Student student = new Student();
      student.setID(rs.getInt("id"));
      student.setName(rs.getString("name"));
      student.setAge(rs.getInt("age"));
      
      return student;
   }
}

在表格中插入一行

String SQL = "insert into Student (name, age) values (?, ?)";
jdbcTemplateObject.update( SQL, new Object[]{"Zara", 11} );

在表中更新一行

String SQL = "update Student set name = ? where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{"Zara", 10} );

从表中删除一行

String SQL = "delete Student where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{20} );

执行 DDL 语句

您可以使用 jdbcTemplate 中的 execute(..) 方法来执行任何 SQL 语句或 DDL 语句。 以下是使用 CREATE 语句创建表的示例 −

String SQL = "CREATE TABLE Student( " +
   "ID   INT NOT NULL AUTO_INCREMENT, " +
   "NAME VARCHAR(20) NOT NULL, " +
   "AGE  INT NOT NULL, " +
   "PRIMARY KEY (ID));"

jdbcTemplateObject.execute( SQL );

Spring JDBC 框架示例

基于以上概念,让我们看几个重要的例子,这将有助于你理解 Spring 中 JDBC 框架的使用 −

序号 示例 & 描述
1 Spring JDBC 示例

这个例子将解释如何编写一个简单的基于 JDBC 的 Spring 应用程序。

2 Spring 中的 SQL 存储过程

学习在 Spring 中使用 JDBC 时如何调用 SQL 存储过程。