博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring的ID增长器使用示例(MySql数据库)
阅读量:5788 次
发布时间:2019-06-18

本文共 4106 字,大约阅读时间需要 13 分钟。

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

 

 

你可能感兴趣的文章
MyBatis3-SqlSessionDaoSupport的使用
查看>>
ReactiveSwift源码解析(三) Signal代码的基本实现
查看>>
MVC模式利用xib文件定制collectionCell
查看>>
(六)Oracle学习笔记—— 约束
查看>>
【SQL】查询数据库中某个字段有重复值出现的信息
查看>>
mysql 行转列 列转行
查看>>
[Oracle]如何在Oracle中设置Event
查看>>
top.location.href和localtion.href有什么不同
查看>>
02-创建hibernate工程
查看>>
Open Graph Protocol(开放内容协议)
查看>>
模块化(1):基本思路
查看>>
Ubuntu18.04中配置QT5.11开发环境
查看>>
Exception的妙用
查看>>
基于浏览器的开源“管理+开发”工具,Pivotal MySQL*Web正式上线!
查看>>
JavaScript(五):变量的作用域
查看>>
知识图谱在互联网金融中的应用
查看>>
MySQL 到底能不能放到 Docker 里跑?
查看>>
wpf 自定义窗口,最大化时覆盖任务栏解决方案
查看>>
【docker】关于docker 中 镜像、容器的关系理解
查看>>
information_schema系列五(表,触发器,视图,存储过程和函数)
查看>>