开涛spring3(7.5) - 对JDBC的支持 之 7.5 集成Spring JDBC及最佳实践

7.5 集成Spring JDBC及最佳实践

大多数情况下Spring JDBC都是与IOC容器一起使用。通过配置方式使用Spring JDBC。

而且大部分时间都是使用JdbcTemplate类(或SimpleJdbcTemplate和NamedParameterJdbcTemplate)进行开发,即可能80%时间使用JdbcTemplate类,而只有20%时间使用其他类开发,符合80/20法则。

 

Spring JDBC通过实现DaoSupport来支持一致的数据库访问。

Spring JDBC提供如下DaoSupport实现:

  • JdbcDaoSupport用于支持一致的JdbcTemplate访问;
  • NamedParameterJdbcDaoSupport:继承JdbcDaoSupport,同时提供NamedParameterJdbcTemplate访问;
  • SimpleJdbcDaoSupport继承JdbcDaoSupport,同时提供SimpleJdbcTemplate访问。

由于JdbcTemplate、NamedParameterJdbcTemplate、 SimpleJdbcTemplate类使用DataSourceUtils获取及释放连接,而且连接是与线程绑定的,因此这些JDBC模板类是线程安全 的,即JdbcTemplate对象可以在多线程中重用。

接下来看一下Spring JDBC框架的最佳实践:

1)首先定义Dao接口

    package cn.javass.spring.chapter7.dao;
    import cn.javass.spring.chapter7.UserModel;
    public interface IUserDao {
        public void save(UserModel model);
        public int countAll();
    }  

2)定义Dao实现,此处是使用Spring JDBC实现:

    package cn.javass.spring.chapter7.dao.jdbc;
    import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
    import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
    import cn.javass.spring.chapter7.UserModel;
    import cn.javass.spring.chapter7.dao.IUserDao;
    public class UserJdbcDaoImpl extends SimpleJdbcDaoSupport implements IUserDao {
      private static final String INSERT_SQL = "insert into test(name) values(:myName)";
      private static final String COUNT_ALL_SQL = "select count(*) from test";  

      @Override
      public void save(UserModel model) {
          getSimpleJdbcTemplate().update(INSERT_SQL, new BeanPropertySqlParameterSource(model));
      }
      @Override
      public int countAll() {
          return getJdbcTemplate().queryForInt(COUNT_ALL_SQL);
      }
    }  

此处注意首先Spring JDBC实现放在dao.jdbc包里,如果有hibernate实现就放在dao.hibernate包里;其次实现类命名如 UserJdbcDaoImpl,即×××JdbcDaoImpl,当然如果自己有更好的命名规范可以遵循自己的,此处只是提个建议。

3)进行资源配置(resources/chapter7/applicationContext-resources.xml):

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
      <list>
          <value>classpath:chapter7/resources.properties</value>
      </list>
    </property>
</bean>  

PropertyPlaceholderConfigurer用于替换配置元数据,如本示例中将对bean定义中的${…}占位符资源用“classpath:chapter7/resources.properties”中相应的元素替换。

bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
    <property name="targetDataSource">
      <bean class="org.logicalcobwebs.proxool.ProxoolDataSource">
          <property name="driver" value="${db.driver.class}" />
          <property name="driverUrl" value="${db.url}" />
          <property name="user" value="${db.username}" />
          <property name="password" value="${db.password}" />
          <property name="maximumConnectionCount"
                 value="${proxool.maxConnCount}" />
          <property name="minimumConnectionCount"
                 value="${proxool.minConnCount}" />
          <property name="statistics" value="${proxool.statistics}" />
          <property name="simultaneousBuildThrottle"
                   value="${proxool.simultaneousBuildThrottle}" />
          <property name="trace" value="${proxool.trace}" />
      </bean>
    </property>
</bean>  

dataSource定义数据源,本示例使用proxool数据库连接池,并使用LazyConnectionDataSourceProxy包装它,从 而延迟获取数据库连接;${db.driver.class}将被“classpath:chapter7/resources.properties” 中的“db.driver.class”元素属性值替换。

proxool数据库连接池:本示例使用proxool-0.9.1版本,请到proxool官网下载并添加proxool-0.9.1.jar和proxool-cglib.jar到类路径。

ProxoolDataSource属性含义如下:

  • driver:指定数据库驱动;
  • driverUrl:数据库连接;
  • username:用户名;
  • password:密码;
  • maximumConnectionCount:连接池最大连接数量;
  • minimumConnectionCount:连接池最小连接数量;
  • statistics:连接池使用样本状况统计;如1m,15m,1h,1d表示没1分钟、15分钟、1小时及1天进行一次样本统计;
  • simultaneousBuildThrottle:一次可以创建连接的最大数量;
  • trace:true表示被执行的每个sql都将被记录(DEBUG级别时被打印到相应的日志文件);

4)定义资源文件(classpath:chapter7/resources.properties):

proxool.maxConnCount=10
proxool.minConnCount=5
proxool.statistics=1m,15m,1h,1d
proxool.simultaneousBuildThrottle=30
proxool.trace=false
db.driver.class=org.hsqldb.jdbcDriver
db.url=jdbc:hsqldb:mem:test
db.username=sa
db.password=  

用于替换配置元数据中相应的占位符数据,如${db.driver.class}将被替换为“org.hsqldb.jdbcDriver”。

5)dao定义配置(chapter7/applicationContext-jdbc.xml):

    <bean id="abstractDao" abstract="true">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <bean id="userDao"
         class="cn.javass.spring.chapter7.dao.jdbc.UserJdbcDaoImpl"
        parent="abstractDao"/>   

首先定义抽象的abstractDao,其有一个dataSource属性,从而可以让继承的子类自动继承dataSource属性注入;然后定义 userDao,且继承abstractDao,从而继承dataSource注入;我们在此给配置文件命名为applicationContext- jdbc.xml表示Spring JDBC DAO实现;如果使用hibernate实现可以给配置文件命名为applicationContext-hibernate.xml。

6) 最后测试一下吧(cn.javass.spring.chapter7. JdbcTemplateTest):

    @Test
    public void testBestPractice() {
        String[] configLocations = new String[] {
                "classpath:chapter7/applicationContext-resources.xml",
                "classpath:chapter7/applicationContext-jdbc.xml"};
        ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);
        IUserDao userDao = ctx.getBean(IUserDao.class);
        UserModel model = new UserModel();
        model.setMyName("test");
        userDao.save(model);
         Assert.assertEquals(1, userDao.countAll());
    }  

首先读取配置文件,获取IUserDao接口实现,然后再调用IUserDao接口方法,进行数据库操作,这样对于开发人员使用来说,只面向接口,不关心实现,因此很容易更换实现,比如像更换为hibernate实现非常简单。

时间: 2024-10-12 13:23:00

开涛spring3(7.5) - 对JDBC的支持 之 7.5 集成Spring JDBC及最佳实践的相关文章

开涛spring3(8.1) - 对ORM的支持 之 8.1 概述

8.1  概述 8.1.1  ORM框架 ORM全称对象关系映射(Object/Relation Mapping),指将Java对象状态自动映射到关系数据库中的数据上,从而提供透明化的持久化支持,即把一种形式转化为另一种形式. 对象与关系数据库之间是不匹配,我们把这种不匹配称为阻抗失配,主要表现在: 关系数据库首先不支持面向对象技术如继承.多态,如何使关系数据库支持它们: 关系数据库是由表来存放数据,而面向对象使用对象来存放状态:其中表的列称为属性,而对象的属性就是属性,因此需要通过解决这种不匹

开涛spring3(7.2) - 对JDBC的支持 之 7.2 JDBC模板类

7.2  JDBC模板类 7.2.1  概述 Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式. JdbcTemplate类通过模板设计模式帮助我们消除了冗长的代码,只做需要做的事情(即可变部分),并且帮我们做哪些固定部分,如连接的创建及关闭. JdbcTemplate类对可变部分采用回调接口方式实现,如ConnectionCallback通过回调接口返回给用户一个连

开涛spring3(6.9) - 对JDBC的支持 之 7.1 概述

7.1  概述 7.1.1  JDBC回顾 传统应用程序开发中,进行JDBC编程是相当痛苦的,如下所示: //cn.javass.spring.chapter7. TraditionalJdbcTest @Test public void test() throws Exception { Connection conn = null; PreparedStatement pstmt = null; try { conn = getConnection(); //1.获取JDBC连接 //2.声

开涛spring3(7.3) - 对JDBC的支持 之 7.3 关系数据库操作对象化

7.3.1  概述 所谓关系数据库对象化其实就是用面向对象方式表示关系数据库操作,从而可以复用. Spring JDBC框架将数据库操作封装为一个RdbmsOperation,该对象是线程安全的.可复用的对象,是所有数据库对象的父类.而 SqlOperation继承了RdbmsOperation,代表了数据库SQL操作,如select.update.call等,如图7-4所示. 数据库操作对象化只要有以下几种类型,所以类型是线程安全及可复用的: 查询:将数据库操作select封装为对象,查询操作

开涛spring3(7.4) - 对JDBC的支持 之 7.4 Spring提供的其它帮助

7.4  Spring提供的其它帮助 7.4.1  SimpleJdbc方式 Spring JDBC抽象框架提供SimpleJdbcInsert和SimpleJdbcCall类,这两个类通过利用JDBC驱动提供的数据库元数据来简化JDBC操作. 1.SimpleJdbcInsert: 用于插入数据,根据数据库元数据进行插入数据,本类用于简化插入操作,提供三种类型方法:execute方法用于普通插入. executeAndReturnKey及executeAndReturnKeyHolder方法用

开涛spring3(1) - Spring概述

1.1.1  Spring是什么 Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发.应用程序是由一组相互协作的对象组成.而在传统应用程序开发中,一个完整的应用是由一组相 互协作的对象组成.所以开发一个应用除了要开发业务逻辑之外,最多的是关注如何使这些对象协作来完成所需功能,而且要低耦合.高内聚.业务逻辑开发是不可 避免的,那如果有个框架出来帮我们来创建对象及管理这些对象之间的依赖关系.可能有人

开涛spring3(12.2) - 零配置 之 12.2 注解实现Bean依赖注入

12.2  注解实现Bean依赖注入 12.2.1  概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的数据将覆盖基于注解配置中的依赖注入的数据. Spring3的基于注解实现Bean依赖注入支持如下三种注解: Spring自带依赖注入注解: Spring自带的一套依赖注入注解: JSR-250注解:Java平台的公共注解,是Java EE 5规范之一,在JDK6中默认包含这些注解,从Spring2.

开涛spring3(9.2) - Spring的事务 之 9.2 数据库事务概述

9.2.1  概述 Spring框架支持事务管理的核心是事务管理器抽象,对于不同的数据访问框架(如Hibernate)通过实现策略接口 PlatformTransactionManager,从而能支持各种数据访问框架的事务管理,PlatformTransactionManager 接口定义如下: public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition

开涛spring3(3.1) - DI的配置使用

3.1.1  依赖和依赖注入 传统应用程序设计中所说的依赖一般指“类之间的关系”,那先让我们复习一下类之间的关系: 泛化:表示类与类之间的继承关系.接口与接口之间的继承关系: 实现:表示类对接口的实现: 依赖:当类与类之间有使用关系时就属于依赖关系,不同于关联关系,依赖不具有“拥有关系”,而是一种“相识关系”,只在某个特定地方(比如某个方法体内)才有关系. 关联:表示类与类或类与接口之间的依赖关系,表现为“拥有关系”:具体到代码可以用实例变量来表示: 聚合:属于是关联的特殊情况,体现部分-整体关