概述
- 在我们使用普通的 JDBC 数据库时,操作步骤非常麻烦,我们需要写一些不必要的代码来处理异常,打开和关闭数据库连接等。
- Spring JDBC 框架则会帮我们负责所有的低层细节,从开始打开连接,准备和执行 SQL 语句,处理异常,处理事务,到最后关闭连接。所以当从数据库中获取数据时,我们需要做的仅是定义连接参数,指定要执行的 SQL 语句,以及后续操作。
- Spring JDBC 提供几种方法和数据库中相应的不同的类与接口。我将给出使用 JdbcTemplate 类框架的经典和最受欢迎的方法。这是管理所有数据库通信和异常处理的中央框架类。
JdbcTemplate 类
- JdbcTemplate 类执行 SQL 查询、更新语句和存储过程调用,执行迭代结果集和提取返回参数值。它也捕获 JDBC 异常并转换它们到 org.springframework.dao 包中定义的通用类、更多的信息、异常层次结构。
- JdbcTemplate 类的实例是*线程安全* 配置的。所以我们可以配置 JdbcTemplate 的单个实例,然后将这个共享的引用安全地注入到多个 DAOs 中。
- 使用 JdbcTemplate 类时常见的做法是我们在 Spring 配置文件中配置数据源,然后共享数据源 bean 依赖注入到 DAO 类中,并在数据源的设值函数中创建了 JdbcTemplate。
项目环境
配置数据源
- 我们在 MySQL 数据库 spring 中创建一个数据库表 account。
1 | # 创建数据库 |
Maven依赖
1 | <dependencies> |
四种连接方式
目录结构
src
main
- java
- cn.water
- Account.java(实体类)
- cn.water
- resources
- Beans.xml(Spring配置文件)
- java
test
- cn.water.test
- SpringTest.java(测试类)
- cn.water.test
实体类
Account.java
1 | package cn.water.JDBC; |
配置文件
Beans.xml
1 |
|
测试类
SpringTest.java
1 | package cn.water.JDBC; |
Statement
测试类
- 注册数据库驱动:每次手动编写
- 设置数据库连接参数:每次手动编写
- 结果集遍历:麻烦
1 | /* 1、注册数据库驱动 */ |
PreparedStatement
测试类
- 注册数据库驱动:每次手动编写
- 设置数据库连接参数:每次手动编写
- 结果集遍历:麻烦
1 | /* 1、注册 数据库驱动 */ |
JDBC
实体类
1 | public class Account implements Serializable { |
测试类
- 注册数据库驱动:每次手动编写
- 设置数据库连接参数:每次手动编写
- 结果集遍历:简单
1 | /* 1、获取 DriverManagerDataSource对象 */ |
JDBC 、IoC
实体类
1 | public class Account implements Serializable { |
配置文件
- 注册数据库驱动:配置文件一次编写
- 数据库连接参数:配置文件一次编写
- 结果集遍历:简单
1 | <!-- DriverManagerDataSource --> |
测试类
1 | /* 1、加载配置文件,初始化Bean对象 */ |
三种获取方式
- 三种获取 JdbcTemplate 对象的方法
目录结构
src
main
- java
- cn.water
- dao
- AccountDao.java(持久层接口)
- AccountDaoImp01.java(持久层实现类)
- AccountDaoImp02.java(持久层实现类)
- AccountDaoImp03.java(持久层实现类)
- domain
- Account.java(实体类)
- dao
- cn.water
- resources
- Beans.xml(Spring配置文件)
- java
test
- cn.water.test
- JDBCTest.java(测试类)
- cn.water.test
实体类
Account.java
1 | package cn.water.JDBCCase.domain; |
持久层
AccontDao.java
1 | package cn.water.JDBCCase.dao; |
AccountDaoImp01.java
1 | package cn.water.JDBCCase.dao; |
AccountDaoImp02.java
1 | package cn.water.JDBCCase.dao; |
AccountDaoImp03.java
1 | package cn.water.JDBCCase.dao; |
配置文件
Beans.xml
1 |
|
测试类
JDBCTest.java
1 | package cn.water.JDBCCase; |
传递DataSource
持久层实现类
- 传递 DataSource后,创建 JdbcTemplate对象,然后调用操作数据库的方法。
1 | /* 成员变量 */ |
配置文件
1 | <!-- DriverManagerDataSource --> |
传递JdbcTemplate
- 直接传递JdbcTemplate对象,然后调用操作数据库的方法。
持久层实现类
1 | /* 成员变量 */ |
配置文件
1 | <!-- DriverManagerDataSource --> |
继承父类传递DataSource
继承 JdbcDaoSupport类,并向其传递 DataSource,然后调用父类方法,获取Connection对象,最后执行操作数据库的方法。
持久层实现类
1 | public class AccountDaoImp03 extends JdbcDaoSupport implements AccountDao{ |
配置文件
1 | <!-- DriverManagerDataSource --> |