Spring对JDBC的支持

引言

企业应用程序经常要访问存储在数据库中的信息,因此JDK提供了一个标准接口 JDBC(Java DataBase Connection,Java数据库连接)来进行数据库访问操作。JDBC为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类,所以真正的数据库访问操作实现是由各自数据库厂商提供的。通常把厂商提供的特定于数据库的访问API称为数据库JDBC驱动程序,如:Mysql、Oracle、SQL Server驱动等等。

利用JDBC虽然可以方便地访问存储在关系数据库中的信息,但是代码比较繁琐,开发人员不得不在Java对象关系数据之间进行转换。因此,随着企业应用开发技术的进步。逐渐产生了用来实现Java对象与关系数据之间自动映射的持久化框架,称为对象-关系映射(Ovject/Relation Mapping,ORM)。这些持久化框架包括Hibernate、Mybatis等等。为了进一步促进Java EE企业应用开发,进一步规范ORM实现,Java EE 5.0规范中推出了JPA(Java Persistence API)。需要注意的是,JPA是一个ORM的标准规范,而不是一个具体的ORM框架。

好了,说了这么多,也是为了大家能清楚JDBC和JPA的区别。回归正题,本文关注的是Spring对JDBC的支持,至于Spring对于JPA的支持往后的文章再介绍。

Spring对JDBC的封装

传统的JDBC

首先我们了解一下传统JDBC的工作流程

  • 加载数据库驱动程序(Mysql、SQL Server等)
  • 通过DriverManager获取Connection对象
  • 获取Statement对象
  • 执行SQL语句
  • 操作结果集ResultSet
  • 关闭资源

传统的JDBC使用过程中有一定的局限:

  1. 都需要按照上面的6个步骤进行数据库的访问,应用程序中可能会出现大量重复的代码。
  2. 数据库访问的代码和业务代码混杂在一起,难以维护。
  3. 不适当的SQL异常处理操作,有时候程序员并不清楚如何处理SQL异常但又不能忽略(检查性异常,编译器不通过)。
  4. ……

    Spring对于JDBC的封装

    鉴于传统JDBC的不足,Spring对JDBC进行深层次的封装(JdbcTemplate),让JDBC更加易用和维护,也降低了代码的耦合度。接下来让我们来了解一下Spring是怎么封装的JDBC。

    Spring的数据访问哲学

    为了避免持久化的逻辑分散到应用的各个组件中,最好将数据访问的功能放到一个或多个专注与此项任务的组件中。这样的组件通常称为数据访问对象(Data Access object DAO)Repository
    为了避免应用于特定的数据访问策略耦合在一起,编写良好的Repository应该以接口的方式暴露功能。如下图。
    在这里插入图片描述

服务对象通过接口来访问Repository。【设计模式】MVC模式与三层架构关系

数据访问模板化

在我们进行数据访问的过程中,我们都需要获取到一个数据存储的连接并在处理完成后释放。这些都是在数据访问处理过程中固定步骤,但是每种数据访问的方法又会有些不同,我们会查询不同的对象或以不同的方式更新数据,这都是数据访问过程中变化的部分。
Spring将数据访问过程中固定的和可变的部分明确划分为两个不同的类:模板(template)回调(callback)。模板管理过程中固定的部分,而回调处理自定义的数据访问代码。
在这里插入图片描述

传统JDBC和Spring封装的JdbcTemplate区别

操作 传统JDBC JdbcTemplate
获取JDBC连接
声明SQL
预编译SQL
执行SQL
处理结果集
释放结果集
释放Statement
提交事务
处理异常并回滚事务
释放JDBC连接

由表格我们就可以看出,JdbcTemplate 只需程序员关注需要执行的SQL获取结果,而别的部分操作则不需要程序员关注,模板都帮处理好了,这样一看,JdbcTemplate 是不是比JDBC用起来更加方便呀?
本文介绍的是Spring对JDBC的支持(JdbcTemplate),至于Spring对JPA的支持(HibernateTemplate、JpaTemplate后面文章再写)

欢迎加入JAVA学习群949419296,一起交流!