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 !=  nulltry { 
                stmt.close(); 
            }  catch (SQLException e) { 
                log.error( "关闭数据库Statement对象失败!"); 
                e.printStackTrace(); 
            } 
             if (conn !=  nulltry { 
                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、付费专栏及课程。

余额充值