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配置文件中的配置。
<? 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 >
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。
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; } }