# 【第七章】 對JDBC的支持 之 7.5 集成Spring JDBC及最佳實踐 ——跟我學spring3
## 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實現非常簡單。
原創內容,轉載請注明出處【[http://sishuok.com/forum/blogPost/list/0/2493.html](http://sishuok.com/forum/blogPost/list/0/2493.html#7208)】
- 跟我學 Spring3
- 【第二章】 IoC 之 2.1 IoC基礎 ——跟我學Spring3
- 【第二章】 IoC 之 2.2 IoC 容器基本原理 ——跟我學Spring3
- 【第二章】 IoC 之 2.3 IoC的配置使用——跟我學Spring3
- 【第三章】 DI 之 3.1 DI的配置使用 ——跟我學spring3
- 【第三章】 DI 之 3.2 循環依賴 ——跟我學spring3
- 【第三章】 DI 之 3.3 更多DI的知識 ——跟我學spring3
- 【第三章】 DI 之 3.4 Bean的作用域 ——跟我學spring3
- 【第四章】 資源 之 4.1 基礎知識 ——跟我學spring3
- 【第四章】 資源 之 4.2 內置Resource實現 ——跟我學spring3
- 【第四章】 資源 之 4.3 訪問Resource ——跟我學spring3
- 【第四章】 資源 之 4.4 Resource通配符路徑 ——跟我學spring3
- 【第五章】Spring表達式語言 之 5.1 概述 5.2 SpEL基礎 ——跟我學spring3
- 【第五章】Spring表達式語言 之 5.3 SpEL語法 ——跟我學spring3
- 【第五章】Spring表達式語言 之 5.4在Bean定義中使用EL—跟我學spring3
- 【第六章】 AOP 之 6.1 AOP基礎 ——跟我學spring3
- 【第六章】 AOP 之 6.2 AOP的HelloWorld ——跟我學spring3
- 【第六章】 AOP 之 6.3 基于Schema的AOP ——跟我學spring3
- 【第六章】 AOP 之 6.4 基于@AspectJ的AOP ——跟我學spring3
- 【第六章】 AOP 之 6.5 AspectJ切入點語法詳解 ——跟我學spring3
- 【第六章】 AOP 之 6.6 通知參數 ——跟我學spring3
- 【第六章】 AOP 之 6.7 通知順序 ——跟我學spring3
- 【第六章】 AOP 之 6.8 切面實例化模型 ——跟我學spring3
- 【第六章】 AOP 之 6.9 代理機制 ——跟我學spring3
- 【第七章】 對JDBC的支持 之 7.1 概述 ——跟我學spring3
- 【第七章】 對JDBC的支持 之 7.2 JDBC模板類 ——跟我學spring3
- 【第七章】 對JDBC的支持 之 7.3 關系數據庫操作對象化 ——跟我學spring3
- 【第七章】 對JDBC的支持 之 7.4 Spring提供的其它幫助 ——跟我學spring3【私塾在線原創】
- 【第七章】 對JDBC的支持 之 7.5 集成Spring JDBC及最佳實踐 ——跟我學spring3
- 【第八章】 對ORM的支持 之 8.1 概述 ——跟我學spring3
- 【第八章】 對ORM的支持 之 8.2 集成Hibernate3 ——跟我學spring3
- 【第八章】 對ORM的支持 之 8.3 集成iBATIS ——跟我學spring3
- 【第八章】 對ORM的支持 之 8.4 集成JPA ——跟我學spring3
- 【第九章】 Spring的事務 之 9.1 數據庫事務概述 ——跟我學spring3
- 【第九章】 Spring的事務 之 9.2 事務管理器 ——跟我學spring3
- 【第九章】 Spring的事務 之 9.3 編程式事務 ——跟我學spring3
- 【第九章】 Spring的事務 之 9.4 聲明式事務 ——跟我學spring3
- 【第十章】集成其它Web框架 之 10.1 概述 ——跟我學spring3
- 【第十章】集成其它Web框架 之 10.2 集成Struts1.x ——跟我學spring3
- 【第十章】集成其它Web框架 之 10.3 集成Struts2.x ——跟我學spring3
- 【第十章】集成其它Web框架 之 10.4 集成JSF ——跟我學spring3
- 【第十一章】 SSH集成開發積分商城 之 11.1 概述 ——跟我學spring3
- 【第十一章】 SSH集成開發積分商城 之 11.2 實現通用層 ——跟我學spring3
- 【第十一章】 SSH集成開發積分商城 之 11.3 實現積分商城層 ——跟我學spring3
- 【第十二章】零配置 之 12.1 概述 ——跟我學spring3
- 【第十二章】零配置 之 12.2 注解實現Bean依賴注入 ——跟我學spring3
- 【第十二章】零配置 之 12.3 注解實現Bean定義 ——跟我學spring3
- 【第十二章】零配置 之 12.4 基于Java類定義Bean配置元數據 ——跟我學spring3
- 【第十二章】零配置 之 12.5 綜合示例-積分商城 ——跟我學spring3
- 【第十三章】 測試 之 13.1 概述 13.2 單元測試 ——跟我學spring3
- 【第十三章】 測試 之 13.3 集成測試 ——跟我學spring3
- 跟我學 Spring MVC
- SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常見問題總結
- Spring Web MVC中的頁面緩存支持 ——跟我學SpringMVC系列
- Spring3 Web MVC下的數據類型轉換(第一篇)——《跟我學Spring3 Web MVC》搶先看
- Spring3 Web MVC下的數據格式化(第二篇)——《跟我學Spring3 Web MVC》搶先看
- 第一章 Web MVC簡介 —— 跟開濤學SpringMVC
- 第二章 Spring MVC入門 —— 跟開濤學SpringMVC
- 第三章 DispatcherServlet詳解 ——跟開濤學SpringMVC
- 第四章 Controller接口控制器詳解(1)——跟著開濤學SpringMVC
- 第四章 Controller接口控制器詳解(2)——跟著開濤學SpringMVC
- 第四章 Controller接口控制器詳解(3)——跟著開濤學SpringMVC
- 第四章 Controller接口控制器詳解 (4)——跟著開濤學SpringMVC
- 第四章 Controller接口控制器詳解(5)——跟著開濤學SpringMVC
- 跟著開濤學SpringMVC 第一章源代碼下載
- 第二章 Spring MVC入門 源代碼下載
- 第四章 Controller接口控制器詳解 源代碼下載
- 第四章 Controller接口控制器詳解(6)——跟著開濤學SpringMVC
- 第四章 Controller接口控制器詳解(7 完)——跟著開濤學SpringMVC
- 第五章 處理器攔截器詳解——跟著開濤學SpringMVC
- 源代碼下載 第五章 處理器攔截器詳解——跟著開濤學SpringMVC
- 注解式控制器運行流程及處理器定義 第六章 注解式控制器詳解——跟著開濤學SpringMVC
- 源代碼下載 第六章 注解式控制器詳解
- SpringMVC3強大的請求映射規則詳解 第六章 注解式控制器詳解——跟著開濤學SpringMVC
- Spring MVC 3.1新特性 生產者、消費者請求限定 —— 第六章 注解式控制器詳解——跟著開濤學SpringMVC
- SpringMVC強大的數據綁定(1)——第六章 注解式控制器詳解——跟著開濤學SpringMVC
- SpringMVC強大的數據綁定(2)——第六章 注解式控制器詳解——跟著開濤學SpringMVC
- SpringMVC數據類型轉換——第七章 注解式控制器的數據驗證、類型轉換及格式化——跟著開濤學SpringMVC
- SpringMVC數據格式化——第七章 注解式控制器的數據驗證、類型轉換及格式化——跟著開濤學SpringMVC
- SpringMVC數據驗證——第七章 注解式控制器的數據驗證、類型轉換及格式化——跟著開濤學SpringMVC