您的位置:首页 > 编程语言 > Java开发

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

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

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: