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


    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;
        }    
    }

    ——————————————————————————————————
    傲轩游戏网
  • 相关阅读:
    activemq学习
    shell变量
    ext3文件系统目录限制问题
    linux性能优化cpu 磁盘IO MEM
    vs2010下编译osip2和eXosip2的4.0.0版的静态库及搭建开发环境
    samba的rpm包,只有tar.gz文件安装
    随记
    mount/umount系统调用
    不定参数的传递VA_LIST的用法
    samba服务器源码安装(非rpm)
  • 原文地址:https://www.cnblogs.com/cuizhf/p/2680097.html
Copyright © 2020-2023  润新知