Java對程式碼表的處理技巧
在Java中應用系統中,常常會有很多的程式碼表要處理,這些處理需求主要表現在通過程式碼獲取名稱,獲取該程式碼的其他資訊,如果每次都通過查詢資料庫來處理,是必消耗大量的資源,速度也慢,因為每次連線連線資料庫要付出的代價是高昂的。
那如何解決上面這些問題呢?我們可以考慮使用Java物件的快取技術來實現,即,將程式碼表以物件的方式儲存起來,最容易考慮到的就是Map物件,Map的key用來存放程式碼,value用來存放程式碼物件,這樣,就可以通過程式碼方便獲取程式碼表的各種資訊。
另外程式碼表工具類是是不需要建立物件和被繼承的,只需要通過類名獲取程式碼初始化的時候所填充的Map物件即可。因此定義類的時候類名應該被final修飾,預設構造方法應該是private的,其他工具方法應該是public static的,還應該有個static程式碼塊,在類載入的時候初始化程式碼表。
下面給出個例子:假設有個期別程式碼表,期別程式碼表包含三個屬性:程式碼、名稱型別。我現在就要實現一個期別程式碼表工具類,來展示上面的處理思想。
 
/**
* 期別程式碼Bean
* File: StageBean.java
* User: leizhimin
* Date: 2008-2-22 9:33:30
*/

public class StageBean {
    private String code;    //程式碼
    private String name;    //名稱
    private String type;    //型別

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.topsoft.icisrpt.common.beans.StageBean;
import com.topsoft.icisrpt.common.util.DBUtil;

import java.util.Map;
import java.util.HashMap;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
* 期別程式碼工具類
* File: StageCode.java
* User: leizhimin
* Date: 2008-2-22 9:35:43
*/

public final class StageCode {
    private static final Log log = LogFactory.getLog(StageCode.class);
    private static Map<String, StageBean> codeMap = new HashMap<String, StageBean>();
    private static boolean isLoad = false;
    private static final String sql =
+
            “SELECT DM,MC,LX FROM RPT.DM_BBQB”;

    static {
        reLoad();
    }

    /**
     * 私有構造方法,禁止建立物件
     */

    private StageCode() {
    }

    /**
     * 重新載入期別程式碼
     *
     * @return boolean
     */

    public static boolean reLoad() {
        boolean flag = false;
        Connection conn = DBUtil.makeConnection();
        Statement stmt = null;
        try {
            stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT);
            ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()) {
                StageBean stageBean = new StageBean();
                stageBean.setCode(rs.getString(“DM”));
                stageBean.setName(rs.getString(“MC”));
                stageBean.setType(rs.getString(“LX”));
                codeMap.put(stageBean.getCode(), stageBean);
            }
            isLoad = true;
            flag = true;
        } catch (SQLException e) {
            log.error(“載入期別程式碼表發生異常!”);
            e.printStackTrace();
        } finally {
            if (stmt != null) try {
                stmt.close();
            } catch (SQLException e) {
                log.error(“關閉資料庫Statement物件失敗!”);
                e.printStackTrace();
            }
            if (conn != null) try {
                conn.close();
            } catch (SQLException e) {
                log.error(“關閉資料庫連線失敗!”);
                e.printStackTrace();
            }
        }
        log.info(“載入期別程式碼表” + (flag ? “成功!” : “失敗!”));
        return flag;
    }

    /**
     * 獲取期別程式碼表
     *
     * @return Map<String, StageBean>
     */

    public static Map<String, StageBean> getCodeMap() {
        return codeMap;
    }

    /**
     * 判斷期別程式碼表是否已經載入
     *
     * @return boolean
     */

    public static boolean isLoad() {
        return isLoad;
    }

    /**
     * 獲取查詢期別程式碼表的SQL
     *
     * @return String
     */

    public static String getSql() {
        return sql;
    }
}

 
import java.util.Map;
import java.util.Collection;
import java.util.Iterator;

/**
* 模擬客戶端測試類
* File: TestStageCode.java
* User: leizhimin
* Date: 2008-2-22 9:40:29
*/

public class TestStageCode {
    public static void main(String args[]) {
        Map<String, StageBean> codeMap = StageCode.getCodeMap();
        Collection<StageBean> col = codeMap.values();
        System.out.println(“查詢的SQL程式碼為:” + StageCode.getSql());
        System.out.println(“------------------”);
        System.out.println(“下面是查詢到程式碼表內容:”);
        for (Iterator it = col.iterator(); it.hasNext();) {
            StageBean bean = (StageBean) it.next();
            System.out.println(bean.getCode() + ” —— “ + bean.getName() + ” —— “ + bean.getType());
        }
    }
}

 
執行結果:
查詢的SQL程式碼為:
SELECT DM,MC,LX FROM RPT.DM_BBQB
------------------
下面是查詢到程式碼表內容:
D —— 冬季 季報 —— J
01 —— 01月 月報 —— Y
07 —— 07月 月報 —— Y
C —— 春季 季報 —— J
02 —— 02月 月報 —— Y
B —— 下半年 年報 —— B
Q —— 秋季 季報 —— J
06 —— 06月 月報 —— Y
03 —— 03月 月報 —— Y
10 —— 10月 月報 —— Y
04 —— 04月 月報 —— Y
05 —— 05月 月報 —— Y
A —— 上半年 年報 —— B
11 —— 11月 月報 —— Y
09 —— 09月 月報 —— Y
N —— 年報 —— N
12 —— 12月 月報 —— Y
08 —— 08月 月報 —— Y
X —— 夏季 季報 —— J

Process finished with exit code 0

 
歡迎留言交流。