Java对代码表的处理技巧

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 = "\n" +
             "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
 
欢迎留言交流。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值