1.Spring JDBC的设计与实现
1.1应用场景
Spring建立的JDBC的框架中,还设计了一种更面向对象的方法,相对于JDBC模板,这种实现更像是一个简单的ORM工具,为应用提供了另外一种选择。
1.2设计概要
GOF设计模式中的模板模式
在Spring设计的模板中,大部分封装了对JDBC和Hibernate处理的通用过程,比如数据库资源管理、Hibernate的session管理等,在使用时,只需要设计自己定制化的或者和应用相关的部分就可以了。
2.Spring JDBC中模板类的设计与实现
2.1设计原理
在Spring JDBC中,JdbcTemplate是一个主要的模板类,继承关系如图:
从类继承关系上来看,JDBCTemplate继承了基类JdbcAccessor的和接口类JdbcAperation。在基类JdbcAccessor的设计中,对DataSource数据源进行管理和配置。在JdbcOperation接口中,定义了通过JDBC操作数据库的基本操作方法,而Jdbctemplate提供这些接口方法的实现,比如execute方法、query方法和update方法等。
2.2JDBCTemplate的基本使用
在模板的回调方法doInStatement中嵌入的是用户对数据库进行操作的代码,可以由Spring来完成,或者由客户应用直接来完成,然后通过JdbcTemplate的execute方法就可以完成相应的数据库操作。
2.3JdbcTemplate的execute实现
execute方法的设计时序
2.4JdbcTemplate的query实现
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对象的基本继承关系
3.1SqlQurey的实现
在使用MappingSqlQuery完成这个数据转换功能的时候,需要用户扩展一个MappingSqlQuery实现,并在用户扩展类的初始化函数中对SQL查询语句和查询参数进行设置,然后调用compile来完成这些设置。
这部分数据转换代码会在对数据库的查询结束执行,从而完成数据查询记录到Java数据对象的转换。
数据转换的调用时序图
3.2SqlUpdate的实现
主要提供数据的更新功能。
SqlUpdate的使用非常简洁,对应原来说,只需要提供具体的参数对象的值,并调用update方法就可以完成整个数据的更新过程,至于数据库Connection的管理、事务处理场景的处理等在数据库操作中都会涉及的基本过程,由作为应用平台的Spring来处理。
SqlUpdate的设计时序
SqlUpdate里的updateByNameParam方法完成的,使用JdbcTemplate来完成的。
3.3SqlFunction
SqlFunction类是MappingSqlQuery的子类。SqlFunction基本功能:SqlFunction RDBMS操作类中封装了一个SQL“函数”包装器(wrapper),使用这个包装器可以查询并返回一个单行结果集,对于这个单行结果集,SqlFunction默认的返回对象是一个int值。
为了使用SqlFunction,首先要创建一个SqlFunction对象,创建时需要为它指定数据源和执行的Sql语句。创建完以后,执行compile,然后可以调用SqlFunction的run方法来完成指定的SQL语句的执行,从而得到查询数据记录行数的返回结果。
SqlFunction的设计时序
4.Spring ORM的设计与实现
4.1应用场景
Spring的ORM包提供了对许多ORM产品的支持。
4.2设计概要
应用通过Spring使用这些ORM工具时,通常使用Spring提供的Template类(模板类)。在这些模板类里,封装了主要的数据操作方法,比如query、update等,并且在Template封装中,已经包含了前面所说的通用过程,这些通用过程包括Hibernate中的Session的处理、Connection的处理、事务的处理等。
以Template为核心的类设计
5.Spring驱动Hibernate的设计与实现
5.1设计原理
提供SessionFactory的封装,对持久化数据进行操作。对使用Hibernate的事务处理进行封装,通过封装,将Hibernate的持久化数据操作纳入到Spring统一的事务处理框架中。
5.2Hibernate的SessionFactory
在Spring中使用Hibernate,一般会以LocalSessionFactoryBean作为一个基本的配置Bean。LocalSessionFactoryBean是用来对Hibernate的Session进行管理的。
AbstractSessionFactoryBean的类继承关系
LocalSessionFactoryBean的作用包括:1,读取Hibernate的配置,2生成SessionFactor。
5.3HibernateTemplate的实现
HibernateTemplate中execute的调用过程
应用调用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设计原理
- 需要创建SqlMapClient,通过FactoryBean来读取对SqlMapClient的配置和具体创建。
- 通过SqlMapClientTemplate来调用SqlMapClient,封装了主要操作。
6.2创建SqlMapClient
在Spring IOC容器中,iBatis实例通常通过SqlMapClientFactoryBean来设置。在SqlMapClientFactoryBean中完成SqlMapClient的创建,SqlMapClient是用户使用iBatis操作数据库的主要类。
6.3SqlMapClientTemplate的实现
SqlMapClientTemplate的类继承关系
SqlMapClientTemplate的设计时序
在这个时序过程中,1,Template会先从SqlMapClient中得到Session和DataSource,并且进行一系列的初始化过程,然后回调SqlMapClientCallback的doInSqlMapClient方法执行具体的动作,最后释放数据库连接和关闭Session。