国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

一個用java完成的數(shù)據(jù)庫序列生成器

一個用java完成的數(shù)據(jù)庫序列生成器

更新時間:2022-05-09 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

如果是集群等應(yīng)用這個就不行了,只能在單應(yīng)用的情況下使用
對于每個序列鍵只需在第一次使用時查詢數(shù)據(jù)庫,后面的都將不需要查詢
有非常詳細(xì)的注釋,我就不多說了


package org.shaoye.common.sql;

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

/**
* 類<code>Key</code>是一個數(shù)據(jù)庫主鍵生成器,用序列號的方式來產(chǎn)生數(shù)據(jù)庫中需要的主鍵值。
* <p>
* <code>Key</code>目前支持的數(shù)據(jù)庫包括Oracle的所有版本、MySql的3.x以上的版本
* 以及所有支持max()函數(shù)的數(shù)據(jù)庫,支持字段類型僅為數(shù)字類型的主鍵,對于字符及其它類型的主鍵尚不提供支持。
* <p>
* 在使用時只需提供表名、字段名(主鍵)以及到數(shù)據(jù)庫的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 + ",...)";
* //執(zhí)行插入操作...
* </pre></blockquote><p>
*
* @author 令少爺(shaoye@vip.sina.com)
* @since magic 0.1
*/
public final class Key {

/**
* key的最大值,默認(rèn)為9223372036854775807,即long類型的最大值
*/
private long max = 9223372036854775807L;

/**
* key的最小值,默認(rèn)為1
* */
private long min = 1L;

/**
* Key的唯一實(shí)例,通過getInstance()方法獲得
* */
private static Key keygen = new Key();

/**
* KeyInfo類的實(shí)例列表,默認(rèn)容量為5個
* */
private HashMap keyList = new HashMap(5); //keyInfo 列表

/**
* 私有的默認(rèn)構(gòu)造方法,防止外部構(gòu)造類的實(shí)例
* */
private Key() {
}

/**
* 獲得Key的唯一實(shí)例
* */
public static Key getInstance() {
return keygen;
}

/**
* 用指定的表和字段獲得key的下一個值,主鍵的值不得超過2147483647
* @param tableName 數(shù)據(jù)庫中的表名,表中必須有一個數(shù)字主鍵
* @param keyName 表(tableName)中的字段名
* @param connJDBC連接,如果欲獲得的key是第一次取值,則必須保證conn能連接到數(shù)據(jù)庫
* @return key的下一個主鍵的int值
* @throws <code>KeyException</code>如果表名或字段名不存在、訪問數(shù)據(jù)庫錯誤或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 數(shù)據(jù)庫中的表名,表中必須有一個數(shù)字主鍵
* @param keyName 表(tableName)中的字段名
* @param connJDBC連接,如果欲獲得的key是第一次取值,則必須保證conn能連接到數(shù)據(jù)庫
* @return key的下一個主鍵的long值
* @throws <code>KeyException</code>如果表名或字段名不存在或訪問數(shù)據(jù)庫錯誤時拋出
*/
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 connJDBC連接,如果欲獲得的key是第一次取值,則必須保證conn能連接到數(shù)據(jù)庫
* @return key的下一個主鍵的int值
* @throws <code>KeyException</code>如果表名或字段名不存在、訪問數(shù)據(jù)庫錯誤或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 connJDBC連接,如果欲獲得的key是第一次取值,則必須保證conn能連接到數(shù)據(jù)庫
* @return key的下一個主鍵的int值
* @throws <code>KeyException</code>如果表名或字段名不存在或訪問數(shù)據(jù)庫錯誤時拋出
*/
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的當(dāng)前值,主鍵的值不得超過2147483647
* @param tableName 數(shù)據(jù)庫中的表名,表中必須有一個數(shù)字主鍵
* @param keyName 表(tableName)中的字段名
* @param connJDBC連接,如果欲獲得的key是第一次取值,則必須保證conn能連接到數(shù)據(jù)庫
* @return key的當(dāng)前int值
* @throws <code>KeyException</code>如果表名或字段名不存在、訪問數(shù)據(jù)庫錯誤或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的當(dāng)前值,最大為9223372036854775807
* @param tableName 數(shù)據(jù)庫中的表名,表中必須有一個數(shù)字主鍵
* @param keyName 表(tableName)中的字段名
* @param connJDBC連接,如果欲獲得的key是第一次取值,則必須保證conn能連接到數(shù)據(jù)庫
* @return key的當(dāng)前l(fā)ong值
* @throws <code>KeyException</code>如果表名或字段名不存在或訪問數(shù)據(jù)庫錯誤時拋出
*/
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的當(dāng)前值,主鍵的值不得超過2147483647
* @param tableDotField"表.字段"形式的字符串,如:message.id
* @param connJDBC連接,如果欲獲得的key是第一次取值,則必須保證conn能連接到數(shù)據(jù)庫
* @return key的當(dāng)前int值
* @throws <code>KeyException</code>如果表名或字段名不存在、訪問數(shù)據(jù)庫錯誤或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的當(dāng)前值,最大為9223372036854775807
* @param tableDotField"表.字段"形式的字符串,如:message.id
* @param connJDBC連接,如果欲獲得的key是第一次取值,則必須保證conn能連接到數(shù)據(jù)庫
* @return key的當(dāng)前int值
* @throws <code>KeyException</code>如果表名或字段名不存在或訪問數(shù)據(jù)庫錯誤時拋出
*/
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);
}
}


/**
* 內(nèi)部類,用來存儲主鍵信息
* */
class KeyInfo {
private long max = 9223372036854775807L;
private long min = 1L;
private long nextKey;
private String tableName;
private String keyName;
private Connection conn = null;
/**
* keyInfo 對象初始化
*/
KeyInfo(String tableName, String keyName, Connection _conn) throws SQLException {
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;
}
/**
* 取當(dāng)前鍵值
*/
synchronized int getCurrentKey() {
return (new Long(nextKey)).intValue();
}
/**
* 取當(dāng)前鍵值
*/
synchronized long getCurrentKeyLong() {
return nextKey;
}
/**
* 從數(shù)據(jù)庫中取當(dāng)前最大值
*/
void retrieveFromDB() throws SQLException {
PreparedStatement pstmt = null;
ResultSet rs = null;
int keyFromDB = 0;
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();
}
}
}

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        精品99久久久久久| 国产精品影视天天线| 日韩中文字幕区一区有砖一区| 国产成人一级电影| 欧美国产欧美综合| eeuss影院一区二区三区| 国产人成一区二区三区影院| 国产一区二区伦理片| 国产网站一区二区| 不卡影院免费观看| 一区二区三区精品久久久| 欧美色图第一页| 日本欧美肥老太交大片| 日韩精品一区二区三区在线| 国内一区二区在线| 亚洲激情图片qvod| 日韩三级中文字幕| 不卡电影一区二区三区| 亚洲国产欧美一区二区三区丁香婷| 欧美精品一二三| 国产成人综合在线| 亚洲h动漫在线| 久久久综合网站| 91久久奴性调教| 国产一区二区三区视频在线播放| 国产拍揄自揄精品视频麻豆| 欧美在线一区二区| 国产一区欧美日韩| 亚洲h在线观看| 亚洲色图视频网| 欧美r级电影在线观看| 日本精品一级二级| 精品午夜一区二区三区在线观看| 中文字幕制服丝袜成人av | 国产欧美综合在线| 欧美这里有精品| 国产成人av电影在线| 日本一道高清亚洲日美韩| 国产午夜亚洲精品午夜鲁丝片| 一本色道久久综合亚洲91| 久久精品国产久精国产| 亚洲猫色日本管| 国产日韩成人精品| 日韩视频在线一区二区| 欧美亚洲免费在线一区| 风间由美中文字幕在线看视频国产欧美| 亚洲国产精品影院| 亚洲欧美日韩综合aⅴ视频| 精品国产成人在线影院| 91精品久久久久久蜜臀| av电影天堂一区二区在线观看| 极品美女销魂一区二区三区免费| 亚洲一级电影视频| 一区二区国产视频| 亚洲精品国产精品乱码不99| 日本一区二区三区四区| 久久伊99综合婷婷久久伊| 欧美一区二区福利视频| 欧美精品视频www在线观看 | 色综合久久综合网欧美综合网| 激情五月播播久久久精品| 日本成人在线不卡视频| 午夜在线成人av| 亚洲成av人影院| 日韩国产成人精品| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲国产视频一区二区| 一区二区三区在线视频免费观看| 亚洲欧美在线另类| 亚洲视频一区在线观看| 亚洲免费电影在线| 一区二区三区四区乱视频| 亚洲永久免费av| 亚洲一二三专区| 日韩精品亚洲一区二区三区免费| 日韩精品成人一区二区在线| 日本欧美加勒比视频| 韩国欧美一区二区| 成人av电影在线| 一本大道综合伊人精品热热| 色综合久久综合中文综合网| 欧美丝袜丝交足nylons图片| 欧美另类久久久品| 欧美电视剧免费观看| 欧美韩日一区二区三区四区| ●精品国产综合乱码久久久久| 亚洲欧美国产毛片在线| 亚洲成a人v欧美综合天堂下载 | 亚洲视频一二三| 亚洲一区二区三区在线看| 日韩国产欧美一区二区三区| 国产在线播放一区| 色婷婷狠狠综合| 日韩欧美一级精品久久| 国产精品麻豆一区二区| 五月天国产精品| 风间由美一区二区av101| 欧美视频一二三区| 国产三级三级三级精品8ⅰ区| 亚洲欧美一区二区不卡| 男男视频亚洲欧美| 色综合天天综合| 精品国产亚洲在线| 亚洲国产视频在线| 成人一道本在线| 91精品在线观看入口| 亚洲青青青在线视频| 国产伦精品一区二区三区视频青涩 | 91丝袜美女网| 欧美tickling挠脚心丨vk| 亚洲啪啪综合av一区二区三区| 美女视频免费一区| 在线观看成人小视频| 国产日韩欧美高清在线| 一区二区三区**美女毛片| 蜜桃视频免费观看一区| 在线观看av一区二区| 国产精品美女久久久久久久久 | 欧美午夜精品一区二区三区| 国产日韩欧美麻豆| 蜜桃精品在线观看| 欧美日韩在线观看一区二区| 中文字幕一区二区不卡| 国产成人高清在线| 久久日韩精品一区二区五区| 亚洲第一成人在线| 色欧美乱欧美15图片| 国产精品人妖ts系列视频 | 免费av成人在线| 91国模大尺度私拍在线视频| 欧美国产精品专区| 国产成人亚洲综合a∨猫咪| 日韩小视频在线观看专区| 日日夜夜免费精品视频| 欧美电影一区二区| 天天av天天翘天天综合网| 欧美日韩一区不卡| 玉米视频成人免费看| 91成人免费在线| 亚洲一区在线视频观看| 在线国产电影不卡| 亚洲视频免费观看| 91亚洲永久精品| 亚洲免费电影在线| 欧美综合在线视频| 亚洲国产精品久久艾草纯爱| 在线观看国产91| 婷婷中文字幕综合| 日韩手机在线导航| 国产精品69久久久久水密桃| 欧美国产精品一区| 99re成人在线| 亚洲电影一级黄| 欧美成va人片在线观看| 久久99精品视频| 亚洲国产精品传媒在线观看| 99久久夜色精品国产网站| 亚洲在线视频免费观看| 欧美mv和日韩mv的网站| 国产精品香蕉一区二区三区| 国产精品成人免费| 欧美美女一区二区三区| 麻豆视频一区二区| 国产精品美女久久久久久久| 欧美性大战久久久久久久 | 在线视频欧美精品| 日韩一区精品字幕| 中文字幕不卡的av| 欧美人妖巨大在线| 国产精品资源在线| 亚洲va天堂va国产va久| 国产亚洲欧美色| 欧美性受xxxx黑人xyx| 国内精品免费在线观看| 亚洲久本草在线中文字幕| 精品欧美一区二区三区精品久久| heyzo一本久久综合| 久久国产尿小便嘘嘘尿| 亚洲精品国久久99热| 久久精品夜夜夜夜久久| 欧美精品三级在线观看| a亚洲天堂av| 国产乱码精品一区二区三区忘忧草| 亚洲三级在线观看| 久久一区二区视频| 在线观看国产日韩| 9色porny自拍视频一区二区| 久久精品国产亚洲a| 亚洲国产aⅴ天堂久久| 国产精品灌醉下药二区| 2023国产一二三区日本精品2022| 91国产福利在线| 99视频一区二区三区| 精品在线视频一区| 婷婷国产在线综合| 亚洲精品乱码久久久久久| 国产欧美日韩三级| 久久在线观看免费| ww亚洲ww在线观看国产| 日韩手机在线导航|