<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

     

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

     

     

     

     

     

      OpenHandX-Real 1.02

    輕量級(jí)持久工具

     

     

     

     

     

     

     

     

     

     

    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文件編寫(xiě)

    9.2       SQLMAP文件使用

    10              SPRING支持

    11              常用工具類

    11.1         自動(dòng)編號(hào)類

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

    11.3         枚舉常量類

    11.4         系統(tǒng)信息類

    11.5         樹(shù)型結(jié)構(gòu)類

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

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

    11.6         注意

    12         OpenHandX所有項(xiàng)目介紹

     

     


     

    1    前言

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

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

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

    首先主流ORM是一種比較優(yōu)秀的框架,隨著面向?qū)ο蟮?a target="_new">軟件開(kāi)發(fā)方法發(fā)展而產(chǎn)生的,通過(guò)使用描述對(duì)象和數(shù)據(jù)庫(kù)之間映射的元數(shù)據(jù),將java程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫(kù)中,ORM實(shí)際上是對(duì)象-關(guān)系映射

    ORM優(yōu)勢(shì):

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

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

    ORM缺點(diǎn):

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

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

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

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

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

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

    OpenHandX-real的目的不是取代ORM框架,而是ORM框架的補(bǔ)充。為那些追求良好的性能、數(shù)據(jù)庫(kù)設(shè)計(jì)經(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ù)對(duì)象OpenHandX-common提供的單條數(shù)據(jù)存儲(chǔ)對(duì)象RecordVO、多條數(shù)據(jù)存儲(chǔ)對(duì)象RecordSetVO、PersistenceRecordSetVO、復(fù)合數(shù)據(jù)存儲(chǔ)對(duì)象MulripleVO

    5          主要特性

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

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

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

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

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

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

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

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

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

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

    6    學(xué)習(xí)前提

        要用好OpenHandX-real首先要學(xué)會(huì)OpenHandX-common的數(shù)據(jù)對(duì)象,這方面資料請(qǐng)查看《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)

    刪除符合一個(gè)條件的數(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]對(duì)應(yīng)第一個(gè)字段,larges[1]對(duì)應(yīng)第二個(gè)字段

    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]對(duì)應(yīng)第一個(gè)字段,larges[1]對(duì)應(yīng)第二個(gè)字段

    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]對(duì)應(yīng)第一個(gè)字段,larges[1]對(duì)應(yīng)第二個(gè)字段

    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]對(duì)應(yīng)第一個(gè)字段,larges[1]對(duì)應(yīng)第二個(gè)字段

    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]對(duì)應(yīng)第一個(gè)字段,larges[1]對(duì)應(yīng)第二個(gè)字段

    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寫(xiě)入到streams數(shù)據(jù)流中,streams[0]對(duì)應(yīng)第一個(gè)BLOB或CLOB以次類推

    public static Long findForLong(Connection cnn,String countSql)

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

    public static MulripleVO pageQuery

    根據(jù)SQL做翻頁(yè)查詢,返回MulripleVO,其中RecordVO為統(tǒng)計(jì)信息,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è)置表名和主鍵,無(wú)需寫(xiě)SQL及繁瑣的配置文件,就完成了DAO的開(kāi)發(fā)大大簡(jiǎn)化了開(kāi)發(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ù)對(duì)象里的字段與tableName表名中一致的字段進(jìn)行匹配,自動(dòng)生成SQL并操作PreparedStatement賦值,最后執(zhí)行SQL

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

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

     

    8    SQL字段映射

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

    SQL字段映射是完成sql中宏變量與數(shù)據(jù)對(duì)象字段的對(duì)應(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#對(duì)應(yīng)到vo的f2字段,#f1#對(duì)應(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支持

    允許開(kāi)發(fā)者將SQL保存在XML配置文件中,便于統(tǒng)一規(guī)范和管理。同時(shí)支持多個(gè)XML的SQLMAP文件。

    9.1   SQLMAP文件編寫(xiě)

    SQLMAP文件格式如下:

    <config nameSpace="命名空間">

        <file name="其他SQLMAP文件及路徑"/>

         …

        <sql id="唯一編號(hào)" sql="sql語(yǔ)句" type="如果有字段映射請(qǐng)指定數(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、同一個(gè)命名空間下sql id不能重復(fù);

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

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

    9.2   SQLMAP文件使用

    使用SqlMapManager類對(duì)配置文件進(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語(yǔ)句使用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支持類。用法很簡(jiǎn)單大家查考前面的6.1-6.3章節(jié)和相應(yīng)的javadoc。

    使用的時(shí)候只要繼承RealTemplate或RealSqlMapTemplate類,掉父類相應(yīng)的方法。

    11 常用工具類

    11.1 自動(dòng)編號(hào)類

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

    字段名

    中文名

    說(shuō)明

    TYPE

    自動(dòng)編號(hào)類型

    每個(gè)自動(dòng)編號(hào)的主鍵,如:流水號(hào)為1、產(chǎn)品號(hào)為2

    EXP

    編號(hào)表達(dá)式

    最終生成編號(hào)的模板

    CURRNUM

    當(dāng)前計(jì)數(shù)器

    當(dāng)前已生成第幾個(gè)號(hào)

    DES

    說(shuō)明

     

    MINNUM

    最小計(jì)數(shù)器

    當(dāng)前計(jì)數(shù)器的允許最小值

    MAXNUM

    最大計(jì)數(shù)器

    當(dāng)前計(jì)數(shù)器的允許最大值

    STEP

    計(jì)數(shù)器步幅

    每獲取新編號(hào) 當(dāng)前計(jì)數(shù)器時(shí)距上一個(gè)編號(hào)的當(dāng)前計(jì)數(shù)器差距

    CURRTIME

    當(dāng)前時(shí)間

    創(chuàng)建新編號(hào)時(shí)的時(shí)間

    LEN

    計(jì)數(shù)器長(zhǎng)度

    允許計(jì)數(shù)器轉(zhuǎn)化成字符串的長(zhǎng)度

    FILLCHAR

    填充字符

    如果LEN大于CURRNUM的長(zhǎng)度則用該,字符在前面補(bǔ)齊

    AutoNumberService方法如下:

    public String getAutoNumber(Connection cnn,Integer type)

    獲取某個(gè)業(yè)務(wù)類型為type的一個(gè)編號(hào)

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

    獲取某個(gè)業(yè)務(wù)類型為type的count個(gè)編號(hào)

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

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

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

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

    例如:

     

    在數(shù)據(jù)庫(kù)里定義一個(gè)自動(dòng)編號(hào)為:

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

    如果此時(shí)CURRNUM為23,getAutoNumbercnn1獲取后的編碼為:PRD0000000024

     

    在數(shù)據(jù)庫(kù)里定義一個(gè)自動(dòng)編號(hào)為:

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

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

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

     

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

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

    字段名

    中文名

    說(shuō)明

    LOGCODE

    日志編號(hào)

    主鍵

    LOGTIME

    日志時(shí)間

    生成業(yè)務(wù)日志時(shí)的時(shí)間

    LOGTYPE

    信息類型

    業(yè)務(wù)日志的類型

    LOGTITLE

    信息標(biāo)題

    業(yè)務(wù)日志的簡(jiǎn)述

    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)中不會(huì)經(jīng)常變動(dòng)的常量數(shù)據(jù),例如:性別(男、女)、學(xué)歷(初中、高中、大專、本科)。象這類的數(shù)據(jù)可以統(tǒng)一管理起來(lái),統(tǒng)一顯示名稱、統(tǒng)一多語(yǔ)言化管理

    枚舉類型主表

    字段名

    中文名

    說(shuō)明

    TYPECODE

    類型編號(hào)

    主鍵

    NAME

    名稱

    簡(jiǎn)稱,如:性別

    DES

    說(shuō)明

    說(shuō)明該枚舉的作用

    枚舉值表

    字段名

    中文名

    說(shuō)明

    TYPECODE

    類型編號(hào)

    主鍵

    VALUE

    枚舉的值,如:男為1、女為2

    NAME1

    名稱1

    顯示的中文名稱,如:男、女

    NAME2

    名稱2

    顯示英文名稱,如:malefemale

    NAME3

    名稱3

    其他語(yǔ)言的名稱

    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)語(yǔ)言,默認(rèn)為1(取NAME1字段)

     

    11.4 系統(tǒng)信息類

    系統(tǒng)中還會(huì)有信息提示,如:錯(cuò)誤信息提示,這些信息提示的完整和規(guī)范直接影響用戶友好性。系統(tǒng)信息類提供統(tǒng)一規(guī)范的信息提示模板及多語(yǔ)言支持。

    字段名

    中文名

    說(shuō)明

    CODE

    編號(hào)

    主鍵

    TYPE

    類型

    信息類型

    MESSAGE1

    信息1

    中文信息模板

    MESSAGE2

    信息2

    英文信息模板

    MESSAGE3

    信息3

    其他語(yǔ)言信息模板

    MESSAGE4

    信息4

    。。。

    MESSAGE15

    信息5

    。。。

     

    MessageService方法如下:

    public String getMessageText(Connection cnn,String code,RecordVO vo)

    根據(jù)信息編號(hào)獲取信息

    public void setLanguage(int language)

    設(shè)置當(dāng)前MessageService的默認(rèn)語(yǔ)言,默認(rèn)為1(取MESSAGE1字段)

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

    如:

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

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

    通過(guò)MessageService的方法可以得到"員工號(hào)輸入不能為空!"

     

    11.5 樹(shù)型結(jié)構(gòu)類

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

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

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

    字段名

    中文名

    說(shuō)明

    TYPE

    樹(shù)類型

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

    BUSID

    業(yè)務(wù)ID

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

    PARENTID

    ID

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

    SORT

    順序

    同級(jí)的顯示順序

     

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

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

     

    字段名

    中文名

    說(shuō)明

    TYPE

    樹(shù)類型

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

    BUSID

    業(yè)務(wù)ID

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

    LVL

    級(jí)別

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

    LEFTSETP

    左跨度-下級(jí)的最小

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

    RIGHTSETP

    右跨度-下級(jí)的最大

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

    SEARCH樹(shù)實(shí)現(xiàn)原理是通過(guò)LEFTSETP、RIGHTSETP來(lái)決定上下級(jí),其中上級(jí)節(jié)點(diǎn)的LEFTSETP、RIGHTSETP包含所有子節(jié)點(diǎn)的LEFTSETP、RIGHTSETP。同級(jí)兄弟節(jié)點(diǎn)之間的LEFTSETP、RIGHTSETP不會(huì)交叉。通過(guò)此原理實(shí)現(xiàn)的樹(shù),能很容易完成對(duì)所有子的檢索(任意深度)。同時(shí)DAO還提供SQL where子句的方法便于開(kāi)發(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下一級(jí)子的SQL where子句

    public String getBorthersWhere(Connection cnn,String table,int type,String busId)

    查詢busId同級(jí)兄弟的SQL where子句

    public String getParentWhere(Connection cnn,String table,int type,String busId)

    查詢busId上級(jí)父的SQL where子句  

    public String getAncestorsWhere(Connection cnn,String table,int type,String busId)

    查詢busId上級(jí)所有祖先的SQL where子句

     

     

    樹(shù)型結(jié)構(gòu)類的方法很多,具體請(qǐng)查看javadoc

     

    11.6 注意

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

     

     

    12     OpenHandX所有項(xiàng)目介紹

    項(xiàng)目名稱

    說(shuō)明

    open-Common

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

    open-Chart

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

    open-Report

    多維度報(bào)表工具,支持表達(dá)式計(jì)算、匯總、分組、排序、集成圖表,支持Excel輸出

    open-Real

    持久層報(bào)表工具,封裝jdbc的增、刪、改、查。具有自動(dòng)匹配sql條件,orm影射

    open-Batch

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

    open-Unreal

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

    open-River

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

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

     

     

     

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

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 无码国产亚洲日韩国精品视频一区二区三区| 成人免费网站久久久| 亚洲视频一区在线| 久久亚洲国产伦理| 夜夜亚洲天天久久| 亚洲第一香蕉视频| 亚洲人成网站在线观看播放动漫 | 中国亚洲女人69内射少妇| www.亚洲精品| 国产亚洲精久久久久久无码AV| 亚洲人成影院在线观看| 久久久久亚洲AV成人网人人软件| 国产精品亚洲综合专区片高清久久久| 久久久久亚洲AV无码专区桃色| 国产亚洲一区二区在线观看| 亚洲国产精品无码一线岛国| 亚洲福利在线视频| 亚洲制服丝袜在线播放| 国产亚洲福利在线视频| 色噜噜的亚洲男人的天堂| 一级做a爰片久久毛片免费看| 成人免费777777被爆出| 一个人免费视频观看在线www| 在线观看免费中文视频| 日韩精品成人无码专区免费| 国内一级一级毛片a免费| 亚洲毛片av日韩av无码| 亚洲AV永久纯肉无码精品动漫| 亚洲黄网在线观看| 亚洲日本中文字幕天天更新| 曰批免费视频播放免费| 男人进去女人爽免费视频国产| 中文毛片无遮挡高潮免费| 四虎永久精品免费观看| 久久精品亚洲综合一品| 亚洲av成人一区二区三区| 精品在线免费视频| 日本在线免费观看| 免费羞羞视频网站| 亚洲中文字幕在线第六区| 亚洲成a人片在线观看中文app|