求助大神,要求用java代码写一个序列生成器

 我来答
嘎嘎哈哈哈H
2017-01-20 · 超过33用户采纳过TA的回答
知道答主
回答量:52
采纳率:0%
帮助的人:58.6万
展开全部
import java.util.HashMap;
import java.security.KeyException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 类<code>Key</code>是一个数据库主键生成器,用序列号的方式来产生数据库中需要的主键值。
 * <p>
 * <code>Key</code>目前支持的数据库包括Oracle的所有版本、MySql的3.x以上的版本
 * 以及所有支持max()函数的数据库,支持字段类型仅为数字类型的主键,对于字符及其它类型的主键尚不提供支持。
 * <p>
 * 在使用时只需提供表名、字段名(主键)以及到数据库的JDBC连接,如果想要获得message表的id字段的下一个 主键值时:
 * <p>
 * <blockquote>
 * 
 * <pre>
 *     java.sql.Connection conn = ...;
 *     org.shaoye.common.sql.Key key = org.shaoye.common.sql.Key.getInstance();
 *     int keyValue = key.getNextKey("message", "id", conn);
 *     String sql = "insert into message (id,...) values (" + keyValue + ",...)";
 *     //执行插入操作...
 * </pre>
 * 
 * </blockquote>
 * <p>
 * 
 * @author 令少爷(shaoye@vip.sina.com)
 * @since magic 0.1
 */
public final class Key {

/**
 * key的最大值,默认为9223372036854775807,即long类型的最大值
 */
private long max = 9223372036854775807L;

/**
 * key的最小值,默认为1
 * */
private long min = 1L;

/**
 * Key的唯一实例,通过getInstance()方法获得
 * */
private static Key keygen = new Key();

/**
 * KeyInfo类的实例列表,默认容量为5个
 * */
private HashMap<String, KeyInfo> keyList = new HashMap<String, KeyInfo>(5); // keyInfo
// 列表

/**
 * 私有的默认构造方法,防止外部构造类的实例
 * */
private Key() {
}

/**
 * 获得Key的唯一实例
 * */
public static Key getInstance() {
return keygen;
}

/**
 * 用指定的表和字段获得key的下一个值,主键的值不得超过2147483647
 * 
 * @param tableName
 *            数据库中的表名,表中必须有一个数字主键
 * @param keyName
 *            表(tableName)中的字段名
 * @param conn
 *            JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
 * @return key的下一个主键的int值
 * @throws <code>KeyException</code>
 *         如果表名或字段名不存在、访问数据库错误或key的值大于2147483647时抛出
 */
public int getNextKey(String tableName, String keyName, Connection conn)
throws KeyException {
long value = getNextKeyLong(tableName, keyName, conn);
if (value > 2147483647L) {
throw new KeyException(
"Key's value too big,please call getNextKeyLong method!");
}
return (new Long(value)).intValue();
}

/**
 * 用指定的表和字段获得key的下一个值,最大为9223372036854775807
 * @param tableName 数据库中的表名,表中必须有一个数字主键
 * @param keyName 表(tableName)中的字段名
 * @param conn JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
 * @return key的下一个主键的long值
 * @throws <code>KeyException</code> 如果表名或字段名不存在或访问数据库错误时抛出
 */
public long getNextKeyLong(String tableName, String keyName, Connection conn)
throws KeyException {
KeyInfo keyinfo;
String item = tableName + "." + keyName;
try {
if (keyList.containsKey(item)) {
keyinfo = (KeyInfo) keyList.get(item);
} else {
keyinfo = new KeyInfo(tableName, keyName, conn);
keyList.put(item, keyinfo);
}
return keyinfo.getNextKey();
} catch (SQLException sqle) {
throw new KeyException(sqle);
}
}

/**
 * 用指定的"表<code>.</code>字段"形式的字符串获得key的下一个值,主键的值不得超过2147483647
 * @param tableDotField "表.字段"形式的字符串,如:message.id
 * @param conn JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
 * @return key的下一个主键的int值
 * @throws <code>KeyException</code> 如果表名或字段名不存在、访问数据库错误或key的值 大于2147483647时抛出
 */
public int getNextKey(String tableDotField, Connection conn)
throws KeyException {
long value = getNextKeyLong(tableDotField, conn);
if (value > 2147483647L) {
throw new KeyException(
"Key's value too big,please call getNextKeyLong method!");
}
return (new Long(value)).intValue();
}

/**
 * 用指定的"表<code>.</code>字段"形式的字符串获得key的下一个值,最大为9223372036854775807
 * @param tableDotField "表.字段"形式的字符串,如:message.id
 * @param conn JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
 * @return key的下一个主键的int值
 * @throws <code>KeyException</code> 如果表名或字段名不存在或访问数据库错误时抛出
 */
public long getNextKeyLong(String tableDotField, Connection conn)
throws KeyException {
int dot_index = tableDotField.indexOf(".");
if (tableDotField.indexOf(".") < 1) {
throw new KeyException("Unknown Key '" + tableDotField + "'!");
}
String tab = tableDotField.substring(0, dot_index);
String key = tableDotField.substring(dot_index);
return getNextKeyLong(tab, key, conn);
}

/**
 * 用指定的表和字段获得key的当前值,主键的值不得超过2147483647
 * @param tableName 数据库中的表名,表中必须有一个数字主键
 * @param keyName 表(tableName)中的字段名
 * @param conn JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
 * @return key的当前int值
 * @throws <code>KeyException</code>
 *         如果表名或字段名不存在、访问数据库错误或key的值大于2147483647时抛出
 */
public int getCurrentKey(String tableName, String keyName, Connection conn)
throws KeyException {
long value = getCurrentKeyLong(tableName, keyName, conn);
if (value > 2147483647L) {
throw new KeyException(
"Key's value too big,please call getCurrentKeyLong method!");
}
return (new Long(value)).intValue();
}

/**
 * 用指定的表和字段获得key的当前值,最大为9223372036854775807
 * 
 * @param tableName
 *            数据库中的表名,表中必须有一个数字主键
 * @param keyName
 *            表(tableName)中的字段名
 * @param conn
 *            JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
 * @return key的当前long值
 * @throws <code>KeyException</code> 如果表名或字段名不存在或访问数据库错误时抛出
 */
public long getCurrentKeyLong(String tableName, String keyName,
Connection conn) throws KeyException {
KeyInfo keyinfo;
String item = tableName + "." + keyName;
try {
synchronized (keyList) {
if (keyList.containsKey(item)) {
keyinfo = (KeyInfo) keyList.get(item);
} else {
keyinfo = new KeyInfo(tableName, keyName, conn);
keyList.put(item, keyinfo);
}
}
return keyinfo.getCurrentKey();
} catch (SQLException sqle) {
throw new KeyException(sqle);
}
}

/**
 * 用指定的"表<code>.</code>字段"形式的字符串获得key的当前值,主键的值不得超过2147483647
 * 
 * @param tableDotField
 *            "表.字段"形式的字符串,如:message.id
 * @param conn
 *            JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
 * @return key的当前int值
 * @throws <code>KeyException</code> 如果表名或字段名不存在、访问数据库错误或key的值
 *         大于2147483647时抛出
 */
public int getCurrentKey(String tableDotField, Connection conn)
throws KeyException {
long value = getCurrentKeyLong(tableDotField, conn);
if (value > 2147483647L) {
throw new KeyException(
"Key's value too big,please call getNextKeyLong method!");
}
return (new Long(value)).intValue();
}

/**
 * 用指定的"表<code>.</code>字段"形式的字符串获得key的当前值,最大为9223372036854775807
 * 
 * @param tableDotField
 *            "表.字段"形式的字符串,如:message.id
 * @param conn
 *            JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
 * @return key的当前int值
 * @throws <code>KeyException</code> 如果表名或字段名不存在或访问数据库错误时抛出
 */
public long getCurrentKeyLong(String tableDotField, Connection conn)
throws KeyException {
int dot_index = tableDotField.indexOf(".");
if (tableDotField.indexOf(".") < 1) {
throw new KeyException("Unknown Key '" + tableDotField + "'!");
}
String tab = tableDotField.substring(0, dot_index);
String key = tableDotField.substring(dot_index);
return getCurrentKeyLong(tab, key, conn);
}
}

/**
 * 内部类,用来存储主键信息
 * */
class KeyInfo {
private long max = 9223372036854775807L;
private long min = 1L;
private long nextKey;
private String tableName;
private String keyName;
private Connection conn = null;

/**
 * keyInfo 对象初始化
 * 
 * @throws KeyException
 */
KeyInfo(String tableName, String keyName, Connection _conn)
throws SQLException, KeyException {
this.tableName = tableName;
this.keyName = keyName;
this.conn = _conn;
retrieveFromDB();
}

int getMax() {
return (new Long(max)).intValue();
}

long getMaxLong() {
return max;
}

int getMin() {
return (new Long(min)).intValue();
}

long getMinLong() {
return min;
}

/**
 * 取下一键值
 */
int getNextKey() {
return (new Long(getNextKeyLong())).intValue();
}

/**
 * 取下一键值
 */
synchronized long getNextKeyLong() {
nextKey++;
return nextKey;
}

/**
 * 取当前键值
 */
synchronized int getCurrentKey() {
return (new Long(nextKey)).intValue();
}

/**
 * 取当前键值
 */
synchronized long getCurrentKeyLong() {
return nextKey;
}

/**
 * 从数据库中取当前最大值
 * 
 * @throws KeyException
 */
void retrieveFromDB() throws SQLException, KeyException {
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "select max(" + keyName + ") from " + tableName;
try {
pstmt = conn.prepareStatement(sql);
} catch (Exception ex) {
throw new KeyException("Can't connect DataBase!");
}
try {
rs = pstmt.executeQuery();
} catch (SQLException sqle) {
if (pstmt != null)
pstmt.close();
throw new KeyException("'" + keyName + "' or '" + tableName
+ "' isn't exist in DataBase!", sqle);
}
try {
if (rs.next()) {
nextKey = rs.getLong(1);
if (nextKey < min) {
nextKey = min;
}
} else {
nextKey = min;
}
} catch (SQLException sqle) {
throw (sqle);
} finally {
if (rs != null)
rs.close();
if (pstmt != null)
pstmt.close();
}
}
}
GRcoder
2017-01-20 · 超过83用户采纳过TA的回答
知道小有建树答主
回答量:233
采纳率:0%
帮助的人:79.6万
展开全部
  1. UUID

  2. 当前时间的毫秒数

  3. 序列

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
里拉莉拉1522
2017-07-05 · TA获得超过218个赞
知道小有建树答主
回答量:354
采纳率:0%
帮助的人:95.8万
展开全部
<pre t="code" l="java">import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class Index {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num = Integer.valueOf(scan.nextLine());
if(num > 20000 || num <= 0) {
System.out.println("不正确的范围");
return;
}
String values = scan.nextLine();
int[] inputs = new int[num];
String[] strs = values.split(" ");
if (strs.length != num) {
System.out.println("个数不匹配");
return;
}
for (int i = 0; i < strs.length; i++) {
inputs[i] = Integer.valueOf(strs[i]);
if (inputs[i] < 10 || inputs[i] > 100) {
System.out.println("不正确的范围");
return;
}

}
List<Integer> result = new ArrayList();
for(int i = 0; i < inputs.length; i++) {
if (!result.contains(inputs[i])) {
result.add(inputs[i]);
}
}
Iterator it = result.iterator();
while(it.hasNext()) {
System.out.print(it.next() + " ");
}

}
}how old are you? how old are me. ---- myself.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式