引言
企业应用程序经常要访问存储在数据库中的信息,因此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使用过程中有一定的局限:
- 都需要按照上面的6个步骤进行数据库的访问,应用程序中可能会出现大量重复的代码。
- 数据库访问的代码和业务代码混杂在一起,难以维护。
- 不适当的SQL异常处理操作,有时候程序员并不清楚如何处理SQL异常但又不能忽略(检查性异常,编译器不通过)。
- ……
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,一起交流!