聊聊持久化。 java
------------------------Spring的平臺無關持久化異常 spring
下面是Spring提供的數據訪問模板,分別適用於不一樣的持久化機制 sql
模板類org.springframework.* 用途 數據庫
jca.cci.core.CciTemplate JCA CCI鏈接 apache
jdbc.core.JdbcTemplate JDBC鏈接 服務器
jdbc.core.namedparam.NamedParameterJdbcTemplate 支持命名參數的JDBC鏈接 session
jdbc.core.simple.SimpleJdbcTemplate 經過java5簡化後的JDBC鏈接 app
orm.hibernate.HibernateTemplate Hibernate2.x的session 框架
orm.hibernate3.HibernateTemplate Hibernate3.x的session this
orm.ibatis.SqlMapClientTemplate iBATIS SqlMap客戶端
orm.jdo.JdoTemplate Java數據對象(JAVA DATA OBJECT)實現
orm.jpa.JpaTemplate JAVA持久化API的實體管理器
---------------------------------------------------------------------------------------
Spring DAO支持類提供了便捷的方式來使用數據訪問模板
DAO支持類(org.springframework.*) 爲誰提供DAO支持
jca.cci.support.CciDaoSupport JCA CCI鏈接
jdbc.core.support.JdbcDaoSupport JDBC鏈接
jdbc.core.namedparam.NamedParameterJdbcDaoSupport 帶有命名參數的JDBC鏈接
jdbc.core.simple.SimpleJdbcDaoSupport 用JAVA5進行了簡化的JDBC鏈接
orm.hibernate.support.HibernateDaoSupport Hibernate2.x的session
orm.hibernate3.support.HibernateDaoSupport Hibernate3.x的session
orm.ibatis.support.SqlMapClientDaoSupport iBATIS SqlMap客戶端
orm.jdo.support.JdoDaoSupport Java數據對象實現
orm.jpa.support.JpaDaoSupport Java持久化API的實現管理器
---------------------------------------配置數據源
兵馬未動,糧草先行,先看看怎麼配置數據源。
配置方式有:
1 經過JDBC驅動程序定義的數據源
不適合生產環境,不講解
2 經過JNDI查找的數據源
<jee:jndi-lookup id="dataSource" jndi-name="/jdbc/SpitterDS" resource-ref="true" />
在java應用程序服務器中,須要將resource-ref="true",這樣jndi-name會自動添加「java:comp/env/」前綴。
3 鏈接池的數據源 :生產環境中建議使用從鏈接池獲取鏈接的數據源
<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:hsql://localhost/spitter/spitter" />
<property name="username" value="xxx" />
<property name="password" value="" />
<property name="initialSize" value="5" />
<property name="maxActive" value="10" />
</bean>
其它屬性
initialSize 池啓動時建立的鏈接數量
maxActive 同一時間可從池中分配的最多鏈接數,爲0則表示無限制
maxIdle 池中不會被釋放的最多空閒鏈接數,0表示無限制
maxOpenPreparedStatements 同一時間可以從語句池中分配的預處理語句的最大數量,設置爲0表示無限制。
maxWait 在拋出異常前,池等待鏈接回收的最大時間(當沒有可用鏈接時),若是設置爲-1,表示無限等待。
minEvictableIdleTimeMillis 鏈接在池中保持空閒而不被回收的最大時間
minIdle 在不建立新鏈接的狀況下,池中保持空閒的最小鏈接數
poolPreparedStatements 是否對預處理語句進行池管理(布爾值)
-------------------------------------------------------------------------------------
在Spring中使用JDBC
持久化機制有不少,Hibernate,iBATIS和JPA只是其中的一部分而已。
還有最古老的JDBC(太冗繁)(可是可使用數據庫的全部特性)!
可是古老的JDBC有太多模板代碼須要重複,因此可使用JDBC模板來解決這個問題。
Spring爲JDBC提供了3個模板類供使用:
1 JdbcTemplate:最基本的Spring JDBC模板,這個模板支持最簡單的JDBC數據庫訪問功能以及簡單的索引參數查詢。
2 NamedParameterJdbcTemplate:使用該模板類執行查詢時,能夠將查詢值以命名參數的形式綁定到SQL中,而不是使用簡單的索引參數。
3 SimpleJdbcTemplate:該模板類利用java 5的一些特性,如自動裝箱,泛型以及可變參數列表來簡化JDBC模板的使用。
隨便版本的推移,只關注SimpleJdbcTemplate
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg ref="dataSource" />
</bean>
屬性datasource能夠是javax.sql.DataSource的任意實現,包括以前建立的。
public class JdbcSplitterDAO implements SpitterDAO{
...
private SimpleJdbcTemplate jdbcTemplate;
public void setJdbcTemplate(SimpleJdbcTemplate jdbcTemplate){
this.jdbcTemplate=jdbcTemplate;
}
}
<bean id="splitterDao" class="com.habuma.spitter.persistence.SimpleJdbcTemplateSpitterDao">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
而後應用程序中就能夠:
public void addSpitter(Spitter spitter){
jdbcTemplate.update(SQL_INSERT_SPITTER,
spitter.getUsername(),
spitter.getPassword(),
spitter.getFullName(),
spitter.getEmail(),
spitter.isUpdateByEmail()
);
spitter.setId(queryForIdentity());
}
SQL_INSERT_SPITTER是這麼定義的
"insert into spitter(username,password,fullname) value(:username,:password,:fullname) ";
查詢:
jdbcTemplate.queryForObject{
SQL_SELECT_SPITTER_BY_ID,
new ParameterizedRowMapper<Spitter>(){
public Spitter mapRow(ResultSet rs,int rowNum) throws SQLException{
Spitter spitter = new Spitter();
... rs.getLong(1) rs.getString(2)..
return spitter;
}
} ,
id
);
}
---
新版本
public void addSpitter(Spitter spitter){
Map<String,Object> params=new HashMap<String,Object>();
params.put("username",xxx);
params.put("password",xxx);
params.put("fullname",xxx);
jdbcTemplate.update(SQL_INSERT_SPITTER,params);
-------------
若是隻有一個訪問數據庫的對象,那事情很簡單,若是有多個呢?
1 父類存在jdbcTemplate對象,從父類獲取此對象
spring提供了3個這樣的類(JdbcDaoSupport,SimpleJdbcDaoSupport和NamedParameterJdbcDaoSupport)
每一個類分別對應不一樣的spring JDBC模板。
要使用的話,首先讓本身的類以下:
public class JdbcSpitterDao extends SimpleJdbcDaoSupport implements SpitterDao{
...
經過getSimpleJdbcTemplate()獲取對象
}
<bean id="xxx" class="本身的類" >
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
可是這與以前並沒有本質區別!
另外一種方法:
<bean id="xxx" class="本身的類" > 這個類extends SimpleJdbcDaoSupport
<property name="jdbcDatasource" ref="jdbcDatasource" />
</bean>
會內部自動建立一個SimpleJdbcTemplate實例。
可是仍然很不方便!
因此須要採用第三方框架.