《Spring技术内幕:深入解析Spring架构与设计原理》笔记之五(数据库操作组件的实现)

1.Spring JDBC的设计与实现

1.1应用场景

Spring建立的JDBC的框架中,还设计了一种更面向对象的方法,相对于JDBC模板,这种实现更像是一个简单的ORM工具,为应用提供了另外一种选择。

1.2设计概要

GOF设计模式中的模板模式

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之五(数据库操作组件的实现)

在Spring设计的模板中,大部分封装了对JDBC和Hibernate处理的通用过程,比如数据库资源管理、Hibernate的session管理等,在使用时,只需要设计自己定制化的或者和应用相关的部分就可以了。

2.Spring JDBC中模板类的设计与实现

2.1设计原理

在Spring JDBC中,JdbcTemplate是一个主要的模板类,继承关系如图:

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之五(数据库操作组件的实现)

从类继承关系上来看,JDBCTemplate继承了基类JdbcAccessor的和接口类JdbcAperation。在基类JdbcAccessor的设计中,对DataSource数据源进行管理和配置。在JdbcOperation接口中,定义了通过JDBC操作数据库的基本操作方法,而Jdbctemplate提供这些接口方法的实现,比如execute方法、query方法和update方法等。

2.2JDBCTemplate的基本使用

在模板的回调方法doInStatement中嵌入的是用户对数据库进行操作的代码,可以由Spring来完成,或者由客户应用直接来完成,然后通过JdbcTemplate的execute方法就可以完成相应的数据库操作。


2.3JdbcTemplate的execute实现

execute方法的设计时序

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之五(数据库操作组件的实现)


2.4JdbcTemplate的query实现

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之五(数据库操作组件的实现)


query方法是通过使用PreparedStatementCallback的回调方法doInPreparedStatement来实现的。在回调函数中,可以看到PreparedStatement的执行,以及查询结果的返回处理结果。

2.5使用数据库Connection

在以上这些对数据库的操作中,使用了辅助类DataSourceUtils。

对于DataSource缓冲池的实现,用户可以通过定义Apache Jakarta Commons DBCP或者C3P0提供的DataSource来完成,然后在IOC容器中配置好后交给JdbcTemplate就可以使用了。

3.Spring JDBC中RDBMS操作对象的实现

Spring提供了org.springframework.jdbc.object包,其中包含了SqlQuery、SqlMappingQuery、SqlUpdate和StoredProcedure等类,这些类都是Spring JDBC应用程序可以使用的。

RDBMS对象的基本继承关系

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之五(数据库操作组件的实现)

3.1SqlQurey的实现

在使用MappingSqlQuery完成这个数据转换功能的时候,需要用户扩展一个MappingSqlQuery实现,并在用户扩展类的初始化函数中对SQL查询语句和查询参数进行设置,然后调用compile来完成这些设置。

这部分数据转换代码会在对数据库的查询结束执行,从而完成数据查询记录到Java数据对象的转换。

数据转换的调用时序图

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之五(数据库操作组件的实现)

3.2SqlUpdate的实现

主要提供数据的更新功能。

SqlUpdate的使用非常简洁,对应原来说,只需要提供具体的参数对象的值,并调用update方法就可以完成整个数据的更新过程,至于数据库Connection的管理、事务处理场景的处理等在数据库操作中都会涉及的基本过程,由作为应用平台的Spring来处理。

SqlUpdate的设计时序

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之五(数据库操作组件的实现)

SqlUpdate里的updateByNameParam方法完成的,使用JdbcTemplate来完成的。

3.3SqlFunction

SqlFunction类是MappingSqlQuery的子类。SqlFunction基本功能:SqlFunction RDBMS操作类中封装了一个SQL“函数”包装器(wrapper),使用这个包装器可以查询并返回一个单行结果集,对于这个单行结果集,SqlFunction默认的返回对象是一个int值。

为了使用SqlFunction,首先要创建一个SqlFunction对象,创建时需要为它指定数据源和执行的Sql语句。创建完以后,执行compile,然后可以调用SqlFunction的run方法来完成指定的SQL语句的执行,从而得到查询数据记录行数的返回结果。

SqlFunction的设计时序

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之五(数据库操作组件的实现)

4.Spring ORM的设计与实现

4.1应用场景

Spring的ORM包提供了对许多ORM产品的支持。

4.2设计概要

应用通过Spring使用这些ORM工具时,通常使用Spring提供的Template类(模板类)。在这些模板类里,封装了主要的数据操作方法,比如query、update等,并且在Template封装中,已经包含了前面所说的通用过程,这些通用过程包括Hibernate中的Session的处理、Connection的处理、事务的处理等。

以Template为核心的类设计

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之五(数据库操作组件的实现)

5.Spring驱动Hibernate的设计与实现

5.1设计原理

提供SessionFactory的封装,对持久化数据进行操作。对使用Hibernate的事务处理进行封装,通过封装,将Hibernate的持久化数据操作纳入到Spring统一的事务处理框架中。

5.2Hibernate的SessionFactory

在Spring中使用Hibernate,一般会以LocalSessionFactoryBean作为一个基本的配置Bean。LocalSessionFactoryBean是用来对Hibernate的Session进行管理的。

AbstractSessionFactoryBean的类继承关系

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之五(数据库操作组件的实现)

LocalSessionFactoryBean的作用包括:1,读取Hibernate的配置,2生成SessionFactor。

5.3HibernateTemplate的实现

HibernateTemplate中execute的调用过程

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之五(数据库操作组件的实现)

应用调用HibernateTemplate的execute方法,1.HibernateTemplate会从SessionFactoryUtils中得到Hibernate的Session,2把这个Session设置到HibernateCallback中,3.返回对Hibernate的操作结果,执行flush,让内存和数据库同步,4调用SessionFactoryUtils来关闭当前的Session。

5.4Session的管理

1.获得session:通过SessionFactory中的openSession来创建新的Session。当不需要强制新建Session的情况,在SessionFactoryUtils实现getSession,包括了与事务处理相关的部分和session与线程绑定的处理。

2.使用Hibernate的基本功能:重复的处理过程都在HibernateTemplate中完成,这种一致化降低了应用开发的难度,体现了Spring的价值。

6.Spring驱动IBatis的设计与实现

6.1设计原理

  1. 需要创建SqlMapClient,通过FactoryBean来读取对SqlMapClient的配置和具体创建。
  2. 通过SqlMapClientTemplate来调用SqlMapClient,封装了主要操作。

6.2创建SqlMapClient

在Spring IOC容器中,iBatis实例通常通过SqlMapClientFactoryBean来设置。在SqlMapClientFactoryBean中完成SqlMapClient的创建,SqlMapClient是用户使用iBatis操作数据库的主要类。

6.3SqlMapClientTemplate的实现

SqlMapClientTemplate的类继承关系

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之五(数据库操作组件的实现)

SqlMapClientTemplate的设计时序

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之五(数据库操作组件的实现)

在这个时序过程中,1,Template会先从SqlMapClient中得到Session和DataSource,并且进行一系列的初始化过程,然后回调SqlMapClientCallback的doInSqlMapClient方法执行具体的动作,最后释放数据库连接和关闭Session。