<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 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

     

    本文檔中的任何部分都不得以任何手段任何形式進(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需要:     

    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ù)實(shí)際情況持續(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ù)庫中同一個字段時需要通過字段映射強(qiáng)制指定

    常用工具類-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)

    組裝成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類對配置文件進(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,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ā)生的時間、地點(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

    顯示英文名稱,如: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)中對樹的使用也非常多,如:組織機(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

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

    open-River

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

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

     

     

     

    posted on 2011-01-12 10:05 彭明華 閱讀(2104) 評論(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)航:
     
    主站蜘蛛池模板: 亚洲AV无码专区国产乱码不卡| 51精品视频免费国产专区| 宅男666在线永久免费观看| 亚洲电影免费观看| 免费精品一区二区三区第35| 在线观看亚洲精品福利片| 三年片在线观看免费观看大全中国 | 日韩欧毛片免费视频| 亚洲精品国产成人99久久| 久久毛片免费看一区二区三区| 亚洲国产成人VA在线观看| 亚洲av日韩综合一区久热| 全免费a级毛片免费看无码| www.亚洲成在线| 美女视频黄的全免费视频网站| 97亚洲熟妇自偷自拍另类图片 | 亚洲电影免费观看| 91精品国产亚洲爽啪在线影院| 日韩免费电影网址| 久久综合九九亚洲一区| 国产一区二区免费| 亚洲国产成人久久精品动漫| 日本免费中文字幕| 久久精品国产99精品国产亚洲性色| a毛片免费在线观看| 国产亚洲精品自在久久| 在线看片免费人成视频久网下载| 亚洲真人无码永久在线| 国产性生大片免费观看性| 亚洲精品无码久久久影院相关影片| 99re8这里有精品热视频免费 | 亚洲情A成黄在线观看动漫软件 | 深夜国产福利99亚洲视频| 深夜A级毛片视频免费| 亚洲国产主播精品极品网红| 一级黄色免费网站| 亚洲一区二区三区在线观看精品中文 | **一级毛片免费完整视| 亚洲另类自拍丝袜第1页| 精品熟女少妇AV免费观看| 亚洲精品无码成人|