Spring - JDBC 框架概述


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

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

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

Jdbc模板类

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

一旦配置, JdbcTemplate类的实例就是线程安全的因此,您可以配置JdbcTemplate的单个实例,然后安全地将这个共享引用注入到多个 DAO 中。

使用 JDBC Template 类的常见做法是在 Spring 配置文件中配置DataSource,然后将该共享 DataSource bean 依赖项注入到 DAO 类中,并在 DataSource 的 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 模板提供数据源,以便它可以配置自身以获取数据库访问。您可以使用一段代码在 XML 文件中配置数据源,如以下代码片段所示 -

<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 代表数据访问对象,通常用于数据库交互。DAO 的存在是为了提供一种在数据库中读取和写入数据的方法,它们应该通过一个接口公开此功能,应用程序的其余部分可以通过该接口访问它们。

Spring 中的 DAO 支持使得以一致的方式轻松使用 JDBC、Hibernate、JPA 或 JDO 等数据访问技术。

执行SQL语句

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

查询整数

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

查询了好久

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 存储过程。