在Java中应用系统中,常常会有很多的代码表要处理,这些处理需求主要表现在通过代码获取名称,获取该代码的其他信息,如果每次都通过查询数据库来处理,是必消耗大量的资源,速度也慢,因为每次连接连接数据库要付出的代价是高昂的。
那如何解决上面这些问题呢?我们可以考虑使用Java对象的缓存技术来实现,即,将代码表以对象的方式存储起来,最容易考虑到的就是Map对象,Map的key用来存放代码,value用来存放代码对象,这样,就可以通过代码方便获取代码表的各种信息。
另外代码表工具类是是不需要创建对象和被继承的,只需要通过类名获取代码初始化的时候所填充的Map对象即可。因此定义类的时候类名应该被final修饰,默认构造方法应该是private的,其他工具方法应该是public static的,还应该有个static代码块,在类加载的时候初始化代码表。
那如何解决上面这些问题呢?我们可以考虑使用Java对象的缓存技术来实现,即,将代码表以对象的方式存储起来,最容易考虑到的就是Map对象,Map的key用来存放代码,value用来存放代码对象,这样,就可以通过代码方便获取代码表的各种信息。
另外代码表工具类是是不需要创建对象和被继承的,只需要通过类名获取代码初始化的时候所填充的Map对象即可。因此定义类的时候类名应该被final修饰,默认构造方法应该是private的,其他工具方法应该是public static的,还应该有个static代码块,在类加载的时候初始化代码表。
下面给出个例子:假设有个期别代码表,期别代码表包含三个属性:代码、名称类型。我现在就要实现一个期别代码表工具类,来展示上面的处理思想。
/**
* 期别代码Bean
* File: StageBean.java
* User: leizhimin
* Date: 2008-2-22 9:33:30
*/
* 期别代码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
*/
* 期别代码工具类
* 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
*/
* 重新加载期别代码
*
* @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>
*/
* 获取期别代码表
*
* @return Map<String, StageBean>
*/
public
static
Map<String, StageBean> getCodeMap() { return
codeMap; }
/**
* 判断期别代码表是否已经载入
*
* @return boolean
*/
* 判断期别代码表是否已经载入
*
* @return boolean
*/
public
static
boolean
isLoad() { return
isLoad; }
/**
* 获取查询期别代码表的SQL
*
* @return String
*/
* 获取查询期别代码表的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
*/
* 模拟客户端测试类
* 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
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
欢迎留言交流。