OpenHandX-Real 1.02
輕量級持久工具
2012-10-02
作者:彭明華
openhandx@foxmail.com
本文檔中的任何部分都不得以任何手段任何形式進(jìn)行復(fù)制與傳播
目錄
1 前言
2 OpenHandX-real與主流ORM持久框架的比較
3 需求
4 名次解釋
5 主要特性
6 學(xué)習(xí)前提
7 JDBC支持
7.1 DeleteSupport
7.2 InsertSupport
7.3 UpdateSupport
7.4 ExecuteSupport
7.5 QuerySupport
7.6 SqlMapSupport
7.7 AbstractTableDAO
7.8 注意
8 SQL字段映射
9 SQLMAP支持
9.1 SQLMAP文件編寫
9.2 SQLMAP文件使用
10 SPRING支持
11 常用工具類
11.1 自動編號類
11.2 業(yè)務(wù)日志類
11.3 枚舉常量類
11.4 系統(tǒng)信息類
11.5 樹型結(jié)構(gòu)類
11.5.1 COMMON樹型結(jié)構(gòu)類
11.5.2 SEARCH樹型結(jié)構(gòu)類
11.6 注意
12 OpenHandX所有項目介紹
1 前言
OpenHandX-real是一個小巧的JDBC輕量級封裝的工具包,其最核心的特性是查詢結(jié)果集、以及增、刪、改、按主鍵查詢的封裝。可以直接將查詢出來的結(jié)果集封裝成JavaBean、編輯表數(shù)據(jù)時自動匹配字段和數(shù)據(jù)類型,這就為開發(fā)者做了最枯燥乏味、最容易出錯的工作。還提供了spring的支持,由spring統(tǒng)一管理數(shù)據(jù)庫事務(wù)。除此之外還提供一些常用應(yīng)用工具類,如:樹型結(jié)構(gòu)類、枚舉常量類、業(yè)務(wù)日志類、系統(tǒng)信息類、業(yè)務(wù)編號類。
1.02版本后增加了數(shù)據(jù)庫的兼容性,支持SqlServer、Oracle、Sybase、MySql幾個主流數(shù)據(jù)庫,增加了AbstractTableDAO大大簡化對單表增刪改插的開發(fā)工作。真正實(shí)現(xiàn)零SQL零配置文件的數(shù)據(jù)庫開發(fā)。
2 OpenHandX-real與主流ORM持久框架的比較
首先主流ORM是一種比較優(yōu)秀的框架,隨著面向?qū)ο蟮?a target="_new">軟件開發(fā)方法發(fā)展而產(chǎn)生的,通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將java程序中的對象自動持久化到關(guān)系數(shù)據(jù)庫中,ORM實(shí)際上是對象-關(guān)系映射。
ORM優(yōu)勢:
1、隱藏了數(shù)據(jù)訪問細(xì)節(jié),“封閉”的通用數(shù)據(jù)庫交互,ORM的核心。他使得開發(fā)者的通用數(shù)據(jù)庫交互變得簡單易行,并且完全不用考慮SQL語句;
2、ORM使開發(fā)者構(gòu)造固化數(shù)據(jù)結(jié)構(gòu)變得簡單易行。在ORM年表的史前時代,開發(fā)者需要將對象模型轉(zhuǎn)化為一條一條的SQL語句,通過直連或是DB helper在關(guān)系數(shù)據(jù)庫構(gòu)造開發(fā)者的數(shù)據(jù)庫體系。而現(xiàn)在,基本上所有的ORM框架都提供了通過對象模型構(gòu)造關(guān)系數(shù)據(jù)庫結(jié)構(gòu)的功能。
ORM缺點(diǎn):
1、自動化映射和關(guān)聯(lián)管理,是犧牲性能代價,雖然有延遲加載技術(shù),也存在N+1的困擾,并且延遲加載不能跨越到分布式部署的web層等問題;
2、雖然隱藏了數(shù)據(jù)層面的業(yè)務(wù)抽象,但并不能完全的屏蔽掉數(shù)據(jù)庫層的設(shè)計,并且無疑將增加學(xué)習(xí)成本;
3、對于復(fù)雜查詢,ORM仍然力不從心。雖然可以實(shí)現(xiàn),但是不值的。
OpenHandX-real是在ORM優(yōu)缺點(diǎn)中找一個平衡點(diǎn),通過使用統(tǒng)一數(shù)據(jù)對象與數(shù)據(jù)庫數(shù)據(jù)之間自動轉(zhuǎn)換,將統(tǒng)一數(shù)據(jù)對象非常容易地持久化到關(guān)系數(shù)據(jù)庫中。OpenHandX-real也有兩大優(yōu)點(diǎn):
1、增、刪、改、按主鍵查詢操作的SQL本身不復(fù)雜,而且SQL性能沒有什么可優(yōu)化的余地,即使優(yōu)化也是關(guān)系數(shù)據(jù)庫本身索引和合理性。所以對于增、刪、改的操作,OpenHandX-Real自動完成SQL和數(shù)據(jù)的組裝并執(zhí)行,開發(fā)者不用寫SQL和操作PreparedStatement;
2、相反對于列表查詢操作,隨著信息技術(shù)的不斷發(fā)展,要求越來越高,多表關(guān)聯(lián)查詢,翻頁查詢,性能優(yōu)化的程度很大。因此對于查詢OpenHandX-Real直接通過SQL操作,由開發(fā)者自行決定SQL或數(shù)據(jù)庫的優(yōu)化,因此可以他的性能完全可以做到最優(yōu)。對于查詢結(jié)果集的返回由OpenHandX-Real工具自動完成,組裝翻頁數(shù)據(jù),將開發(fā)成本降到最低;
OpenHandX-real的目的不是取代ORM框架,而是ORM框架的補(bǔ)充。為那些追求良好的性能、數(shù)據(jù)庫設(shè)計經(jīng)驗(yàn)豐富的人提供有力的支持。
3 需求
OpenHandX-Real 1.02需要:
l Java 5
l open-common1.04
l commons-lang-2.1
l commons-beanutils-1.7
l commons-logging-1.0.4
l spring2.0以上及相關(guān)(可選)
l db-derby-10.5.3.0 (可選)
l javassist3.3
4 名次解釋
l 數(shù)據(jù)對象:OpenHandX-common提供的單條數(shù)據(jù)存儲對象RecordVO、多條數(shù)據(jù)存儲對象RecordSetVO、PersistenceRecordSetVO、復(fù)合數(shù)據(jù)存儲對象MulripleVO
5 主要特性
l SQL生成和數(shù)據(jù)的組裝-自動生成增、刪、改、按主鍵查詢操作的SQL和數(shù)據(jù)的組裝, 使數(shù)據(jù)庫開發(fā)變得簡單易行;
l 查詢結(jié)果集封裝和持續(xù)優(yōu)化的執(zhí)行效率-允許開發(fā)者自己寫查詢SQL,SQL的效率完全控制在開發(fā)者手里,并能根據(jù)實(shí)際情況持續(xù)優(yōu)化;
l 結(jié)果集的數(shù)據(jù)加工功能-結(jié)果集返回是RecordSetVO對象, RecordSetVO對象本身具有排序、分組、檢索、統(tǒng)計、不重復(fù)值等功能
l 海量數(shù)據(jù)的支持-集成了OpenHandX-common特有持久PersistenceRecordSetVO對象,能一次從數(shù)據(jù)庫中取出所有數(shù)據(jù)(只要應(yīng)用服務(wù)器硬盤的剩余空間足夠大),取出這些海量數(shù)據(jù)不占當(dāng)前應(yīng)用服務(wù)器的內(nèi)存;
l JDBC支持-由開發(fā)者自己管控數(shù)據(jù)庫連接、事務(wù),充分發(fā)揮開發(fā)者的想象力,提供開發(fā)者的高自由度,剩下繁瑣的工作就由OpenHandX-real完成;
l 支持大數(shù)據(jù)對象-開發(fā)者只要提供InputStream和OutputStream接口對象就能讀取數(shù)據(jù)庫的BLOB和CLOB數(shù)據(jù);
l SPRING支持-OpenHandX-real與Spring做了無縫的集成,由spring管理DAO和Service類、數(shù)據(jù)庫連接池、數(shù)據(jù)庫事務(wù);
l XML的SQLMAP支持-OpenHandX-real提供輕巧的SQL管理功能,允許開發(fā)者將SQL保存在XML配置文件中,便于統(tǒng)一規(guī)范和管理;
l SQL字段映射-很多時候依靠OpenHandX-real自動字段匹配功能不能完成的工作時,如:數(shù)據(jù)對象多個字段對應(yīng)數(shù)據(jù)庫中同一個字段時需要通過字段映射強(qiáng)制指定
l 常用工具類-OpenHandX-real提供了樹型結(jié)構(gòu)類、常量類、業(yè)務(wù)日志類、系統(tǒng)信息類、業(yè)務(wù)編號類的DAO和Service的實(shí)現(xiàn)類,也分別提供了JDBC和spring的實(shí)現(xiàn)
6 學(xué)習(xí)前提
要用好OpenHandX-real首先要學(xué)會OpenHandX-common的數(shù)據(jù)對象,這方面資料請查看《OpenHandX-Common》的數(shù)據(jù)模型章節(jié)。
7 JDBC支持
OpenHandX-real JDBC支持類在open.real.jdbc下,分別提供了DeleteSupport數(shù)據(jù)刪除支持類、InsertSupport數(shù)據(jù)新增支持類、UpdateSupport數(shù)據(jù)更新支持類、QuerySupport數(shù)據(jù)查詢支持類、任意SQL執(zhí)行支持類ExecuteSupport。
7.1 DeleteSupport
public static int delete(Connection cnn,String tableName,String condKey,Object value)
刪除符合一個條件的數(shù)據(jù),經(jīng)常用于刪除單主鍵的數(shù)據(jù) |
public static int delete(Connection cnn,String tableName,RecordVO vo)
刪除符合一條條件的數(shù)據(jù),經(jīng)常用于刪除復(fù)合主鍵的數(shù)據(jù) |
public static int delete(Connection cnn,String tableName,IRecordSetVO vo)
刪除符合多條條件的數(shù)據(jù),經(jīng)常用于多條數(shù)據(jù) |
7.2 InsertSupport
public static int insert(Connection cnn,String tableName,RecordVO vo)
插入一條數(shù)據(jù) |
public static int insert(Connection cnn,String tableName,IRecordSetVO vo,LargeObject... larges)
插入一條數(shù)據(jù),支持BLOB或CLOB字段,其中l(wèi)arges[0]對應(yīng)第一個字段,larges[1]對應(yīng)第二個字段 |
public static int insert(Connection cnn,String tableName,IRecordSetVO vo)
插入多條數(shù)據(jù) |
7.3 UpdateSupport
public static int update(Connection cnn,String tableName,IRecordSetVO rsvo,String... condNames)
修改多條數(shù)據(jù),只更新rsvo里的字段,其他字段不更新,rsvo中與condNames的同名字段為條件值 |
public static int update(Connection cnn,String tableName,RecordVO vo,RecordVO cond)
更新一條數(shù)據(jù),只更新vo里的字段,其他字段不更新,vo包含要更新的值,cond為條件值 |
public static int update(Connection cnn,String tableName,RecordVO vo,RecordVO cond,LargeObject... larges)
更新一條數(shù)據(jù),只更新vo里的字段,其他字段不更新,vo包含要更新的值,cond為條件值, 支持BLOB或CLOB字段,其中l(wèi)arges[0]對應(yīng)第一個字段,larges[1]對應(yīng)第二個字段 |
public static int update(Connection cnn,String tableName,RecordVO vo,RecordVO cond)
更新一條數(shù)據(jù),只更新vo里的字段,其他字段不更新,vo包含要更新的值,cond為條件值 |
public static int update(Connection cnn,String tableName,RecordVO vo,String... condNames)
更新一條數(shù)據(jù),只更新vo里的字段,其他字段不更新,vo中與condNames的同名字段為條件值 |
public static int update(Connection cnn,String tableName,RecordVO vo,String... condNames,LargeObject... larges)
更新一條數(shù)據(jù),只更新vo里的字段,其他字段不更新,vo中與condNames的同名字段為條件值, 支持BLOB或CLOB字段,其中l(wèi)arges[0]對應(yīng)第一個字段,larges[1]對應(yīng)第二個字段 |
public static int updateAllField(Connection cnn,String tableName,IRecordSetVO rsvo,String... condNames)
修改多條數(shù)據(jù),只更新rsvo里的字段,其他字段設(shè)置為null,rsvo中與condNames的同名字段為條件值 |
public static int updateAllField(Connection cnn,String tableName,RecordVO vo,RecordVO cond)
更新一條數(shù)據(jù),只更新vo里的字段,其他字段設(shè)置為null,vo包含要更新的值,cond為條件值 |
public static int updateAllField(Connection cnn,String tableName,RecordVO vo,RecordVO cond,LargeObject... larges)
更新一條數(shù)據(jù),只更新vo里的字段,其他字段設(shè)置為null,vo包含要更新的值,cond為條件值, 支持BLOB或CLOB字段,其中l(wèi)arges[0]對應(yīng)第一個字段,larges[1]對應(yīng)第二個字段 |
public static int updateAllField(Connection cnn,String tableName,RecordVO vo,String... condNames,LargeObject... larges)
更新一條數(shù)據(jù),只更新vo里的字段,其他字段設(shè)置為null,vo中與condNames的同名字段為條件值 |
public static int updateAllField(Connection cnn,String tableName,RecordVO vo,String... condNames)
更新一條數(shù)據(jù),只更新vo里的字段,其他字段設(shè)置為null,vo中與condNames的同名字段為條件值, 支持BLOB或CLOB字段,其中l(wèi)arges[0]對應(yīng)第一個字段,larges[1]對應(yīng)第二個字段 |
7.4 ExecuteSupport
public static int execute(Connection cnn,String sql)
執(zhí)行一條sql |
public static int execute(Connection cnn,String... sqls)
執(zhí)行多條sql |
7.5 QuerySupport
public static RecordVO find(Connection cnn,String sql)
執(zhí)行sql得到結(jié)果,并讀取第一條數(shù)據(jù) |
public static RecordVO find(Connection cnn,String sql,OutputStream... streams)
執(zhí)行sql得到結(jié)果,讀取第一條數(shù)據(jù),并將BLOB和CLOB寫入到streams數(shù)據(jù)流中,streams[0]對應(yīng)第一個BLOB或CLOB以次類推 |
public static Long findForLong(Connection cnn,String countSql)
查詢一個整數(shù)值,要求第一個字段必須為整數(shù),經(jīng)常用于查詢數(shù)據(jù)庫數(shù)據(jù)總數(shù) |
public static MulripleVO pageQuery
根據(jù)SQL做翻頁查詢,返回MulripleVO,其中RecordVO為統(tǒng)計信息,IRecordSetVO為數(shù)據(jù) |
public static RecordSetVO query
執(zhí)行sql得到結(jié)果,并讀取所有數(shù)據(jù) |
public static PersistenceRecordSetVO queryPersistence
執(zhí)行sql得到結(jié)果,并讀取所有數(shù)據(jù),海量數(shù)據(jù)查詢方法 |
7.6 SqlMapSupport
SqlMapSupport將SQLMAP和SQL字段映射結(jié)合在一起,SqlMapSupport傳入的參數(shù)不在是SQL本身,而是SQLMAP的SQL-id。具體參考后面的章節(jié)
7.7 AbstractTableDAO
AbstractTableDAO是抽象實(shí)現(xiàn)單表增刪改查方法,只需設(shè)置表名和主鍵,無需寫SQL及繁瑣的配置文件,就完成了DAO的開發(fā)大大簡化了開發(fā)工作。
例如:
public class TestDAO extends AbstractTableDAO {
@Override
protected String getTable() {
return "riv_marketservice";
}
@Override
protected String[] getTableKeys() {
return new String[]{"ID"};
}
} |
7.8 注意
1、DeleteSupport、InsertSupport、UpdateSupport字段的匹配原則:OpenHandX-real將數(shù)據(jù)對象里的字段與tableName表名中一致的字段進(jìn)行匹配,自動生成SQL并操作PreparedStatement賦值,最后執(zhí)行SQL
2、DeleteSupport、InsertSupport、UpdateSupport、ExecuteSupport提供了setBatchCache靜態(tài)方法,該方法用于刪除、修改、更新、執(zhí)行多條SQL的批量提交SQL數(shù)量(默認(rèn)為10),開發(fā)者可以根據(jù)數(shù)據(jù)庫的實(shí)際情況自己設(shè)定。
DeleteSupport、InsertSupport、UpdateSupport的字段匹配使用了jdbc的ResultSetMetaData類,如果每次匹配都先查詢表結(jié)構(gòu)會影響性能,open.real.core.RealTableMetaData本身可以緩存表結(jié)構(gòu),方法為setCacheTableMeta靜態(tài)方法(默認(rèn)為不緩存)
8 SQL字段映射
依靠OpenHandX-real自動字段匹配功能不能完成的工作時,或者數(shù)據(jù)對象與表中字段名不匹配時需要使用SQL字段映射
SQL字段映射是完成sql中宏變量與數(shù)據(jù)對象字段的對應(yīng),生成新的SQL。宏的格式為:#字段名#
SqlAlludeExecuteSupport類提供數(shù)據(jù)維護(hù)類的方法
SqlAlludeQuerySupport類提供數(shù)據(jù)查詢類的方法
具體使用如下:
String sql=”update TABLE1 set f2=#f2# where f1=#f1#”;
RecordVO vo 為 f1=”0001”,f2=”test”
int[] types為{ java.sql.Types.VARCHAR, java.sql.Types.VARCHAR}
SqlAlludeExecuteSupport. execute(cnn, sql, vo, types)
組裝成SQL為update TABLE1 set f2=? where f1=?
并以PreparedStatement的st.setString(1,"test");st.setString(1,"0001");
其中#f2#對應(yīng)到vo的f2字段,#f1#對應(yīng)到vo的f1字段 |
也可以update TABLE1 set ID=#CODE1# where ID=#CODE2#,用于修改主鍵
Types參數(shù)可以為{ java.sql.Types.VARCHAR, java.sql.Types.VARCHAR},也可以為{1,1}
9 SQLMAP支持
允許開發(fā)者將SQL保存在XML配置文件中,便于統(tǒng)一規(guī)范和管理。同時支持多個XML的SQLMAP文件。
9.1 SQLMAP文件編寫
SQLMAP文件格式如下:
<config nameSpace="命名空間">
<file name="其他SQLMAP文件及路徑"/>
…
<sql id="唯一編號" sql="sql語句" type="如果有字段映射請指定數(shù)據(jù)類型"/>
…
</config> |
例如:
<?xml version="1.0" encoding="UTF-8"?>
<config nameSpace="space001">
<file name="sqlmap1.xml"/>
<sql id="sql001" sql="select * from TestTable"/>
<sql id="sql002" sql="update TestTable set TS_INT=TS_INT"/>
<sql id="sql003" sql="update TestTable set TS_INT=#TS_INT# and TS_LONG=#TS_LONG#" type="4,5"/>
</config> |
注意:
1、命名空間不是必須的;
2、同一個命名空間下sql id不能重復(fù);
3、同一個SQLMAP文件可以指定多個file(其他SQLMAP文件及路徑);
4、其中type格式為: 數(shù)據(jù)類型1, 數(shù)據(jù)類型2, 數(shù)據(jù)類型3…,數(shù)據(jù)類型可以為數(shù)字,也可以為常量名(java.sql.Types的常量名)。如:"4,5"可以寫為"INTEGER,SMALLINT"
9.2 SQLMAP文件使用
使用SqlMapManager類對配置文件進(jìn)行管理。
JDBC方式如下:
第一步:給SqlMapManager設(shè)置SQLMAP的文件的路徑,調(diào)用SqlMapManager. setRootPath方法
第二步:調(diào)用SqlMapManager.init方法初始化 |
例如:
SqlMapManager.setRootPath("D:/OpenHandX/real/real/config");
SqlMapManager.init(); |
Spring方式如下:
在applicationContext.xml文件里配置好路徑和初始化方法 |
例如:
<bean id="sqlMapConfigManager" class="open.real.sqlmap.SqlMapManager" init-method="init" >
<property name="path" value="classpath:"/>
</bean> |
以上方法只要初始化一次即可,后面就有3種使用方法:
1、直接使用SqlMapManager
取出SQL語句使用SqlMapManager.getSql方法
取出SQL的types使用SqlMapManager. getTypes方法
System.out.println(SqlMapManager.getSql("space002.sql003"));
System.out.println(SqlMapManager.getTypes("space001.sql004")); |
由以上方法取出的SQL和types就可以調(diào)出相關(guān)的方法操作了
QuerySupport.query(Connection cnn, SqlMapManager.getSql("space002.sql001"))
SqlAlludeQuerySupport.query(cnn, SqlMapManager.getSql("space002.sql001"), cond, SqlMapManager.getTypes("space002.sql001"))
|
2、使用JDBC的SqlMapSupport類
3、使用Spring的RealSqlMapTemplate模板類
10 SPRING支持
OpenHandX-real SPRING支持類在open.real.spring下,分別提供了RealTemplate基本支持類、RealSqlMapTemplate字段映射和SQLMAP支持類。用法很簡單大家查考前面的6.1-6.3章節(jié)和相應(yīng)的javadoc。
使用的時候只要繼承RealTemplate或RealSqlMapTemplate類,掉父類相應(yīng)的方法。
11 常用工具類
11.1 自動編號類
該工具類幫助開發(fā)者創(chuàng)建一個業(yè)務(wù)編號,比如:流水號、產(chǎn)品編號等。自動編號類需要在數(shù)據(jù)庫創(chuàng)建一張表:
字段名 |
中文名 |
說明 |
TYPE |
自動編號類型 |
每個自動編號的主鍵,如:流水號為1、產(chǎn)品號為2 |
EXP |
編號表達(dá)式 |
最終生成編號的模板 |
CURRNUM |
當(dāng)前計數(shù)器 |
當(dāng)前已生成第幾個號 |
DES |
說明 |
|
MINNUM |
最小計數(shù)器 |
當(dāng)前計數(shù)器的允許最小值 |
MAXNUM |
最大計數(shù)器 |
當(dāng)前計數(shù)器的允許最大值 |
STEP |
計數(shù)器步幅 |
每獲取新編號 當(dāng)前計數(shù)器時距上一個編號的當(dāng)前計數(shù)器差距 |
CURRTIME |
當(dāng)前時間 |
創(chuàng)建新編號時的時間 |
LEN |
計數(shù)器長度 |
允許計數(shù)器轉(zhuǎn)化成字符串的長度 |
FILLCHAR |
填充字符 |
如果LEN大于CURRNUM的長度則用該,字符在前面補(bǔ)齊 |
AutoNumberService方法如下:
public String getAutoNumber(Connection cnn,Integer type)
獲取某個業(yè)務(wù)類型為type的一個編號 |
public List<String> getAutoNumber(Connection cnn,Integer type,int count)
獲取某個業(yè)務(wù)類型為type的count個編號 |
public List<String> getAutoNumber(Connection cnn,Integer type,int count,RecordVO vo)
獲取某個業(yè)務(wù)類型為type的一個編號,需要使用vo數(shù)據(jù)作為模板 |
public String getAutoNumber(Connection cnn,Integer type,RecordVO vo)
獲取某個業(yè)務(wù)類型為type的count個編號,需要使用vo數(shù)據(jù)作為模板 |
例如:
在數(shù)據(jù)庫里定義一個自動編號為:
TYPE=1,EXP= "PRD{number}",LEN=10,FILLCHAR=0
如果此時CURRNUM為23,getAutoNumber(cnn,1)獲取后的編碼為:PRD0000000024
|
在數(shù)據(jù)庫里定義一個自動編號為:
TYPE=1,EXP= " FB{prdCode}{number}",LEN=7,FILLCHAR=0
vo的數(shù)據(jù)為prdCode="001"
如果此時CURRNUM為23,getAutoNumber(cnn,1,vo)獲取后的編碼為:FB0010000024
|
11.2 業(yè)務(wù)日志類
用于記錄通常業(yè)務(wù)操作發(fā)生的時間、地點(diǎn)、事件,必要的時候可以記錄操作人
字段名 |
中文名 |
說明 |
LOGCODE |
日志編號 |
主鍵 |
LOGTIME |
日志時間 |
生成業(yè)務(wù)日志時的時間 |
LOGTYPE |
信息類型 |
業(yè)務(wù)日志的類型 |
LOGTITLE |
信息標(biāo)題 |
業(yè)務(wù)日志的簡述 |
LOGMESSAGE |
日志信息 |
業(yè)務(wù)日志的內(nèi)容 |
AutoNumberService方法如下:
public int insertBusLog(Connection cnn,RecordVO vo)
|
public int insertBusLog(Connection cnn,String code,Date time,Integer type,String title,String message)
|
11.3 枚舉常量類
枚舉常量類用在系統(tǒng)中不會經(jīng)常變動的常量數(shù)據(jù),例如:性別(男、女)、學(xué)歷(初中、高中、大專、本科…)。象這類的數(shù)據(jù)可以統(tǒng)一管理起來,統(tǒng)一顯示名稱、統(tǒng)一多語言化管理
枚舉類型主表
字段名 |
中文名 |
說明 |
TYPECODE |
類型編號 |
主鍵 |
NAME |
名稱 |
簡稱,如:性別 |
DES |
說明 |
說明該枚舉的作用 |
枚舉值表
字段名 |
中文名 |
說明 |
TYPECODE |
類型編號 |
主鍵 |
VALUE |
值 |
枚舉的值,如:男為1、女為2 |
NAME1 |
名稱1 |
顯示的中文名稱,如:男、女 |
NAME2 |
名稱2 |
顯示英文名稱,如:male、female |
NAME3 |
名稱3 |
其他語言的名稱 |
NAME4 |
名稱4 |
。。。 |
NAME5 |
名稱5 |
。。。 |
EnumService方法如下:
public MulripleVO getEnum(Connection cnn,String code)
獲取枚舉類型及其下的所有枚舉值 |
public RecordVO getEnumValue(Connection cnn,String code,String value)
獲取枚舉類型和值下的枚舉值定義 |
public String getEnumValueName(Connection cnn,String code,String value)
獲取枚舉類型和值下的枚舉值名稱 |
public RecordSetVO getEnumValues(Connection cnn,String code)
獲取枚舉類型下的所有枚舉值 |
public void setLanguage(int language)
設(shè)置當(dāng)前EnumService的默認(rèn)語言,默認(rèn)為1(取NAME1字段) |
11.4 系統(tǒng)信息類
系統(tǒng)中還會有信息提示,如:錯誤信息提示,這些信息提示的完整和規(guī)范直接影響用戶友好性。系統(tǒng)信息類提供統(tǒng)一規(guī)范的信息提示模板及多語言支持。
字段名 |
中文名 |
說明 |
CODE |
編號 |
主鍵 |
TYPE |
類型 |
信息類型 |
MESSAGE1 |
信息1 |
中文信息模板 |
MESSAGE2 |
信息2 |
英文信息模板 |
MESSAGE3 |
信息3 |
其他語言信息模板 |
MESSAGE4 |
信息4 |
。。。 |
MESSAGE15 |
信息5 |
。。。 |
MessageService方法如下:
public String getMessageText(Connection cnn,String code,RecordVO vo)
根據(jù)信息編號獲取信息 |
public void setLanguage(int language)
設(shè)置當(dāng)前MessageService的默認(rèn)語言,默認(rèn)為1(取MESSAGE1字段) |
模板的定義,可以是一串字符,字符中可以包含宏,宏的格式為{字段名}。
如:
vo的數(shù)據(jù)為:f1="員工號"
數(shù)據(jù)庫表中MESSAGE1="{f1}輸入不能為空!"
通過MessageService的方法可以得到"員工號輸入不能為空!"
11.5 樹型結(jié)構(gòu)類
系統(tǒng)中對樹的使用也非常多,如:組織機(jī)構(gòu)、產(chǎn)品等。樹型結(jié)構(gòu)類將這些結(jié)構(gòu)的數(shù)據(jù)統(tǒng)一放在一個表中,再通過專門的實(shí)現(xiàn)類提供的檢索方法。這樣有利于代碼重用,提高開發(fā)效率。實(shí)現(xiàn)業(yè)務(wù)數(shù)據(jù)與數(shù)據(jù)結(jié)構(gòu)分離。OpenHandX-real提供兩種實(shí)現(xiàn)方法。
11.5.1COMMON樹型結(jié)構(gòu)類
普通樹實(shí)現(xiàn),是通過PARENTID字段完成樹型結(jié)構(gòu)組建,這種樹結(jié)構(gòu)簡單,插入、移動、刪除一個節(jié)點(diǎn)相對較快,但是檢索所有子、所有祖先必須遞歸效率非常低,節(jié)點(diǎn)數(shù)越多越明顯。
字段名 |
中文名 |
說明 |
TYPE |
樹類型 |
樹的類型,一個類型代表一棵樹,如:機(jī)構(gòu)樹為1、產(chǎn)品樹為2 |
BUSID |
業(yè)務(wù)ID |
對應(yīng)到業(yè)務(wù)數(shù)據(jù)的主鍵,如:機(jī)構(gòu)編號、產(chǎn)品編號 |
PARENTID |
父ID |
上級業(yè)務(wù)數(shù)據(jù)主鍵 |
SORT |
順序 |
同級的顯示順序 |
11.5.2SEARCH樹型結(jié)構(gòu)類
最優(yōu)樹實(shí)現(xiàn),數(shù)據(jù)架構(gòu)增加級別、左右跨度,它所有的子節(jié)點(diǎn)都在它的跨度范圍內(nèi)。這種的的新增、移動效率非常低,但是檢索所有子、所有祖先效率非常高。用于樹變化量較小,查詢較多的應(yīng)用中。
字段名 |
中文名 |
說明 |
TYPE |
樹類型 |
樹的類型,一個類型代表一棵樹,如:機(jī)構(gòu)樹為1、產(chǎn)品樹為2 |
BUSID |
業(yè)務(wù)ID |
對應(yīng)到業(yè)務(wù)數(shù)據(jù)的主鍵,如:機(jī)構(gòu)編號、產(chǎn)品編號 |
LVL |
級別 |
當(dāng)前數(shù)據(jù)所處的級別 |
LEFTSETP |
左跨度-下級的最小 |
所有下級的LEFTSETP大于等于當(dāng)前的LEFTSETP |
RIGHTSETP |
右跨度-下級的最大 |
所有下級的RIGHTSETP小于等于當(dāng)前的RIGHTSETP |
SEARCH樹實(shí)現(xiàn)原理是通過LEFTSETP、RIGHTSETP來決定上下級,其中上級節(jié)點(diǎn)的LEFTSETP、RIGHTSETP包含所有子節(jié)點(diǎn)的LEFTSETP、RIGHTSETP。同級兄弟節(jié)點(diǎn)之間的LEFTSETP、RIGHTSETP不會交叉。通過此原理實(shí)現(xiàn)的樹,能很容易完成對所有子的檢索(任意深度)。同時DAO還提供SQL where子句的方法便于開發(fā)者與業(yè)務(wù)表做關(guān)聯(lián)查詢。
public String getAllChildrenWhere(Connection cnn,String table,int type,String busId)
查詢busId所有子的SQL where子句 |
public String getNextChildrenWhere(Connection cnn,String table,int type,String busId)
查詢busId下一級子的SQL where子句 |
public String getBorthersWhere(Connection cnn,String table,int type,String busId)
查詢busId同級兄弟的SQL where子句 |
public String getParentWhere(Connection cnn,String table,int type,String busId)
查詢busId上級父的SQL where子句 |
public String getAncestorsWhere(Connection cnn,String table,int type,String busId)
查詢busId上級所有祖先的SQL where子句 |
樹型結(jié)構(gòu)類的方法很多,具體請查看javadoc
11.6 注意
常用工具類所用到的表名都是可以由開發(fā)者自定義的。JDBC或spring的實(shí)現(xiàn)DAO類里都提供setTableName方法。通過此方法來完成。
12 OpenHandX所有項目介紹
項目名稱 |
說明 |
open-Common |
公共開發(fā)包,整理了日常開發(fā)中可能經(jīng)常用到的方法、工具類 |
open-Chart |
圖表工具,核心采用jfreechart,將jfreechart重新包裝簡化,方便使用 |
open-Report |
多維度報表工具,支持表達(dá)式計算、匯總、分組、排序、集成圖表,支持Excel輸出 |
open-Real |
持久層報表工具,封裝jdbc的增、刪、改、查。具有自動匹配sql條件,orm影射 |
open-Batch |
分布式批量架構(gòu),處理復(fù)雜耗時的數(shù)據(jù)加工或ETL加工 |
open-Unreal |
SS(Script-Service)腳本服務(wù)Web開發(fā)框架,并提供WebServie功能 |
open-River |
基于open-unreal的ESB產(chǎn)品,提供代理和點(diǎn)對點(diǎn)模式,并提供快速消息傳輸通道 |
OpenHandX下載地址:http://code.google.com/p/openhandx2/
posted on 2011-01-12 10:05
彭明華 閱讀(2104)
評論(5) 編輯 收藏 所屬分類:
OpenHandX核心