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

mac2022-06-30  15

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

 

 

转载于:https://www.cnblogs.com/cuizhf/archive/2012/09/11/2680097.html

最新回复(0)