Spring 实战-第十章-通过Spring和JDBC征服数据库

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

 

posted on 2017-12-07 17:41  Lv Jianwei  阅读(376)  评论(0编辑  收藏  举报