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

        當(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)下載排行

        主站蜘蛛池模板: 蜜臀亚洲AV无码精品国产午夜.| 亚洲精品在线网站| 福利片免费一区二区三区| 成年人性生活免费视频| 亚洲天堂中文字幕在线观看| 99ee6热久久免费精品6| 青青草原精品国产亚洲av| 最近最好最新2019中文字幕免费| 久久久亚洲欧洲日产国码aⅴ| 一级毛片免费毛片一级毛片免费 | 国产精品亚洲综合五月天| 久久精品国产免费观看| 亚洲欧洲自拍拍偷午夜色| 免费观看美女用震蛋喷水的视频 | 色吊丝免费观看网站| 日韩亚洲国产综合久久久| 高清免费久久午夜精品| www亚洲一级视频com| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 亚洲人成人无码网www国产| 任你躁在线精品免费| 亚洲AV成人无码久久精品老人| 18禁成人网站免费观看| 亚洲综合无码一区二区痴汉| 国产又黄又爽又猛的免费视频播放| 无遮挡呻吟娇喘视频免费播放| 亚洲精品无码专区久久久| 亚洲视频免费在线看| 色偷偷亚洲第一综合| 亚洲伊人久久精品影院| 最近免费中文字幕高清大全 | 亚洲AV无码久久久久网站蜜桃| 永久免费bbbbbb视频| 一级免费黄色毛片| 亚洲高清美女一区二区三区| 在线免费观看韩国a视频| selaoban在线视频免费精品| 亚洲综合激情另类小说区| 国产成人高清精品免费软件| a级黄色毛片免费播放视频| 亚洲国产精品一区二区三区在线观看|