隨筆 - 11  文章 - 79  trackbacks - 0
          <2011年4月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          歡迎合作

           

          聯(lián)系方式:openhandx@foxmail.com

           

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           

           

           

           

           

            OpenHandX-Real 1.02

          輕量級持久工具

           

           

           

           

           

           

           

           

           

           

          2012-10-02

           

          作者:彭明華

          openhandx@foxmail.com

           

          本文檔中的任何部分都不得以任何手段任何形式進行復(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ā)工作。真正實現(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實際上是對象-關(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缺點:

          1、自動化映射和關(guān)聯(lián)管理,是犧牲性能代價,雖然有延遲加載技術(shù),也存在N+1的困擾,并且延遲加載不能跨越到分布式部署的web層等問題;

          2、雖然隱藏了數(shù)據(jù)層面的業(yè)務(wù)抽象,但并不能完全的屏蔽掉數(shù)據(jù)庫層的設(shè)計,并且無疑將增加學(xué)習(xí)成本;

          3、對于復(fù)雜查詢,ORM仍然力不從心。雖然可以實現(xiàn),但是不值的。

          OpenHandX-real是在ORM優(yōu)缺點中找一個平衡點,通過使用統(tǒng)一數(shù)據(jù)對象與數(shù)據(jù)庫數(shù)據(jù)之間自動轉(zhuǎn)換,將統(tǒng)一數(shù)據(jù)對象非常容易地持久化到關(guān)系數(shù)據(jù)庫中。OpenHandX-real也有兩大優(yōu)點:

          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框架的補充。為那些追求良好的性能、數(shù)據(jù)庫設(shè)計經(jīng)驗豐富的人提供有力的支持。

          3          需求

          OpenHandX-Real 1.02需要:     

          Java 5

          open-common1.04

          commons-lang-2.1

          commons-beanutils-1.7

          commons-logging-1.0.4

          spring2.0以上及相關(guān)(可選)

          db-derby-10.5.3.0 (可選)

          javassist3.3

          4          名次解釋

          數(shù)據(jù)對象OpenHandX-common提供的單條數(shù)據(jù)存儲對象RecordVO、多條數(shù)據(jù)存儲對象RecordSetVO、PersistenceRecordSetVO、復(fù)合數(shù)據(jù)存儲對象MulripleVO

          5          主要特性

          SQL生成和數(shù)據(jù)的組裝-自動生成增、刪、改、按主鍵查詢操作的SQL和數(shù)據(jù)的組裝, 使數(shù)據(jù)庫開發(fā)變得簡單易行;

          查詢結(jié)果集封裝和持續(xù)優(yōu)化的執(zhí)行效率-允許開發(fā)者自己寫查詢SQL,SQL的效率完全控制在開發(fā)者手里,并能根據(jù)實際情況持續(xù)優(yōu)化;

          結(jié)果集的數(shù)據(jù)加工功能-結(jié)果集返回是RecordSetVO對象, RecordSetVO對象本身具有排序、分組、檢索、統(tǒng)計、不重復(fù)值等功能

          海量數(shù)據(jù)的支持-集成了OpenHandX-common特有持久PersistenceRecordSetVO對象,能一次從數(shù)據(jù)庫中取出所有數(shù)據(jù)(只要應(yīng)用服務(wù)器硬盤的剩余空間足夠大),取出這些海量數(shù)據(jù)不占當(dāng)前應(yīng)用服務(wù)器的內(nèi)存;

          JDBC支持-由開發(fā)者自己管控數(shù)據(jù)庫連接、事務(wù),充分發(fā)揮開發(fā)者的想象力,提供開發(fā)者的高自由度,剩下繁瑣的工作就由OpenHandX-real完成;

          支持大數(shù)據(jù)對象-開發(fā)者只要提供InputStreamOutputStream接口對象就能讀取數(shù)據(jù)庫的BLOBCLOB數(shù)據(jù)

          SPRING支持-OpenHandX-real與Spring做了無縫的集成,由spring管理DAO和Service類、數(shù)據(jù)庫連接池、數(shù)據(jù)庫事務(wù);

          XMLSQLMAP支持-OpenHandX-real提供輕巧的SQL管理功能,允許開發(fā)者將SQL保存在XML配置文件中,便于統(tǒng)一規(guī)范和管理;

          SQL字段映射-很多時候依靠OpenHandX-real自動字段匹配功能不能完成的工作時,如:數(shù)據(jù)對象多個字段對應(yīng)數(shù)據(jù)庫中同一個字段時需要通過字段映射強制指定

          常用工具類-OpenHandX-real提供了樹型結(jié)構(gòu)類、常量類、業(yè)務(wù)日志類、系統(tǒng)信息類、業(yè)務(wù)編號類的DAO和Service的實現(xiàn)類,也分別提供了JDBC和spring的實現(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是抽象實現(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表名中一致的字段進行匹配,自動生成SQL并操作PreparedStatement賦值,最后執(zhí)行SQL

          2、DeleteSupport、InsertSupport、UpdateSupport、ExecuteSupport提供了setBatchCache靜態(tài)方法,該方法用于刪除、修改、更新、執(zhí)行多條SQL的批量提交SQL數(shù)量(默認(rèn)為10),開發(fā)者可以根據(jù)數(shù)據(jù)庫的實際情況自己設(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ù)維護類的方法

          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)

          組裝成SQLupdate 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類對配置文件進行管理。

          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

          編號表達式

          最終生成編號的模板

          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的長度則用該,字符在前面補齊

          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,getAutoNumbercnn1獲取后的編碼為:PRD0000000024

           

          在數(shù)據(jù)庫里定義一個自動編號為:

          TYPE=1,EXP= " FB{prdCode}{number}",LEN=7,FILLCHAR=0

          vo的數(shù)據(jù)為prdCode="001"

          如果此時CURRNUM為23,getAutoNumbercnn1,vo獲取后的編碼為:FB0010000024

           

          11.2 業(yè)務(wù)日志類

          用于記錄通常業(yè)務(wù)操作發(fā)生的時間、地點、事件,必要的時候可以記錄操作人

          字段名

          中文名

          說明

          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

          顯示英文名稱,如:malefemale

          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)中對樹的使用也非常多,如:組織機構(gòu)、產(chǎn)品等。樹型結(jié)構(gòu)類將這些結(jié)構(gòu)的數(shù)據(jù)統(tǒng)一放在一個表中,再通過專門的實現(xiàn)類提供的檢索方法。這樣有利于代碼重用,提高開發(fā)效率。實現(xiàn)業(yè)務(wù)數(shù)據(jù)與數(shù)據(jù)結(jié)構(gòu)分離。OpenHandX-real提供兩種實現(xiàn)方法。

          11.5.1COMMON樹型結(jié)構(gòu)類

          普通樹實現(xiàn),是通過PARENTID字段完成樹型結(jié)構(gòu)組建,這種樹結(jié)構(gòu)簡單,插入、移動、刪除一個節(jié)點相對較快,但是檢索所有子、所有祖先必須遞歸效率非常低,節(jié)點數(shù)越多越明顯。

          字段名

          中文名

          說明

          TYPE

          樹類型

          樹的類型,一個類型代表一棵樹,如:機構(gòu)樹為1、產(chǎn)品樹為2

          BUSID

          業(yè)務(wù)ID

          對應(yīng)到業(yè)務(wù)數(shù)據(jù)的主鍵,如:機構(gòu)編號、產(chǎn)品編號

          PARENTID

          ID

          上級業(yè)務(wù)數(shù)據(jù)主鍵

          SORT

          順序

          同級的顯示順序

           

          11.5.2SEARCH樹型結(jié)構(gòu)類

          最優(yōu)樹實現(xiàn),數(shù)據(jù)架構(gòu)增加級別、左右跨度,它所有的子節(jié)點都在它的跨度范圍內(nèi)。這種的的新增、移動效率非常低,但是檢索所有子、所有祖先效率非常高。用于樹變化量較小,查詢較多的應(yīng)用中。

           

          字段名

          中文名

          說明

          TYPE

          樹類型

          樹的類型,一個類型代表一棵樹,如:機構(gòu)樹為1、產(chǎn)品樹為2

          BUSID

          業(yè)務(wù)ID

          對應(yīng)到業(yè)務(wù)數(shù)據(jù)的主鍵,如:機構(gòu)編號、產(chǎn)品編號

          LVL

          級別

          當(dāng)前數(shù)據(jù)所處的級別

          LEFTSETP

          左跨度-下級的最小

          所有下級的LEFTSETP大于等于當(dāng)前的LEFTSETP

          RIGHTSETP

          右跨度-下級的最大

          所有下級的RIGHTSETP小于等于當(dāng)前的RIGHTSETP

          SEARCH樹實現(xiàn)原理是通過LEFTSETP、RIGHTSETP來決定上下級,其中上級節(jié)點的LEFTSETP、RIGHTSETP包含所有子節(jié)點的LEFTSETP、RIGHTSETP。同級兄弟節(jié)點之間的LEFTSETP、RIGHTSETP不會交叉。通過此原理實現(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的實現(xiàn)DAO類里都提供setTableName方法。通過此方法來完成。

           

           

          12     OpenHandX所有項目介紹

          項目名稱

          說明

          open-Common

          公共開發(fā)包,整理了日常開發(fā)中可能經(jīng)常用到的方法、工具類

          open-Chart

          圖表工具,核心采用jfreechart,將jfreechart重新包裝簡化,方便使用

          open-Report

          多維度報表工具,支持表達式計算、匯總、分組、排序、集成圖表,支持Excel輸出

          open-Real

          持久層報表工具,封裝jdbc的增、刪、改、查。具有自動匹配sql條件,orm影射

          open-Batch

          分布式批量架構(gòu),處理復(fù)雜耗時的數(shù)據(jù)加工或ETL加工

          open-Unreal

          SSScript-Service)腳本服務(wù)Web開發(fā)框架,并提供WebServie功能

          open-River

          基于open-unrealESB產(chǎn)品,提供代理和點對點模式,并提供快速消息傳輸通道

          OpenHandX下載地址:http://code.google.com/p/openhandx2/

           

           

           

          posted on 2011-01-12 10:05 彭明華 閱讀(2113) 評論(5)  編輯  收藏 所屬分類: OpenHandX核心

          FeedBack:
          # 窩窩影視 2011-01-12 15:31 窩窩影視
          學(xué)習(xí)了!  回復(fù)  更多評論
            
          # re: OpenHandX-Real 1.0 2011-01-21 13:56 qiu768
          google code 那里提供的下載,怎么沒有open char的jar包?  回復(fù)  更多評論
            
          # re: OpenHandX-Real 1.0 2011-01-28 20:06 彭明華
          @qiu768
          下載地址:http://code.google.com/p/openhandx/downloads/list
          從沒有什么open char項目啊,real需要open common的  回復(fù)  更多評論
            
          # re: OpenHandX-Real 1.0 2011-04-15 09:24 qiu768
          一直關(guān)注OpenHandX,好久了,怎么工作流跟規(guī)則引擎方面的內(nèi)容沒見發(fā)布?  回復(fù)  更多評論
            
          # re: OpenHandX-Real 1.0 2011-04-19 20:50 彭明華
          @qiu768
          謝謝你的關(guān)注,今年打算推出web框架。工作流引擎和規(guī)則引擎肯定是要發(fā)布的,現(xiàn)在還處于規(guī)劃階段。  回復(fù)  更多評論
            

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 英超| 东丰县| 鲁山县| 应城市| 商南县| 夏河县| 福清市| 阳新县| 抚松县| 昌江| 望城县| 米林县| 临城县| 饶河县| 报价| 离岛区| 普定县| 沂南县| 南昌县| 宣武区| 和平县| 砀山县| 罗城| 峨眉山市| 郧西县| 城步| 英山县| 赤城县| 安化县| 宁武县| 渝中区| 鸡泽县| 东安县| 城固县| 图片| 台北县| 宣化县| 五寨县| 安新县| 怀安县| 合作市|