春风博客

春天里,百花香...

导航

<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

公告

MAIL: junglesong@gmail.com
MSN: junglesong_5@hotmail.com

Locations of visitors to this page

常用链接

留言簿(11)

随笔分类(224)

随笔档案(126)

个人软件下载

我的其它博客

我的邻居们

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

Spring的ID增长器使用示例(MySql数据库)

一般来说涉及数据库的应用中,表的主键有两种生成方案,一种是专门定义一个主键表,在其中放置一个自增长的字段为其它表提供主键;另一种是使用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;
    }
    
}


posted on 2008-09-01 11:30 sitinspring 阅读(4426) 评论(1)  编辑  收藏 所属分类: SSH

评论

# re: Spring的ID增长器使用示例(MySql数据库) 2015-03-09 14:33 zuidaima

Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解 http://zuidaima.com/share/1772661373422592.htm  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
sitinspring(http://www.blogjava.net)原创,转载请注明出处.