Spring的数据访问哲学
为了避免应用和特定的数据访问策略耦合,编写良好的Repository应该以接口的方式暴露功能。
传统的JDBC抛出异常只有SQLException,太过笼统不利于定位问题,于此同时,Spring提供了更加丰富的数据库异常,这些异常都继承自DataAccessException,它的特殊之处在于是一个非检查异常,就是说在使用Spring的时候不需要捕获抛出的异常。
Spring认为触发异常的很多问题是不能在catche代码块中修复的。Spring使用非检查型异常,而不是强制开发人员编写catch代码块,这把是否要捕获异常的权利留给了开发人员。
Java JDBC编写的时候,需要编写大量相似的代码(如异常处理),这是非常乏味的事情,为了解决这个问题,Spring使用了模板方法的设计模式。模板方法定义了过程的主要框架,模板方法将过程中雨特定实现相关的部分委托给接口,而这个接口的不同实现定义了过程中的具体行为。
Spring将数据访问过程中固定的和可变的部分明确划分为两个不同的类:模板(template)和回调(callback)。模板管理过程中固定的部分,而回调处理自定义的数据访问代码。
针对不同的持久化平台,Spring提供了多个可选的模板。
模板类(org.springframework.*) | 用途 |
jca.cci.core.CciTemplate | JCA CCI连接 |
jdbc.core.JdbcTemplate | JDBC连接 |
jdbc.core.namedparam.NamedParameterJdbcTemplate | 支持命名参数的JDBC连接 |
jdbc.core.simple.SimpleJdbcTemplate | 通过Java5简化后的JDBC连接 |
orm.hibernate3.HibernateTemplate | Hibernate 3.x以上的Session |
orm.ibatis.SqlMapClientTemplate | iBatis SqlMap客户端 |
orm.jdo.JdoTemplate | Java数据对象(Java Data Object)实现 |
orm.jpa.JpaTemplate | Java持久化API的实体管理器 |
配置数据源
Spring提供了在Spring上下文中配置数据源bean的多种方式:
- 通过JNDI查找的数据源,
通过JNDI查找数据源的好处在于数据源完全可以在应用程序之外进行管理,另外,在应用服务器中管理的数据源通常以池的方式组织,从而具备更好的性能,并且支持热切换。
- 连接池的数据源,
Spring没有提供数据源链接池的实现,但是有很多第三方方案。
- 通过JDBC驱动程序定义的数据源,
通过JDBC驱动定义数据源是最简单的配置方式,Spring提供了三个数据源(org.springframework.jdbc.datasource包中):
- DriverManageDataSource:在每个连接请求时都返回一个新建的连接。没有池管理。
- SimpleDriverDataSource:直接使用JDBC驱动,解决特定环境下的类加载问题,如OSGi容器
- SingleConnectionDataSource:在每个连接请求时都会返回同一个连接。
- 使用嵌入式的数据源
方便开发和测试,每次重启应用或者运行测试的时候,都能够重新填充测试数据。
对于不同环境使用的不同的数据源,可是通过profile实现。
在Spring中使用JDBC
Java JDBC数据访问需要很多样板代码,用来保证数据访问的健壮性,Spring的JDBC框架承担了资源管理和异常处理的功能,从而简化了JDBC代码。
Spring为JDBC提供了三个模板类共选择:
- JdbcTemplate:最基本的Spring JDBC模板,这个模板支持简单的JDBC数据库访问功能以及基于索引参数的查询;
- NamedParameterJdbcTemplate:使用该模板类执行查询时可以将值以命名参赛的形式绑定到SQL中,而不是使用简单的索引参数;
- SimpleJdbcTemplate:改模板类利用Java 5的一些特性如自动装箱、泛型以及可变参数列表来简化JDBC模板的使用。(已废弃)
使用JdbcTemplate的时候需要为JdbcTemplate配置数据源
@Bean public JdbcTemplate jdbcTemplate(DataSource dataSorce){ return new JdbcTemplate(dataSorce); }
sourceCode:https://github.com/ljw8947/SpringInAction/tree/master/Chapter%2010/jdbc