聊聊持久化。 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实例。
可是仍然很不方便!
因此须要采用第三方框架.