http://blog.csdn.net/heyang78/article/details/2860695
——————————————————————————————————————————————————————
一般来说涉及数据库的应用中,表的主键有两种生成方案,一种是专门定义一个主键表,在其中放置一个自增长的字段为其它表提供主键;另一种是使用 Oracle的sequence。这两种方案都有一定麻烦,Spring为此专门提供了一个ID增长器以简化具体步骤,下文就是它的相关使用方法的,使用 的数据库是MySql5.
归纳
使用Spring的自增长ID生成器完成以下三步即可:
1)配置自增长id生成器,它需要一个数据源的支持。
2)根据配置将自增长id生成器注入DAO各类中。
3)使用nextStringValue,nextIntValue或nextLongValue方法得到ID。
具体方法请参照以下代码:
1.ID增长器在Spring配置文件中的配置。
归纳
使用Spring的自增长ID生成器完成以下三步即可:
1)配置自增长id生成器,它需要一个数据源的支持。
2)根据配置将自增长id生成器注入DAO各类中。
3)使用nextStringValue,nextIntValue或nextLongValue方法得到ID。
具体方法请参照以下代码:
1.ID增长器在Spring配置文件中的配置。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 数据源 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="org.gjt.mm.mysql.Driver">
</property>
<property name="url" value="jdbc:mysql://127.0.0.1/test">
</property>
<property name="username" value="root"></property>
<property name="password" value="hy"></property>
</bean>
<!-- jdbcTemplate,供各DAO类使用 -->
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<!-- 自增长id生成器 -->
<bean id="idGenarater"
class="org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer">
<property name="incrementerName" value="forumidtable"/>
<property name="columnName" value="sequence_id"/>
<property name="cacheSize" value="10"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- User Service -->
<bean id="userService"
class="com.heyang.service.UserService">
<property name="dao" ref="userDao"/>
<property name="table" value="ForumUser"/>
</bean>
<!-- User Dao -->
<bean id="userDao"
class="com.heyang.dao.UserDao">
<property name="idGenarater" ref="idGenarater"/>
<property name="table" value="ForumUser"/>
<property name="jdbcTemplate">
<ref bean="jdbcTemplate" />
</property>
</bean>
</beans>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 数据源 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="org.gjt.mm.mysql.Driver">
</property>
<property name="url" value="jdbc:mysql://127.0.0.1/test">
</property>
<property name="username" value="root"></property>
<property name="password" value="hy"></property>
</bean>
<!-- jdbcTemplate,供各DAO类使用 -->
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<!-- 自增长id生成器 -->
<bean id="idGenarater"
class="org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer">
<property name="incrementerName" value="forumidtable"/>
<property name="columnName" value="sequence_id"/>
<property name="cacheSize" value="10"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- User Service -->
<bean id="userService"
class="com.heyang.service.UserService">
<property name="dao" ref="userDao"/>
<property name="table" value="ForumUser"/>
</bean>
<!-- User Dao -->
<bean id="userDao"
class="com.heyang.dao.UserDao">
<property name="idGenarater" ref="idGenarater"/>
<property name="table" value="ForumUser"/>
<property name="jdbcTemplate">
<ref bean="jdbcTemplate" />
</property>
</bean>
</beans>
2.自增长ID生成器相关配置。
<!-- 自增长id生成器 -->
<bean id="idGenarater"
class="org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer">
<property name="incrementerName" value="forumidtable"/> // 自增长ID字段所在的表名 “forumidtable”
<property name="columnName" value="sequence_id"/> // 自增长ID字段 “sequence_id”
<property name="cacheSize" value="10"/> // 一次生成ID数目,此设置中一次生成十个,以后从缓存中取,就不用每次都访问数据库了,这样能提高效率
<property name="dataSource" ref="dataSource"/> // 数据源
</bean>
3.使用到自增长ID生成器的BaseDao类,它是UserDao的基类。
通过配置文件将idGenarator注入后,就能使用它。nextStringValue方法用于生成文本类型的ID。
<!-- 自增长id生成器 -->
<bean id="idGenarater"
class="org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer">
<property name="incrementerName" value="forumidtable"/> // 自增长ID字段所在的表名 “forumidtable”
<property name="columnName" value="sequence_id"/> // 自增长ID字段 “sequence_id”
<property name="cacheSize" value="10"/> // 一次生成ID数目,此设置中一次生成十个,以后从缓存中取,就不用每次都访问数据库了,这样能提高效率
<property name="dataSource" ref="dataSource"/> // 数据源
</bean>
3.使用到自增长ID生成器的BaseDao类,它是UserDao的基类。
通过配置文件将idGenarator注入后,就能使用它。nextStringValue方法用于生成文本类型的ID。
package com.heyang.dao.base;
import java.util.List;
import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;
import com.heyang.domain.base.BaseDomainObj;
/**
* 领域对象DAO类的基类
* @author 何杨(heyang78@gmail.com)
*
* @since 2008-8-29 下午09:51:38
* @version 1.00
*/
public abstract class BaseDao extends Dao{
protected String sql;
/**
* 与领域对象存取有关的表
*/
protected String table;
/**
* 记录的主键生成器
*/
protected DataFieldMaxValueIncrementer idGenarater;
/**
* 向数据库中创建一个对象
* @param obj
*/
public void create(BaseDomainObj obj){
if(obj.getId()==null){
obj.setId(idGenarater.nextStringValue());
}
save(obj);
}
/**
* 向数据库中保存一个领域对象
* 强制子类完成
* @param obj
*/
protected abstract void save(BaseDomainObj obj);
/**
* 从数据库中查询一个对象
* 强制子类完成
* @param sql
* @return
*/
public abstract List<BaseDomainObj> search(String sql);
/**
* 更新一个对象
* 强制子类完成
* @param obj
*/
public abstract void update(BaseDomainObj obj);
/**
* 按ID取得一个对象
* @param obj
*/
public BaseDomainObj getById(String id){
sql=" select * from "+table+" where id='"+id+"' ";
List<BaseDomainObj> ls=search(sql);
if(ls.size()==1){
return search(sql).get(0);
}
else{
return null;
}
}
/**
* 删除一个对象
* @param obj
*/
public void delete(BaseDomainObj obj){
String sql="delete from "+table+" where id='"+obj.getId()+"' ";
jdbcTemplate.execute(sql);
}
public String getTable() {
return table;
}
public void setTable(String table) {
this.table = table;
}
public DataFieldMaxValueIncrementer getIdGenarater() {
return idGenarater;
}
public void setIdGenarater(DataFieldMaxValueIncrementer idGenarater) {
this.idGenarater = idGenarater;
}
}
import java.util.List;
import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;
import com.heyang.domain.base.BaseDomainObj;
/**
* 领域对象DAO类的基类
* @author 何杨(heyang78@gmail.com)
*
* @since 2008-8-29 下午09:51:38
* @version 1.00
*/
public abstract class BaseDao extends Dao{
protected String sql;
/**
* 与领域对象存取有关的表
*/
protected String table;
/**
* 记录的主键生成器
*/
protected DataFieldMaxValueIncrementer idGenarater;
/**
* 向数据库中创建一个对象
* @param obj
*/
public void create(BaseDomainObj obj){
if(obj.getId()==null){
obj.setId(idGenarater.nextStringValue());
}
save(obj);
}
/**
* 向数据库中保存一个领域对象
* 强制子类完成
* @param obj
*/
protected abstract void save(BaseDomainObj obj);
/**
* 从数据库中查询一个对象
* 强制子类完成
* @param sql
* @return
*/
public abstract List<BaseDomainObj> search(String sql);
/**
* 更新一个对象
* 强制子类完成
* @param obj
*/
public abstract void update(BaseDomainObj obj);
/**
* 按ID取得一个对象
* @param obj
*/
public BaseDomainObj getById(String id){
sql=" select * from "+table+" where id='"+id+"' ";
List<BaseDomainObj> ls=search(sql);
if(ls.size()==1){
return search(sql).get(0);
}
else{
return null;
}
}
/**
* 删除一个对象
* @param obj
*/
public void delete(BaseDomainObj obj){
String sql="delete from "+table+" where id='"+obj.getId()+"' ";
jdbcTemplate.execute(sql);
}
public String getTable() {
return table;
}
public void setTable(String table) {
this.table = table;
}
public DataFieldMaxValueIncrementer getIdGenarater() {
return idGenarater;
}
public void setIdGenarater(DataFieldMaxValueIncrementer idGenarater) {
this.idGenarater = idGenarater;
}
}