学习目标
一、管理数据源
1.JDBC数据源
2.连接池数据源
3.JNDI数据源
二、整合JDBC
1.JDBC进行数据库访问的流程
2.JdbcTemplate模板类
3.NamedParameterJdbcTemplate模板类
4.JdbcDaoSupport辅助类
5.JDBC DAO的开发流程
三、整合Hibernate
1.Hibernate进行数据库访问的流程
2.Spring IOC容器管理SessionFactory
3.HibernateJdbcTemplate模板类
4.HibernateDaoSupport辅助类
| 5.Hibernate DAO的开发流程 |
对于数据库的操作Spring提供了DAO支持,可以不管底层的数据库细节,Spring的提供一组DAO接口就可以完成所有的数据库的操作
一、管理数据源
在进行任何数据访问的时候,都需要获取一个数据库连接。由于每次回去数据库连接都需要耗费相当长的时间,因此会严重影响系统的性能。为了解决这个问题,在JDBC中增加一个DataSource接口,定义数据源的概念。
所谓数据源,其实就是一个获取数据库连接的工厂,开发人员使用DataSource接口可以通过一致的方式获得数据库的连接,而在数据源的内部,可以通过将数据库连接缓存的方式来使得数据库连接可以被重用,从而得到快速获得数据库连接的目的。
通过使用数据源不仅仅可以提高获取数据库连接的速度,还可以方便低将事务管理等从具体的应用代码中分离出来,实现数据库事务的统一管理。
Spring提供了数据源的支持,并提供了一些常用情况下数据源的实现,不管采用什么方式来进行数据库操作,首先都要设置数据源,在Spring中采用IoC的方式来注入数据源,直接在配置文件中给DAO配置数据源。不管采用什么类型的数据源,只要保留一个DataSource接口就可以在配置文件中注入数据源了。
1.JDBC数据源
该类数据源生成标准的Connection对象。
org.springframework.jdbc.datasource.DriverManagerDataSource简单的实现了DataSource接口,直接获取Connection。它并未提供连接池的能力,而是仅仅开发、测试目的
2.连接池数据源
该类数据源生成由连接池维护的Connection对象
DBCP:org.apache.commons.dbcp.BasicDataSource
C3P0:com.mchange.v2.c3p0.ComboPooledDataSource
3.JNDI数据源
该类数据源生成由连接池维护的Connection对象,但连接是由Web容器产生的
JNDI:org.springframework.jndi.JndiObjectFactoryBean
二、整合JDBC
JDBC在Java开发中占有非常重要的地位,它的最大贡献在于提供对不同数据库的统一处理,在很大程度上屏蔽了底层数据库的不一致性。JDBC操作数据库的步骤非常明确,但是操作数据库的步骤也同时非常复杂,存在大量的重复步骤。Spring针对直接使用JDBC访问数据库的不足,对JDBC进行的封装处理,替我们完成SQL语句执行时的底层处理工作,可以很大程度上减轻开发人员的工作量,避免大量的重复代码。
1.JDBC进行数据库访问的流程
A.装载数据库驱动
B.建立数据库连接
C.开始事务
D.创建Statement/ParpredStatement对象
E.设置SQL语句,执行对数据库的操作
F.提交事务
G.异常处理(如果需要,包括事务回滚工作)
H.关闭数据库连接,释放资源
除了步骤E以外,其它的处理流程都是固定的,Spring对这些重复的步骤进行了封装Spring对JDBC的封装使用了模板设计模式,提供了JDBC操作的模板类JdbcTemplate,通过该模板类可以方便完成数据库的CURD操作。同时为了方便JdbcTemplate模板类在DAO中的使用,Spring提供了JdbcDaoSupport辅助类,用户的DAO只要继承该辅助类就可以在DAO中方便的获取JdbcTemplate模板类的实例完成数据库的CURD操作
2.JdbcTemplate模板类
JdbcTemplate构造函数接受一个DataSource对象来完成初始化。然后就可以使用它提供的相关方法来完成数据库的操作了
JdbcTemplate的常用方法列表
| ①返回单个对象的查询 |
| Object query(String sql , ResultSetExtractor extractor) Object query(String sql , Object[] args , ResultSetExtractor extractor) |
| 查询结果使用ResultSetExtractor封装返回 |
| Object queryForObject(String sql , RowMapper rowMapper) Object queryForObject(String sql , Object[] args , RowMapper rowMapper) |
| 查询结果使用rowMapper封装返回 |
| Object queryForObject(String sql , Class requiredType) Object queryForObject(String sql , Object[] args , Class requiredType) |
| 根据SQL语句查询requiredType类型对象 |
| Object queryForInt(String sql)/ Object queryForInt(String sql , Object[] args) Object queryForLong(String sql)/Object queryForLong(String sql , Object[] args) |
| 根据SQL语句查询Integer/Long类型对象 |
| ②返回多个对象的查询 |
| List query (String sql , RowMapper rowMapper) List query (String sql , Object[] args , RowMapper rowMapper) |
| 根据SQL查询,使用rowMapper封装对象,返回封装对象的List列表 |
| List queryForList (String sql) List queryForList (String sql , Object[] args) |
| 根据SQL查询,使用Map封装对象,返回Map对象的List列表 |
| List queryForList (String sql, Class requiredType) List queryForList (String sql , Object[] args, Class requiredType) |
| 根据SQL查询,返回requiredType对象的List列表,只支持基本类型及String类型 |
| ③更新操作 |
| int update(String sql) int update(String sql , Object[] args) int update(String sql , Object[] args , int[] argTypes) |
| 执行更新操作 |
| int update(PreparedStatementCreator psc) |
| 接收PreparedStatementCreator执行更新操作 |
| int update(String sql , PreparedStatementSetter pss) |
| 接收PreparedStatementSetter执行更新操作 |
| ④回调接口 |
| ResultSetExtractor接口:用来完成结果集的处理,它的exetractorData方法接受一个ResultSet作为参数,对ResultSet迭代进行处理后返回 |
| RowMapper接口:用来封装结果集中的特定行,它的mapRow方法接受的参数分别是结果集和当前的行号,对结果集中的当前行进行封装后返回 |
| PreparedStatementCreator接口:用来创建并返回一个PreparedStatement对象 |
| PreparedStatementSetter接口:用来设置一个PreparedStatement对象的参数值 |
JdbcTemplate模板类中所有SQL语句中参数都是使用占位符(?)来表示的,这给赋值工作带来了很到的麻烦,为了解决这个问题Spring提供了NamedParameterJdbcTemplate支持命名参数的模板类。该类封装了JdbcTemplate类,提供了使用命名参数的方式来设置SQL语句中动态值
NamedParameterJdbcTemplate的命名参数操作
| ①指定命名参数 |
| SQL中指定命名操作的语法格式为:“:parameterName” |
| ②设置命名参数 |
| ⑴使用Map设置命名参数的值:key对应操作的名称,value对应参数的值 |
| ⑵使用SqlParameterSource接口的实现类MapSqlParameterSource。 本质上还是使用Map传递参数 |
| ⑶使用SqlParameterSource接口的实现类BeanPropertySqlParameterSource 使用Bean对象来传递参数,此时Bean对象中属性的名称必须与命名参数保持一致 |
JdbcDaoSupport是建立在JdbcTemplate基础之上的辅助类,提供了对JDBC DAO的支持。它接受一个DataSource作为参数(也可以提供一个JdbcTemplate作为参数),在内部自动初始化JdbcTemplate模板类对象。用户的DAO类只要继承该类就可以方便低得到JdbcTemplateh或者Connection类的实例,进行数据库的CURD操作
JdbcDaoSupport的常用方法列表
| ①注入方法 |
| ⑴void setDataSource(DataSource dataSource) |
| ⑵void setJdbcTemplate(JdbcTemplate jdbcTemplate) |
| ②获取方法 |
| ⑴Connection getConnection() |
| ⑵DataSource getDataSource() |
| ⑶JdbcTemplate getJdbcTemplate() |
A.DAO实现:继承DAO接口和JdbcDaoSupport辅助类创建DAOImpl实现类,使用JdbcDaoSupport提供的JdbcTemplate模板对象完成DAOImpl类中的CURD的操作方法
B.DAO配置:配置对应的DataSource对象,为DaoImpl注入相应的DataSource
三、整合Hibernate
为了简化持久层的开发,越来越多的应用程序开始使用ORM组件来实现对数据库的各种操作,Hibernate作为一个优秀的ORM框架被广泛应用于应用程序的持久层开发,Spring作为一个轻量级的JavaEE框架,对通用的ORM框架提供了良好的支持。
1.Hibernate进行数据库访问的流程
A.创建Configuration对象实例
B.构建SessionFactory对象实例
C.开始一个新的Session
D.开始事务
E.使用Session对象执行对数据库的操作
F.异常处理(如果需要,包括事务回滚工作)
G.提交事务
H.关闭Session
I.关闭SessionFactory,释放资源
流程中的ABI步整个应用中只需要执行一次,Spring提供了LocalSessionFactory的工厂类以方便在Spring的容器中创建和管理SessionFactory实例。
流程中的CDFGH处理的流程固定,每次操作都是一样的。Spring中提供了和JDBC中一样的模板类HibenateTemplate对Hibernate的操作流程进行了封装,并提供了辅助类HibernateDaoFactory简化HibenateTemplate的使用
2.Spring IOC容器管理SessionFactory
由于SessionFactory在整个Web应用中只需要初始化一次,因此可以方便的使用Spring的IoC容器创建和管理。为了方便SessionFactory的创建,Spring通过了一个工厂Bean org.springframework.orm.hibernate3.LocalSessionFactoryBean专门用于创建SessionFactory实例的工厂类。它并不是一个普通的Bean,LocalSessionFactoryBean属于工厂Bean的范畴,是Spring中提供了一种特殊的Bean。通过在配置文件中配置LocalSessionFactoryBean,便可以通过IoC容器获取SessionFactory的实例。
LocalSessionFactoryBean支持两种方式创建SessionFactory的实例:一是将Hibernate配置文件hibernate.cfg.xml整合到Spring的LocalSessionFactoryBean的配置中;二是直接在Spring配置文件中配置SessionFactory的参数
第一种方式:整合hibernate.cfg.xml文件配置参数
第二种方式:直接配置SessionFactory参数
org.hibernate.dialect.MySQLDialect
3.HibernateJdbcTemplate模板类
为了简化Hibernate的操作,Spring提供了Hibernate的模板类HibernateTemplate。org.springframework.orm.hibernate3.HibernateTemplate提供了使用Hibernate进行数据的添加、删除、更新和查询的一系列方法。并且每种功能都提供了多种执行方法以及对多种参数方式的支持,另外还提供了异常转换的功能,所有执行数据库操作的方法都抛出统一的异常DataAccessException。
HibernateJdbcTemplate的构造函数接受一个SessionFactory对象来完成初始化。然后就可以使用它提供的相关方法来完成数据库的操作了
HibernateJdbcTemplate常用方法列表
| ①查询方法 |
| ⑴Serializable save(Object entity) |
| ⑵void update(Object entity) |
| ⑶void saveOrUpdate(Object entity) |
| ⑷void delete(Object entity) |
| ②更新方法 |
| ⑴Object get(Class entityClass, Serializable id) |
| ⑵Object load(Class entityClass, Serializable id) |
| ⑶List find(String queryString) |
| ⑷List find(String queryString , Object value) |
| ⑸List find(String queryString , Object [] values) |
为了简化DAO中HibernateTemplate的使用,Sping提供了HibernateDaoSupport辅助类,org.springframework.orm.hibernate3.support.HibernateDaoSupport辅助类是建立在HibernateJdbcTemplate基础之上的,提供了对Hibernate DAO的支持。它接受一个SessionFactory作为参数(也可以提供一个HibernateJdbcTemplate作为参数),在内部自动初始化HibernateJdbcTemplate模板类对象。用户的DAO类只要继承该类就可以方便低得到HibernateJdbcTemplate的实例,进行数据库的CURD操作
HibernateDaoSupport常用方法列表
| ①注入方法 |
| ⑴void setSessionFactory(SessionFactory sessionFactory) |
| ⑵void setHibernateTemplate(HibernateTemplate hibernateTemplate) |
| ②获取方法 |
| ⑴Session getSession() |
| ⑵SessionFactory getSessionFactory() |
| ⑶HibernateTemplate getHibernateTemplate() |
A.DAO实现:继承DAO接口和HibernateDaoSupport辅助类创建DAOImpl实现类,使用HibernateDaoSupport提供的HibernateTemplate模板对象完成DAOImpl类中的CURD的操作方法
B.DAO配置:配置SessionFactory对象,为DaoImpl注入相应的SessionFactory实例下载本文