隨筆 - 11  文章 - 79  trackbacks - 0
          <2011年1月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          歡迎合作

           

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

           

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           

           

           

           

           

            OpenHandX-Real 1.02

          輕量級持久工具

           

           

           

           

           

           

           

           

           

           

          2012-10-02

           

          作者:彭明華

          openhandx@foxmail.com

           

          本文檔中的任何部分都不得以任何手段任何形式進行復制與傳播

           

           

           

          目錄

          1            前言

          2                OpenHandX-real與主流ORM持久框架的比較

          3                需求

          4                名次解釋

          5                主要特性

          6                學習前提

          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è)務日志類

          11.3         枚舉常量類

          11.4         系統(tǒng)信息類

          11.5         樹型結構類

          11.5.1       COMMON樹型結構類

          11.5.2       SEARCH樹型結構類

          11.6         注意

          12         OpenHandX所有項目介紹

           

           


           

          1    前言

          OpenHandX-real是一個小巧的JDBC輕量級封裝的工具包,其最核心的特性是查詢結果集、以及增、刪、改、按主鍵查詢的封裝。可以直接將查詢出來的結果集封裝成JavaBean、編輯表數(shù)據時自動匹配字段和數(shù)據類型,這就為開發(fā)者做了最枯燥乏味、最容易出錯的工作。還提供了spring的支持,由spring統(tǒng)一管理數(shù)據庫事務。除此之外還提供一些常用應用工具類,如:樹型結構類、枚舉常量類、業(yè)務日志類、系統(tǒng)信息類、業(yè)務編號類。

          1.02版本后增加了數(shù)據庫的兼容性,支持SqlServer、Oracle、Sybase、MySql幾個主流數(shù)據庫,增加了AbstractTableDAO大大簡化對單表增刪改插的開發(fā)工作。真正實現(xiàn)零SQL零配置文件的數(shù)據庫開發(fā)。

          2    OpenHandX-real與主流ORM持久框架的比較

          首先主流ORM是一種比較優(yōu)秀的框架,隨著面向對象的軟件開發(fā)方法發(fā)展而產生的,通過使用描述對象和數(shù)據庫之間映射的元數(shù)據,將java程序中的對象自動持久化到關系數(shù)據庫中,ORM實際上是對象-關系映射

          ORM優(yōu)勢:

          1、隱藏了數(shù)據訪問細節(jié),“封閉”的通用數(shù)據庫交互,ORM的核心。他使得開發(fā)者的通用數(shù)據庫交互變得簡單易行,并且完全不用考慮SQL語句;

          2、ORM使開發(fā)者構造固化數(shù)據結構變得簡單易行。在ORM年表的史前時代,開發(fā)者需要將對象模型轉化為一條一條的SQL語句,通過直連或是DB helper在關系數(shù)據庫構造開發(fā)者的數(shù)據庫體系。而現(xiàn)在,基本上所有的ORM框架都提供了通過對象模型構造關系數(shù)據庫結構的功能。

          ORM缺點:

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

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

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

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

          1、增、刪、改、按主鍵查詢操作的SQL本身不復雜,而且SQL性能沒有什么可優(yōu)化的余地,即使優(yōu)化也是關系數(shù)據庫本身索引和合理性。所以對于增、刪、改的操作,OpenHandX-Real自動完成SQL和數(shù)據的組裝并執(zhí)行,開發(fā)者不用寫SQL和操作PreparedStatement;

          2、相反對于列表查詢操作,隨著信息技術的不斷發(fā)展,要求越來越高,多表關聯(lián)查詢,翻頁查詢,性能優(yōu)化的程度很大。因此對于查詢OpenHandX-Real直接通過SQL操作,由開發(fā)者自行決定SQL或數(shù)據庫的優(yōu)化,因此可以他的性能完全可以做到最優(yōu)。對于查詢結果集的返回由OpenHandX-Real工具自動完成,組裝翻頁數(shù)據,將開發(fā)成本降到最低;

          OpenHandX-real的目的不是取代ORM框架,而是ORM框架的補充。為那些追求良好的性能、數(shù)據庫設計經驗豐富的人提供有力的支持。

          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以上及相關(可選)

          db-derby-10.5.3.0 (可選)

          javassist3.3

          4          名次解釋

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

          5          主要特性

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

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

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

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

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

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

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

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

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

          常用工具類-OpenHandX-real提供了樹型結構類、常量類、業(yè)務日志類、系統(tǒng)信息類、業(yè)務編號類的DAO和Service的實現(xiàn)類,也分別提供了JDBC和spring的實現(xiàn)

          6    學習前提

              要用好OpenHandX-real首先要學會OpenHandX-common的數(shù)據對象,這方面資料請查看《OpenHandX-Common》的數(shù)據模型章節(jié)。

           

          7    JDBC支持

          OpenHandX-real JDBC支持類在open.real.jdbc下,分別提供了DeleteSupport數(shù)據刪除支持類、InsertSupport數(shù)據新增支持類、UpdateSupport數(shù)據更新支持類、QuerySupport數(shù)據查詢支持類、任意SQL執(zhí)行支持類ExecuteSupport。

          7.1   DeleteSupport

          public static int delete(Connection cnn,String tableName,String condKey,Object value)

          刪除符合一個條件的數(shù)據,經常用于刪除單主鍵的數(shù)據

          public static int delete(Connection cnn,String tableName,RecordVO vo)

          刪除符合一條條件的數(shù)據,經常用于刪除復合主鍵的數(shù)據

          public static int delete(Connection cnn,String tableName,IRecordSetVO vo)

          刪除符合多條條件的數(shù)據,經常用于多條數(shù)據

          7.2   InsertSupport

          public static int insert(Connection cnn,String tableName,RecordVO vo)

          插入一條數(shù)據

          public static int insert(Connection cnn,String tableName,IRecordSetVO vo,LargeObject... larges)

          插入一條數(shù)據,支持BLOB或CLOB字段,其中l(wèi)arges[0]對應第一個字段,larges[1]對應第二個字段

          public static int insert(Connection cnn,String tableName,IRecordSetVO vo)

          插入多條數(shù)據

          7.3   UpdateSupport

          public static int update(Connection cnn,String tableName,IRecordSetVO rsvo,String... condNames)

          修改多條數(shù)據,只更新rsvo里的字段,其他字段不更新,rsvo中與condNames的同名字段為條件值

          public static int update(Connection cnn,String tableName,RecordVO vo,RecordVO cond)

          更新一條數(shù)據,只更新vo里的字段,其他字段不更新,vo包含要更新的值,cond為條件值

          public static int update(Connection cnn,String tableName,RecordVO vo,RecordVO cond,LargeObject... larges)

          更新一條數(shù)據,只更新vo里的字段,其他字段不更新,vo包含要更新的值,cond為條件值, 支持BLOB或CLOB字段,其中l(wèi)arges[0]對應第一個字段,larges[1]對應第二個字段

          public static int update(Connection cnn,String tableName,RecordVO vo,RecordVO cond)

          更新一條數(shù)據,只更新vo里的字段,其他字段不更新,vo包含要更新的值,cond為條件值

          public static int update(Connection cnn,String tableName,RecordVO vo,String... condNames)

          更新一條數(shù)據,只更新vo里的字段,其他字段不更新,vo中與condNames的同名字段為條件值

          public static int update(Connection cnn,String tableName,RecordVO vo,String... condNames,LargeObject... larges)

          更新一條數(shù)據,只更新vo里的字段,其他字段不更新,vo中與condNames的同名字段為條件值, 支持BLOB或CLOB字段,其中l(wèi)arges[0]對應第一個字段,larges[1]對應第二個字段

          public static int updateAllField(Connection cnn,String tableName,IRecordSetVO rsvo,String... condNames)

          修改多條數(shù)據,只更新rsvo里的字段,其他字段設置為null,rsvo中與condNames的同名字段為條件值

          public static int updateAllField(Connection cnn,String tableName,RecordVO vo,RecordVO cond)

          更新一條數(shù)據,只更新vo里的字段,其他字段設置為null,vo包含要更新的值,cond為條件值

          public static int updateAllField(Connection cnn,String tableName,RecordVO vo,RecordVO cond,LargeObject... larges)

          更新一條數(shù)據,只更新vo里的字段,其他字段設置為null,vo包含要更新的值,cond為條件值, 支持BLOB或CLOB字段,其中l(wèi)arges[0]對應第一個字段,larges[1]對應第二個字段

          public static int updateAllField(Connection cnn,String tableName,RecordVO vo,String... condNames,LargeObject... larges)

          更新一條數(shù)據,只更新vo里的字段,其他字段設置為null,vo中與condNames的同名字段為條件值

          public static int updateAllField(Connection cnn,String tableName,RecordVO vo,String... condNames)

          更新一條數(shù)據,只更新vo里的字段,其他字段設置為null,vo中與condNames的同名字段為條件值, 支持BLOB或CLOB字段,其中l(wèi)arges[0]對應第一個字段,larges[1]對應第二個字段

          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得到結果,并讀取第一條數(shù)據

          public static RecordVO find(Connection cnn,String sql,OutputStream... streams)

          執(zhí)行sql得到結果,讀取第一條數(shù)據,并將BLOB和CLOB寫入到streams數(shù)據流中,streams[0]對應第一個BLOB或CLOB以次類推

          public static Long findForLong(Connection cnn,String countSql)

          查詢一個整數(shù)值,要求第一個字段必須為整數(shù),經常用于查詢數(shù)據庫數(shù)據總數(shù)

          public static MulripleVO pageQuery

          根據SQL做翻頁查詢,返回MulripleVO,其中RecordVO為統(tǒng)計信息,IRecordSetVO為數(shù)據

          public static RecordSetVO query

          執(zhí)行sql得到結果,并讀取所有數(shù)據

          public static PersistenceRecordSetVO queryPersistence

          執(zhí)行sql得到結果,并讀取所有數(shù)據,海量數(shù)據查詢方法

           

          7.6   SqlMapSupport

          SqlMapSupport將SQLMAP和SQL字段映射結合在一起,SqlMapSupport傳入的參數(shù)不在是SQL本身,而是SQLMAP的SQL-id。具體參考后面的章節(jié)

          7.7   AbstractTableDAO

          AbstractTableDAO是抽象實現(xiàn)單表增刪改查方法,只需設置表名和主鍵,無需寫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ù)據對象里的字段與tableName表名中一致的字段進行匹配,自動生成SQL并操作PreparedStatement賦值,最后執(zhí)行SQL

          2、DeleteSupport、InsertSupport、UpdateSupport、ExecuteSupport提供了setBatchCache靜態(tài)方法,該方法用于刪除、修改、更新、執(zhí)行多條SQL的批量提交SQL數(shù)量(默認為10),開發(fā)者可以根據數(shù)據庫的實際情況自己設定。

          DeleteSupport、InsertSupport、UpdateSupport的字段匹配使用了jdbc的ResultSetMetaData類,如果每次匹配都先查詢表結構會影響性能,open.real.core.RealTableMetaData本身可以緩存表結構,方法為setCacheTableMeta靜態(tài)方法(默認為不緩存)

           

          8    SQL字段映射

          依靠OpenHandX-real自動字段匹配功能不能完成的工作時,或者數(shù)據對象與表中字段名不匹配時需要使用SQL字段映射

          SQL字段映射是完成sql中宏變量與數(shù)據對象字段的對應,生成新的SQL。宏的格式為:#字段名#

          SqlAlludeExecuteSupport類提供數(shù)據維護類的方法

          SqlAlludeQuerySupport類提供數(shù)據查詢類的方法

          具體使用如下:

          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#對應到vo的f2字段,#f1#對應到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ù)據類型"/>

              …

          </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不能重復;

          3、同一個SQLMAP文件可以指定多個file(其他SQLMAP文件及路徑);

          4、其中type格式為: 數(shù)據類型1, 數(shù)據類型2, 數(shù)據類型3…,數(shù)據類型可以為數(shù)字,也可以為常量名(java.sql.Types的常量名)。如:"4,5"可以寫為"INTEGER,SMALLINT"

          9.2   SQLMAP文件使用

          使用SqlMapManager類對配置文件進行管理。

          JDBC方式如下:

          第一步:給SqlMapManager設置SQLMAP的文件的路徑,調用SqlMapManager. setRootPath方法

          第二步:調用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就可以調出相關的方法操作了

          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é)和相應的javadoc。

          使用的時候只要繼承RealTemplate或RealSqlMapTemplate類,掉父類相應的方法。

          11 常用工具類

          11.1 自動編號類

          該工具類幫助開發(fā)者創(chuàng)建一個業(yè)務編號,比如:流水號、產品編號等。自動編號類需要在數(shù)據庫創(chuàng)建一張表:

          字段名

          中文名

          說明

          TYPE

          自動編號類型

          每個自動編號的主鍵,如:流水號為1、產品號為2

          EXP

          編號表達式

          最終生成編號的模板

          CURRNUM

          當前計數(shù)器

          當前已生成第幾個號

          DES

          說明

           

          MINNUM

          最小計數(shù)器

          當前計數(shù)器的允許最小值

          MAXNUM

          最大計數(shù)器

          當前計數(shù)器的允許最大值

          STEP

          計數(shù)器步幅

          每獲取新編號 當前計數(shù)器時距上一個編號的當前計數(shù)器差距

          CURRTIME

          當前時間

          創(chuàng)建新編號時的時間

          LEN

          計數(shù)器長度

          允許計數(shù)器轉化成字符串的長度

          FILLCHAR

          填充字符

          如果LEN大于CURRNUM的長度則用該,字符在前面補齊

          AutoNumberService方法如下:

          public String getAutoNumber(Connection cnn,Integer type)

          獲取某個業(yè)務類型為type的一個編號

          public List<String> getAutoNumber(Connection cnn,Integer type,int count)

          獲取某個業(yè)務類型為type的count個編號

          public List<String> getAutoNumber(Connection cnn,Integer type,int count,RecordVO vo)

          獲取某個業(yè)務類型為type的一個編號,需要使用vo數(shù)據作為模板

          public String getAutoNumber(Connection cnn,Integer type,RecordVO vo)

          獲取某個業(yè)務類型為type的count個編號,需要使用vo數(shù)據作為模板

          例如:

           

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

          TYPE=1,EXP= "PRD{number}",LEN=10,FILLCHAR=0

          如果此時CURRNUM為23,getAutoNumbercnn,1獲取后的編碼為:PRD0000000024

           

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

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

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

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

           

          11.2 業(yè)務日志類

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

          字段名

          中文名

          說明

          LOGCODE

          日志編號

          主鍵

          LOGTIME

          日志時間

          生成業(yè)務日志時的時間

          LOGTYPE

          信息類型

          業(yè)務日志的類型

          LOGTITLE

          信息標題

          業(yè)務日志的簡述

          LOGMESSAGE

          日志信息

          業(yè)務日志的內容

          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)中不會經常變動的常量數(shù)據,例如:性別(男、女)、學歷(初中、高中、大專、本科)。象這類的數(shù)據可以統(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)

          設置當前EnumService的默認語言,默認為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)

          根據信息編號獲取信息

          public void setLanguage(int language)

          設置當前MessageService的默認語言,默認為1(取MESSAGE1字段)

          模板的定義,可以是一串字符,字符中可以包含宏,宏的格式為{字段名}。

          如:

          vo的數(shù)據為:f1="員工號"

          數(shù)據庫表中MESSAGE1="{f1}輸入不能為空!"

          通過MessageService的方法可以得到"員工號輸入不能為空!"

           

          11.5 樹型結構類

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

          11.5.1COMMON樹型結構類

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

          字段名

          中文名

          說明

          TYPE

          樹類型

          樹的類型,一個類型代表一棵樹,如:機構樹為1、產品樹為2

          BUSID

          業(yè)務ID

          對應到業(yè)務數(shù)據的主鍵,如:機構編號、產品編號

          PARENTID

          ID

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

          SORT

          順序

          同級的顯示順序

           

          11.5.2SEARCH樹型結構類

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

           

          字段名

          中文名

          說明

          TYPE

          樹類型

          樹的類型,一個類型代表一棵樹,如:機構樹為1、產品樹為2

          BUSID

          業(yè)務ID

          對應到業(yè)務數(shù)據的主鍵,如:機構編號、產品編號

          LVL

          級別

          當前數(shù)據所處的級別

          LEFTSETP

          左跨度-下級的最小

          所有下級的LEFTSETP大于等于當前的LEFTSETP

          RIGHTSETP

          右跨度-下級的最大

          所有下級的RIGHTSETP小于等于當前的RIGHTSETP

          SEARCH樹實現(xiàn)原理是通過LEFTSETP、RIGHTSETP來決定上下級,其中上級節(jié)點的LEFTSETP、RIGHTSETP包含所有子節(jié)點的LEFTSETP、RIGHTSETP。同級兄弟節(jié)點之間的LEFTSETP、RIGHTSETP不會交叉。通過此原理實現(xiàn)的樹,能很容易完成對所有子的檢索(任意深度)。同時DAO還提供SQL where子句的方法便于開發(fā)者與業(yè)務表做關聯(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子句

           

           

          樹型結構類的方法很多,具體請查看javadoc

           

          11.6 注意

          常用工具類所用到的表名都是可以由開發(fā)者自定義的。JDBC或spring的實現(xiàn)DAO類里都提供setTableName方法。通過此方法來完成。

           

           

          12     OpenHandX所有項目介紹

          項目名稱

          說明

          open-Common

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

          open-Chart

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

          open-Report

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

          open-Real

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

          open-Batch

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

          open-Unreal

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

          open-River

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

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

           

           

           

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

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

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


          網站導航:
           
          主站蜘蛛池模板: 枣强县| 沂水县| 启东市| 芷江| 松原市| 青浦区| 类乌齐县| 峨边| 雷波县| 多伦县| 莆田市| 天柱县| 曲水县| 司法| 夏河县| 富蕴县| 原平市| 百色市| 汕头市| 深圳市| 临沂市| 锡林浩特市| 石楼县| 清河县| 留坝县| 陆川县| 山阳县| 永安市| 云林县| 湟源县| 宝丰县| 静乐县| 秭归县| 隆林| 龙井市| 交城县| 郑州市| 加查县| 阿拉尔市| 房产| 扬州市|