`

mysql 和 java 自增长序号

阅读更多

select  (@rowNO := @rowNo+1) AS rowno,s.com_uid from (select  com_uid from sms_balance) s,(select @rowNO :=0) b ;

 

或者 获取最大的编号,然后加1  再保存到数据库中.

 

 

产生自定义格式的自动增长序列号:

Java代码  收藏代码
  1. /** 
  2.  * 自己维护的序列号,至少从1开始增长 
  3.  */  
  4. public abstract class IncrementNumber {  
  5.       
  6.     public IncrementNumber() {}  
  7.       
  8.     public IncrementNumber(int interval, int maxNum) {  
  9.         this.interval = interval;  
  10.         this.maxNum = maxNum;  
  11.     }  
  12.       
  13.     public synchronized int cal() throws Exception {  
  14.         if (serialNum == -1) {  
  15.             serialNum = initStartNum(); // 已经使用的序列号一定 小于 缓存的序列号  
  16.             intervalMax = serialNum + interval;  
  17.             updateStartNum(intervalMax);  
  18.             return serialNum;  
  19.         }  
  20.         if (isMax(serialNum)) { // 达到预定的最大值  
  21.             resetSerialNum();  
  22.             return serialNum;  
  23.         }  
  24.         serialNum++;  
  25.         if (serialNum >= (intervalMax - 1)) { // 到达区间最大值  
  26.             intervalMax += interval;  
  27.             updateStartNum(intervalMax);  
  28.         }  
  29.         return serialNum;  
  30.     }  
  31.       
  32.     /** 
  33.      * 初始化序列号,从缓存系统中来,比如数据库、文件等 
  34.      * @return 初始序列号 
  35.      * @throws Exception 
  36.      */  
  37.     public abstract int initStartNum() throws Exception;  
  38.       
  39.     /** 
  40.      * 更新区间最大值到缓存系统,比如数据库、文件中。 
  41.      * @param intervalMax 区间最大值 
  42.      * @throws Exception 
  43.      */  
  44.     public abstract void updateStartNum(int intervalMax) throws Exception;  
  45.       
  46.     /** 
  47.      * 重置序列号,从1开始 
  48.      */  
  49.     protected void resetSerialNum() throws Exception {  
  50.         this.serialNum = 1;  
  51.         intervalMax = serialNum + interval;  
  52.         updateStartNum(intervalMax);  
  53.     }  
  54.       
  55.     /** 
  56.      * 是否是最大值 
  57.      * @param num 
  58.      * @return 
  59.      */  
  60.     private boolean isMax(int num) {  
  61.         return num >= maxNum;  
  62.     }  
  63.       
  64.     public int getInterval() {  
  65.         return this.interval;  
  66.     }  
  67.       
  68.     public int getMaxNum() {  
  69.         return this.maxNum;  
  70.     }  
  71.       
  72.     /** 区间最大值 */  
  73.     protected int intervalMax = 0;  
  74.       
  75.     /** 每次增加量 */  
  76.     protected int interval = 20;  
  77.       
  78.     /** 预定的最大值 */  
  79.     protected int maxNum = 9999;  
  80.       
  81.     /** 序列号 */  
  82.     protected int serialNum = -1;  
  83. }  

 

使用方法:

Java代码  收藏代码
  1. @Service  
  2. @Transactional  
  3. public class TableKeyManager extends IncrementNumber {  
  4.       
  5.     public TableKeyManager() {  
  6.         super(10099999999);  
  7.     }  
  8.   
  9.     @Override  
  10.     public int initStartNum() throws Exception {  
  11.         TableKey tableKey = tableKeyDao.getById(name);  
  12.         date = DateConvertUtils.getDayEnd(DateConvertUtils.parse(tableKey.getDate(), "yyMMdd"));  
  13.         dateEndMillis = date.getTime();  
  14.         prefix = tableKey.getDate();  
  15.         return (int) tableKey.getMaxNum();  
  16.     }  
  17.   
  18.     @Override  
  19.     public void updateStartNum(int intervalMax) throws Exception {  
  20.         TableKey tableKey = tableKeyDao.getById(name);  
  21.         tableKey.setDate(DateConvertUtils.format(new Date(dateEndMillis), "yyMMdd"));  
  22.         tableKey.setMaxNum(intervalMax);  
  23.         tableKeyDao.update(tableKey);  
  24.     }  
  25.       
  26.     public String getNum() {  
  27.         try {  
  28.             long now = System.currentTimeMillis();  
  29.             int no = 0;  
  30.             if (now > dateEndMillis) {  
  31.                 date = DateConvertUtils.getDayEnd(new Date(now));  
  32.                 dateEndMillis = date.getTime();  
  33.                 prefix = DateConvertUtils.format(date, "yyMMdd");  
  34.                 resetSerialNum();  
  35.                 no = this.serialNum;  
  36.             } else {  
  37.                 no = cal();  
  38.             }  
  39.             return prefix + ApplicationUtil.getFixedSizeNum(no, 8);  
  40.         } catch (Exception e) {  
  41.             e.printStackTrace();  
  42.         }  
  43.         throw new RuntimeException("生成序列号错误");  
  44.     }  
  45.       
  46.     public void setName(String name) {  
  47.         this.name = name;  
  48.     }  
  49.       
  50.     private String prefix = null;  
  51.       
  52.     private long dateEndMillis = 0l;  
  53.       
  54.     private Date date = null;  
  55.       
  56.     private String name;  
  57.       
  58.     @Autowired  
  59.     private TableKeyDao tableKeyDao;  
  60. }  

 

这种方法仅在初始化时查询一次数据库,在每次到达增长上限时,计数自动叠加一个步长,同时更新数据库中的数据上限。

 

table_key的数据结构

Sql代码  收藏代码
  1. CREATE TABLE `table_key` (  
  2.   `key_name` varchar(100) NOT NULL COMMENT '需要维护的key名称',  
  3.   `cur_no` mediumtext COMMENT '当前数据编号',  
  4.   `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '数据编号更新时间',  
  5.   `create_time` datetime DEFAULT NULL COMMENT '记录创建时间',  
  6.   PRIMARY KEY (`key_name`)  
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8  

在不用AUTO_INCREMENT的情况下生成序列,可利用带参数的LAST_INSERT_ID()函数。如果用一个带参数的LAST_INSERT_ID(expr)去插入或修改一个数据列,紧接着又调用不带参数的LAST_INSERT_ID()函数,则第二次函数调用返回的就是expr的值。下面演示该方法的具体操作:
先创建一个只有一个数据行的数据表:create table seq_table (id int unsigned not null);insert into seq_table values (0);接着用以下操作检索出序列号:
update seq_table set seq = LAST_INSERT_ID( seq + 1 );select LAST_INSERT_ID();
通过修改seq+1中的常数值,可生成不同步长的序列,如seq+10可生成步长为10的序列。该方法可用于计数器,在数据表中插入多行以记录不同的计数值。再配合LAST_INSERT_ID()函数的返回值生成不同内容的计数值。这种方法的优点是不用事务或LOCK,UNLOCK表就可生成唯一的序列编号。不会影响其它客户程序的正常表操作.

分享到:
评论

相关推荐

    mysql-connector-java-5.1.49

    mysql57驱动jar包mysql-connector-java-5.1.49 mysql57驱动jar包mysql-connector-java-5.1.49 mysql57驱动jar包mysql-connector-java-5.1.49 mysql57驱动jar包mysql-connector-java-5.1.49 mysql57驱动jar包mysql-...

    MySql Connector Java 5.1.23.rar

    MySQL Connector/J 充当了 JDBC 驱动的角色,使得 Java 应用能够连接到 MySQL 数据库,执行查询、插入、更新和删除等操作。 MySQL Connector/J 5.1.23 的主要特性包括: 1. **全面支持 JDBC 4.0 规范**:该版本的...

    mysql-connector-java-8.0.27 jar包

    mysql-connector-java-8.0.27 jar包 mysql-connector-java-8.0.27 jar包 mysql-connector-java-8.0.27 jar包 mysql-connector-java-8.0.27 jar包 mysql-connector-java-8.0.27 jar包 mysql-connector-java-8.0.27 ...

    Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应

    Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应用

    mysql的插入问题 怎么获得自动增长的ID

    ### MySQL的插入问题:如何获取自动增长的ID 在MySQL中,经常需要用到自动增长的ID字段作为表的主键,特别是在频繁进行数据插入操作时。本文将深入探讨以下几个方面: 1. **理解自动增长ID的工作原理** 2. **在...

    MySQL java驱动包mysql-connector-java-5.1.45

    首先,`mysql-connector-java-5.1.45`包含了一系列的Java类和接口,它们实现了JDBC(Java Database Connectivity)API。JDBC是Java中用于与各种数据库进行交互的一组标准接口,允许开发人员在不关心底层数据库实现的...

    Java实现批量向mysql写入数据的方法

    此外,本文还提供了一些相关的学习资源,例如《Java+MySQL数据库程序设计总结》、《Java数据结构与算法教程》、《Java文件与目录操作技巧汇总》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》,这些资源...

    MySQL-JAVA.rar_java mysql_java+mysql_mysql_java

    首先,要连接Java和MySQL,我们需要引入MySQL的JDBC驱动。这通常通过在项目的类路径中添加`mysql-connector-java.jar`库来完成。这个库包含Java代码,可以理解MySQL特定的通信协议并处理与数据库的交互。 在Java...

    基于Mysql和JAVA的股票交易系统

    【作品名称】:基于Mysql和JAVA的股票交易系统 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 基于Mysql和JAVA的...

    mysql-connector-java java连接mysql库

    这个驱动程序,也就是`mysql-connector-java`,是一个JDBC(Java Database Connectivity)驱动,它实现了Java.sql接口,使得Java开发者能够使用标准的JDBC API来连接、查询和操作MySQL数据库。 标题"mysql-...

    Java学生信息管理系统(GUI+MySQL).zip

    Java学生信息管理系统(GUI+MySQL),Java学生信息管理系统(GUI+MySQL),Java学生信息管理系统(GUI+MySQL),Java学生信息管理系统(GUI+MySQL),Java学生信息管理系统(GUI+MySQL),Java学生信息管理系统(GUI...

    mysql取得自动增长的主键值

    ### MySQL获取自动增长的主键值 在MySQL数据库中,自动增长...通过以上知识点的学习,我们可以更好地理解和掌握MySQL中获取自动增长主键值的方法及其应用场景,这对于日常的数据库管理和应用开发都有着重要的意义。

    mysql与java连接的适配包(mysql-connector-java-5.1.47)

    这个版本的驱动兼容MySQL 5.1系列数据库,包含必要的类和方法,使Java应用能够执行SQL语句、处理结果集等数据库操作。 使用这个驱动包的过程通常包括以下几个步骤: 1. **添加依赖**:将`mysql-connector-java-...

    mysql 自增长 时间字段

    在实际应用中,我们经常需要对数据进行自增长和时间戳记录,本文将详细介绍 MySQL 中的自增长和时间字段的使用。 自增长字段 在 MySQL 中,我们可以使用 auto_increment 属性来实现字段的自增长。例如,在创建用户...

    java 连接mysql demo和所有jar

    在这个"java连接mysql demo和所有jar"的压缩包中,包含了实现这一功能所需的示例代码和必要的库文件。下面我们将深入探讨相关知识点。 首先,Java连接MySQL主要依赖于`JDBC`(Java Database Connectivity),它是...

    mysql java JDBC 导入资源包mysql-connector-java-5.1.48

    MySQL是世界上最流行的开源关系型数据库管理系统之一,而Java是一种广泛使用的多平台开发语言,两者结合使用,通过Java Database Connectivity (JDBC) API,可以实现Java应用程序与MySQL数据库之间的交互。...

    mysql-connector-java-x.x.x MySQL驱动包下载

    mysql-connector-java-5.0.5.jar mysql-connector-java-5.1.6.jar mysql-connector-java-5.1.18.jar mysql-connector-java-5.1.21.jar mysql-connector-java-5.1.35.jar mysql-connector-java-5.1.39.jar mysql-...

    mysql-connector-java-5.1.40.zip和mysql-connector-java-5.1.10.jar

    本文将深入探讨这两个文件:"mysql-connector-java-5.1.40.zip" 和 "mysql-connector-java-5.1.10.jar",以及它们在Java开发中的作用。 首先,`mysql-connector-java-5.1.40.zip` 是一个压缩文件,包含了MySQL ...

    开发工具 mysql-connector-java-5.1.40-bin

    开发工具 mysql-connector-java-5.1.40-bin开发工具 mysql-connector-java-5.1.40-bin开发工具 mysql-connector-java-5.1.40-bin开发工具 mysql-connector-java-5.1.40-bin开发工具 mysql-connector-java-5.1.40-bin...

Global site tag (gtag.js) - Google Analytics