【第七章】 对JDBC的支持 之 7.5 集成Spring JDBC及最佳实践 ——跟我学spring3

来源:互联网 发布:魅族安卓数据dns修改 编辑:程序博客网 时间:2024/04/28 01:19

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接口

 

java代码:
Java代码 复制代码 收藏代码
  1. package cn.javass.spring.chapter7.dao;   
  2. import cn.javass.spring.chapter7.UserModel;   
  3. public interface IUserDao {   
  4.     public void save(UserModel model);   
  5.     public int countAll();   
  6. }  

 

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

 

java代码:
Java代码 复制代码 收藏代码
  1. package cn.javass.spring.chapter7.dao.jdbc;   
  2. import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;   
  3. import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;   
  4. import cn.javass.spring.chapter7.UserModel;   
  5. import cn.javass.spring.chapter7.dao.IUserDao;   
  6. public class UserJdbcDaoImpl extends SimpleJdbcDaoSupport implements IUserDao {   
  7.   private static final String INSERT_SQL = "insert into test(name) values(:myName)";   
  8.   private static final String COUNT_ALL_SQL = "select count(*) from test";   
  9.     
  10.   @Override  
  11.   public void save(UserModel model) {   
  12.       getSimpleJdbcTemplate().update(INSERT_SQL, new BeanPropertySqlParameterSource(model));   
  13.   }   
  14.   @Override  
  15.   public int countAll() {   
  16.       return getJdbcTemplate().queryForInt(COUNT_ALL_SQL);   
  17.   }   
  18. }  

 

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

 

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

 

java代码:
Java代码 复制代码 收藏代码
  1. <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">   
  2.     <property name="locations">   
  3.       <list>   
  4.           <value>classpath:chapter7/resources.properties</value>   
  5.       </list>   
  6.     </property>   
  7. </bean>   
  8.    

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

 

 

java代码:
Java代码 复制代码 收藏代码
  1. <bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">   
  2.     <property name="targetDataSource">   
  3.       <bean class="org.logicalcobwebs.proxool.ProxoolDataSource">   
  4.           <property name="driver" value="${db.driver.class}" />   
  5.           <property name="driverUrl" value="${db.url}" />   
  6.           <property name="user" value="${db.username}" />   
  7.           <property name="password" value="${db.password}" />   
  8.           <property name="maximumConnectionCount"  
  9.                  value="${proxool.maxConnCount}" />   
  10.           <property name="minimumConnectionCount"  
  11.                  value="${proxool.minConnCount}" />   
  12.           <property name="statistics" value="${proxool.statistics}" />   
  13.           <property name="simultaneousBuildThrottle"  
  14.                    value="${proxool.simultaneousBuildThrottle}" />   
  15.           <property name="trace" value="${proxool.trace}" />   
  16.       </bean>   
  17.     </property>   
  18. </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):

 

java代码:
Java代码 复制代码 收藏代码
  1. proxool.maxConnCount=10  
  2. proxool.minConnCount=5  
  3. proxool.statistics=1m,15m,1h,1d   
  4. proxool.simultaneousBuildThrottle=30  
  5. proxool.trace=false  
  6. db.driver.class=org.hsqldb.jdbcDriver   
  7. db.url=jdbc:hsqldb:mem:test   
  8. db.username=sa   
  9. db.password=   
  10.    

 

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

 

 

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

 

java代码:
Java代码 复制代码 收藏代码
  1. <bean id="abstractDao" abstract="true">   
  2.     <property name="dataSource" ref="dataSource"/>   
  3. </bean>      
  4. <bean id="userDao"  
  5.      class="cn.javass.spring.chapter7.dao.jdbc.UserJdbcDaoImpl"  
  6.     parent="abstractDao"/>   

 

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

 

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

 

java代码:
Java代码 复制代码 收藏代码
  1. @Test  
  2. public void testBestPractice() {   
  3.     String[] configLocations = new String[] {   
  4.             "classpath:chapter7/applicationContext-resources.xml",   
  5.             "classpath:chapter7/applicationContext-jdbc.xml"};   
  6.     ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);   
  7.     IUserDao userDao = ctx.getBean(IUserDao.class);   
  8.     UserModel model = new UserModel();   
  9.     model.setMyName("test");   
  10.     userDao.save(model);   
  11.      Assert.assertEquals(1, userDao.countAll());   
  12. }  

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

 

原创内容,转载请注明出处【http://sishuok.com/forum/blogPost/list/0/2493.html

原创粉丝点击