`
yiheng
  • 浏览: 156637 次
社区版块
存档分类

实现兼容各种数据库表字段的主键id自增

阅读更多

在数据库操作中,插入数据库信息的时候往往需要使其数据库的中的表字段的主键id能够自增,虽然有的数据库的表字段可也直接在设计的时候就写成自增,比如mysql,但是有的数据库却在实现表字段的自增上却不是很好使,而且各种数据库的实现方式可能不同,所以问了简单统一的管理,方便数据库的移植,而不需要改变SQL创建语句,所以可以单独的创建一个表,专门用于管理数据库表字段主键id的自增,该表(t_table_id)可以按下面这样设计:有一个表名字段table_name(存放需要自增id的表名称),一个是当前对应表的主键id的值value。

创建上面的表之后,然后想该表中插入对应的要进行自增表字段主键id的表的信息。比如:insert into t_table_id table_name,value values('t_client',1);这个语句为表t_client设置主键id冲1开始自增。

其实简单的这样设计了还并不能实现自增,还需要编写代码来进行实现,下面就通过编写java代码来进行实现:

package org.ml.drp.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * id生成器
 * @author MuLing
 *
 */
public class IdGenerator {

	/**
	 * 根据表名生成该表的序列
	 * @param tableName
	 * @return 返回生成的序列
	 */ 
	public static int generate(String tableName) {
		//使用数据库的悲观锁for update
		String sql = "select value from t_table_id where table_name=? for update";
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		int value = 0;
		try {
			conn = DbUtil.getConnection();
			//开始事务
			DbUtil.beginTransaction(conn);
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, tableName);
			rs = pstmt.executeQuery();
			if (!rs.next()) {
				throw new RuntimeException();
			}
			value = rs.getInt("value");
			value++; //自加
			modifyValueField(conn, tableName, value);//修改对应序列字段的值 
			//提交事务
			DbUtil.commitTransaction(conn);
		}catch(Exception e) {
			e.printStackTrace();
			//回滚事务
			DbUtil.rollbackTransaction(conn);
			throw new RuntimeException();
		}finally {
			DbUtil.close(rs);
			DbUtil.close(pstmt);
			DbUtil.resetConnection(conn); //重置Connection的状态
			DbUtil.close(conn);
		}
		return value;
	}
	
	/**
	 * 根据表名更新序列字段的值
	 * @param conn
	 * @param tableName
	 * @param value
	 */
	private static void modifyValueField(Connection conn, String tableName, int value) 
	throws SQLException {
		String sql = "update t_table_id set value=? where table_name=?";
		PreparedStatement pstmt = null;
		try {
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, value);
			pstmt.setString(2, tableName);
			pstmt.executeUpdate();
		}finally {
			DbUtil.close(pstmt);
		}
	} 
	
	public static void main(String[] args) {
		int retValue = IdGenerator.generate("t_client");
		System.out.println(retValue);
	}
}
另外附加下面的数据库工具类(DbUtil.java)中的几个方法实现:

        public static void resetConnection(Connection conn) {
		try {
			if (conn != null) {
				if (conn.getAutoCommit()) {
					conn.setAutoCommit(false);
				}else {
					conn.setAutoCommit(true);
				}
			}
		}catch(SQLException e) {}
	}
	 
	public static void beginTransaction(Connection conn) {
		try {
			if (conn != null) {
				if (conn.getAutoCommit()) {
					conn.setAutoCommit(false); //手动提交
				}
			}
		}catch(SQLException e) {}
	}
	
	public static void commitTransaction(Connection conn) {
		try {
			if (conn != null) {
				if (!conn.getAutoCommit()) {
					conn.commit();
				}
			}
		}catch(SQLException e) {}
	}
	public static void rollbackTransaction(Connection conn) {
		try {
			if (conn != null) {
				if (!conn.getAutoCommit()) {
					conn.rollback();
				}
			}
		}catch(SQLException e) {}
	} 
	




分享到:
评论

相关推荐

    创建oracle数据库中表的主键和自增

    在Oracle数据库中实现自增主键是一项常见但非常重要的功能。这不仅有助于确保数据的唯一性,还能简化开发过程中的某些环节,尤其是在需要自动增长的主键时。下面将详细介绍如何通过序列(Sequence)和触发器...

    sqlserver在有数据情况下修改主键为自增1

    sqlserver在有数据情况下修改主键为自增 网上方法都有缺陷 自己写了一个版本,欢迎大家参考,不好用吗,大家都不评价

    jbpm数据库表字段详解

    jbpm数据库表字段详解 jbpm是基于工作流管理系统的开源软件,它提供了强大的工作流引擎,可以自动执行业务流程,并提供了灵活的配置和扩展机制。jbpm的数据库表字段是jbpm系统的核心组件之一,它存储了工作流的所有...

    数据库表字段自定义

    本主题将深入探讨如何自定义数据库表字段,以及它的重要性、实现方式和最佳实践。 首先,我们要明白数据库表是数据组织的核心,而字段则是表的构成元素,它们决定了表能存储何种类型的数据。自定义字段意味着可以...

    ID自增JAVA类方法

    ID自增的java类方法,不用数据库主键自增的可以考虑试试这个,自己定义方式

    powerdesigner创建oracle_数据库表,设置表主键列为自动增长

    ### PowerDesigner 创建 Oracle 数据库表并设置主键自动增长 #### 一、PowerDesigner与Oracle数据库集成概述 PowerDesigner是一款强大的数据库设计工具,它能够帮助开发者进行数据建模、概念设计以及物理数据库的...

    主键自增性能测试报告1

    《主键自增性能测试报告1》 在数据库系统中,主键自增是一种常见的设计策略,用于确保...对于那些对性能有极高要求的应用,主键自增的策略应当优先考虑,同时配合合适的数据库系统和硬件配置,以实现最优的性能表现。

    sql正式/测试数据库表字段对比

    本话题聚焦于"sql正式/测试数据库表字段对比",这是一个用于比较SQL Server数据库中不同表结构的工具。下面将详细介绍这个过程及其相关知识点。 首先,数据库对比是确保生产环境与测试环境数据一致性的重要步骤。在...

    金蝶K3数据库字段和表结构

    金蝶K3数据库字段和表结构,用于对金蝶数据库底层的修改维护,以及查找相关数据使用的。

    mybatis自增主键文档

    在MyBatis中,处理自增主键是一个常见的需求,特别是在Oracle和MySQL这两个数据库中。Oracle通常使用Sequence来生成自增主键,而MySQL则直接通过表定义的自增属性来处理。以下将详细讲解这两种数据库在MyBatis中的...

    oracle数据库主键自增并且返回主键值

    一、创建序列 1.1、直接在PLSQL中设置 1.2、命令创建 create sequence seq_users ##创建序列seq_users increment by 1 ## 步长,每次加1 start with 1 ##从1开始 minvalue 1 ##最小值 maxvalue 9999999 ##最大值 ...

    Oracle数据库表序列ID自增生成器

    总结来说,Oracle数据库表序列ID自增生成器结合了序列和触发器的概念,实现了主键ID的自动增长。这种机制在处理大量数据和并发操作时,能确保数据的完整性和一致性。了解并熟练运用这些知识点,对于进行高效的Oracle...

    支持主键自增的数据库获取主键值.zip

    对于支持主键自增的数据库,如MySQL、SQLite、PostgreSQL等,系统会自动为每个新插入的记录生成一个唯一的主键值,无需手动设置。 在Java开发中,MyBatis作为一个轻量级的持久层框架,广泛应用于数据操作。MyBatis...

    java快速ID自增器

    它旨在提供一个高性能、线程安全的方式来生成自增ID,尤其适用于那些需要频繁生成ID的场景,如数据库记录的主键生成。 首先,我们需要理解自增ID的概念。自增ID通常用于数据库中的主键字段,确保每条记录都有一个...

    mysql实现char类型主键自增长

    在传统的数据库设计中,我们通常使用整型数据类型作为自增ID,通过设置AUTO_INCREMENT属性来自动递增主键值。但对于某些特定场景,例如需要主键包含日期信息或具有固定长度和格式时,CHAR类型则显得更为适用。为了...

    Oracle主键自增的办法

    当新行插入到表中时,触发器会自动将序列的下一个值赋给指定的自增字段,从而实现了类似其他数据库的自增主键功能。 通过这种方式,即使 Oracle 没有内置的自增字段,我们仍然可以利用序列和触发器来实现这一需求...

    Oracle中主键自增实例

    综上所述,Oracle虽然不像某些数据库那样提供直接的主键自增功能,但通过序列、触发器等工具,可以灵活地创建满足需求的自增主键。在设计数据库时,应考虑性能、并发控制和最佳实践,确保系统的稳定性和高效性。

    主键自增功能设计文档1

    在关系数据库管理系统中,主键自增功能是指在插入新数据行时自动生成特定主键列的值。 Cedar 是华东师范大学数据科学与工程学院基于 OceanBase 0.4.2 研发的可扩展的关系数据库,实现了巨大数据量上的跨行跨表事务。...

    JPA主键策略(针对数据库自增字段重置后无效检查项)

    GenerationType.IDENTITY 是一种常用的主键策略,它使用数据库的自增字段来生成主键。在使用这个策略时,JPA会将主键的生成工作交由数据库完成,hibernate 不会介入。这意味着,数据库将负责生成主键,而不是...

    SqlServer 永不重复的主键(非自增列)

    数据库自增列主键在数据库还原时百分百会出问题 为解决该问题特开发自定义式的主键 创建一个监控表,一个被调用的存储过程即可,推荐有存储过程编广泛使用的程序使用 调用方法 DECLARE @PKID CHAR(12)='' EXEC [dbo]....

Global site tag (gtag.js) - Google Analytics