Spring筆記8---數據庫持久化

聊聊持久化。 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實例。

可是仍然很不方便!

因此須要採用第三方框架.

相關文章
相關標籤/搜索