Spring - JDBC 框架概述



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

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

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

JdbcTemplate 类

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

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

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

配置数据源

让我们在我们的数据库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 Template 提供一个 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://127.0.0.1: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 Template 对象对数据库表执行 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 存储过程。

广告