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

欢迎合作

 

联系方式: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         业务日志类

11.3         枚举常量类

11.4         系统信息类

11.5         树型结构类

11.5.1       COMMON树型结构类

11.5.2       SEARCH树型结构类

11.6         注意

12         OpenHandX所有项目介绍

 

 


 

1    前言

OpenHandX-real是一个小巧的JDBC轻量级封装的工具包,其最核心的特性是查询结果集、以及增、删、改、按主键查询的封装。可以直接将查询出来的结果集封装成JavaBean、编辑表数据时自动匹配字段和数据类型,这就为开发者做了最枯燥乏味、最容易出错的工作。还提供了spring的支持,由spring统一管理数据库事务。除此之外还提供一些常用应用工具类,如:树型结构类、枚举常量类、业务日志类、系统信息类、业务编号类。

1.02版本后增加了数据库的兼容性,支持SqlServer、Oracle、Sybase、MySql几个主流数据库,增加了AbstractTableDAO大大简化对单表增删改插的开发工作。真正实现零SQL零配置文件的数据库开发。

2    OpenHandX-real与主流ORM持久框架的比较

首先主流ORM是一种比较优秀的框架,随着面向对象的软件开发方法发展而产生的,通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中,ORM实际上是对象-关系映射

ORM优势:

1、隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得开发者的通用数据库交互变得简单易行,并且完全不用考虑SQL语句;

2、ORM使开发者构造固化数据结构变得简单易行。在ORM年表的史前时代,开发者需要将对象模型转化为一条一条的SQL语句,通过直连或是DB helper在关系数据库构造开发者的数据库体系。而现在,基本上所有的ORM框架都提供了通过对象模型构造关系数据库结构的功能。

ORM缺点:

1、自动化映射和关联管理,是牺牲性能代价,虽然有延迟加载技术,也存在N+1的困扰,并且延迟加载不能跨越到分布式部署的web层等问题;

2、虽然隐藏了数据层面的业务抽象,但并不能完全的屏蔽掉数据库层的设计,并且无疑将增加学习成本;

3、对于复杂查询,ORM仍然力不从心。虽然可以实现,但是不值的。

OpenHandX-real是在ORM优缺点中找一个平衡点,通过使用统一数据对象与数据库数据之间自动转换,将统一数据对象非常容易地持久化到关系数据库中。OpenHandX-real也有两大优点:

1、增、删、改、按主键查询操作的SQL本身不复杂,而且SQL性能没有什么可优化的余地,即使优化也是关系数据库本身索引和合理性。所以对于增、删、改的操作,OpenHandX-Real自动完成SQL和数据的组装并执行,开发者不用写SQL和操作PreparedStatement;

2、相反对于列表查询操作,随着信息技术的不断发展,要求越来越高,多表关联查询,翻页查询,性能优化的程度很大。因此对于查询OpenHandX-Real直接通过SQL操作,由开发者自行决定SQL或数据库的优化,因此可以他的性能完全可以做到最优。对于查询结果集的返回由OpenHandX-Real工具自动完成,组装翻页数据,将开发成本降到最低;

OpenHandX-real的目的不是取代ORM框架,而是ORM框架的补充。为那些追求良好的性能、数据库设计经验丰富的人提供有力的支持。

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          名次解释

数据对象OpenHandX-common提供的单条数据存储对象RecordVO、多条数据存储对象RecordSetVO、PersistenceRecordSetVO、复合数据存储对象MulripleVO

5          主要特性

SQL生成和数据的组装-自动生成增、删、改、按主键查询操作的SQL和数据的组装, 使数据库开发变得简单易行;

查询结果集封装和持续优化的执行效率-允许开发者自己写查询SQL,SQL的效率完全控制在开发者手里,并能根据实际情况持续优化;

结果集的数据加工功能-结果集返回是RecordSetVO对象, RecordSetVO对象本身具有排序、分组、检索、统计、不重复值等功能

海量数据的支持-集成了OpenHandX-common特有持久PersistenceRecordSetVO对象,能一次从数据库中取出所有数据(只要应用服务器硬盘的剩余空间足够大),取出这些海量数据不占当前应用服务器的内存;

JDBC支持-由开发者自己管控数据库连接、事务,充分发挥开发者的想象力,提供开发者的高自由度,剩下繁琐的工作就由OpenHandX-real完成;

支持大数据对象-开发者只要提供InputStreamOutputStream接口对象就能读取数据库的BLOBCLOB数据

SPRING支持-OpenHandX-real与Spring做了无缝的集成,由spring管理DAO和Service类、数据库连接池、数据库事务;

XMLSQLMAP支持-OpenHandX-real提供轻巧的SQL管理功能,允许开发者将SQL保存在XML配置文件中,便于统一规范和管理;

SQL字段映射-很多时候依靠OpenHandX-real自动字段匹配功能不能完成的工作时,如:数据对象多个字段对应数据库中同一个字段时需要通过字段映射强制指定

常用工具类-OpenHandX-real提供了树型结构类、常量类、业务日志类、系统信息类、业务编号类的DAO和Service的实现类,也分别提供了JDBC和spring的实现

6    学习前提

    要用好OpenHandX-real首先要学会OpenHandX-common的数据对象,这方面资料请查看《OpenHandX-Common》的数据模型章节。

 

7    JDBC支持

OpenHandX-real JDBC支持类在open.real.jdbc下,分别提供了DeleteSupport数据删除支持类、InsertSupport数据新增支持类、UpdateSupport数据更新支持类、QuerySupport数据查询支持类、任意SQL执行支持类ExecuteSupport。

7.1   DeleteSupport

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

删除符合一个条件的数据,经常用于删除单主键的数据

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

删除符合一条条件的数据,经常用于删除复合主键的数据

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

删除符合多条条件的数据,经常用于多条数据

7.2   InsertSupport

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

插入一条数据

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

插入一条数据,支持BLOB或CLOB字段,其中larges[0]对应第一个字段,larges[1]对应第二个字段

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

插入多条数据

7.3   UpdateSupport

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

修改多条数据,只更新rsvo里的字段,其他字段不更新,rsvo中与condNames的同名字段为条件值

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

更新一条数据,只更新vo里的字段,其他字段不更新,vo包含要更新的值,cond为条件值

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

更新一条数据,只更新vo里的字段,其他字段不更新,vo包含要更新的值,cond为条件值, 支持BLOB或CLOB字段,其中larges[0]对应第一个字段,larges[1]对应第二个字段

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

更新一条数据,只更新vo里的字段,其他字段不更新,vo包含要更新的值,cond为条件值

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

更新一条数据,只更新vo里的字段,其他字段不更新,vo中与condNames的同名字段为条件值

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

更新一条数据,只更新vo里的字段,其他字段不更新,vo中与condNames的同名字段为条件值, 支持BLOB或CLOB字段,其中larges[0]对应第一个字段,larges[1]对应第二个字段

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

修改多条数据,只更新rsvo里的字段,其他字段设置为null,rsvo中与condNames的同名字段为条件值

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

更新一条数据,只更新vo里的字段,其他字段设置为null,vo包含要更新的值,cond为条件值

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

更新一条数据,只更新vo里的字段,其他字段设置为null,vo包含要更新的值,cond为条件值, 支持BLOB或CLOB字段,其中larges[0]对应第一个字段,larges[1]对应第二个字段

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

更新一条数据,只更新vo里的字段,其他字段设置为null,vo中与condNames的同名字段为条件值

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

更新一条数据,只更新vo里的字段,其他字段设置为null,vo中与condNames的同名字段为条件值, 支持BLOB或CLOB字段,其中larges[0]对应第一个字段,larges[1]对应第二个字段

7.4   ExecuteSupport

public static int execute(Connection cnn,String sql)

执行一条sql

public static int execute(Connection cnn,String... sqls)

执行多条sql

7.5   QuerySupport

public static RecordVO find(Connection cnn,String sql)

执行sql得到结果,并读取第一条数据

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

执行sql得到结果,读取第一条数据,并将BLOB和CLOB写入到streams数据流中,streams[0]对应第一个BLOB或CLOB以次类推

public static Long findForLong(Connection cnn,String countSql)

查询一个整数值,要求第一个字段必须为整数,经常用于查询数据库数据总数

public static MulripleVO pageQuery

根据SQL做翻页查询,返回MulripleVO,其中RecordVO为统计信息,IRecordSetVO为数据

public static RecordSetVO query

执行sql得到结果,并读取所有数据

public static PersistenceRecordSetVO queryPersistence

执行sql得到结果,并读取所有数据,海量数据查询方法

 

7.6   SqlMapSupport

SqlMapSupport将SQLMAP和SQL字段映射结合在一起,SqlMapSupport传入的参数不在是SQL本身,而是SQLMAP的SQL-id。具体参考后面的章节

7.7   AbstractTableDAO

AbstractTableDAO是抽象实现单表增删改查方法,只需设置表名和主键,无需写SQL及繁琐的配置文件,就完成了DAO的开发大大简化了开发工作。

例如:

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将数据对象里的字段与tableName表名中一致的字段进行匹配,自动生成SQL并操作PreparedStatement赋值,最后执行SQL

2、DeleteSupport、InsertSupport、UpdateSupport、ExecuteSupport提供了setBatchCache静态方法,该方法用于删除、修改、更新、执行多条SQL的批量提交SQL数量(默认为10),开发者可以根据数据库的实际情况自己设定。

DeleteSupport、InsertSupport、UpdateSupport的字段匹配使用了jdbc的ResultSetMetaData类,如果每次匹配都先查询表结构会影响性能,open.real.core.RealTableMetaData本身可以缓存表结构,方法为setCacheTableMeta静态方法(默认为不缓存)

 

8    SQL字段映射

依靠OpenHandX-real自动字段匹配功能不能完成的工作时,或者数据对象与表中字段名不匹配时需要使用SQL字段映射

SQL字段映射是完成sql中宏变量与数据对象字段的对应,生成新的SQL。宏的格式为:#字段名#

SqlAlludeExecuteSupport类提供数据维护类的方法

SqlAlludeQuerySupport类提供数据查询类的方法

具体使用如下:

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参数可以为{ java.sql.Types.VARCHAR, java.sql.Types.VARCHAR},也可以为{1,1}

9    SQLMAP支持

允许开发者将SQL保存在XML配置文件中,便于统一规范和管理。同时支持多个XML的SQLMAP文件。

9.1   SQLMAP文件编写

SQLMAP文件格式如下:

<config nameSpace="命名空间">

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

     …

    <sql id="唯一编号" sql="sql语句" type="如果有字段映射请指定数据类型"/>

    …

</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格式为: 数据类型1, 数据类型2, 数据类型3…,数据类型可以为数字,也可以为常量名(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章节和相应的javadoc。

使用的时候只要继承RealTemplate或RealSqlMapTemplate类,掉父类相应的方法。

11 常用工具类

11.1 自动编号类

该工具类帮助开发者创建一个业务编号,比如:流水号、产品编号等。自动编号类需要在数据库创建一张表:

字段名

中文名

说明

TYPE

自动编号类型

每个自动编号的主键,如:流水号为1、产品号为2

EXP

编号表达式

最终生成编号的模板

CURRNUM

当前计数器

当前已生成第几个号

DES

说明

 

MINNUM

最小计数器

当前计数器的允许最小值

MAXNUM

最大计数器

当前计数器的允许最大值

STEP

计数器步幅

每获取新编号 当前计数器时距上一个编号的当前计数器差距

CURRTIME

当前时间

创建新编号时的时间

LEN

计数器长度

允许计数器转化成字符串的长度

FILLCHAR

填充字符

如果LEN大于CURRNUM的长度则用该,字符在前面补齐

AutoNumberService方法如下:

public String getAutoNumber(Connection cnn,Integer type)

获取某个业务类型为type的一个编号

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

获取某个业务类型为type的count个编号

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

获取某个业务类型为type的一个编号,需要使用vo数据作为模板

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

获取某个业务类型为type的count个编号,需要使用vo数据作为模板

例如:

 

在数据库里定义一个自动编号为:

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

如果此时CURRNUM为23,getAutoNumbercnn1获取后的编码为:PRD0000000024

 

在数据库里定义一个自动编号为:

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

vo的数据为prdCode="001"

如果此时CURRNUM为23,getAutoNumbercnn1,vo获取后的编码为:FB0010000024

 

11.2 业务日志类

用于记录通常业务操作发生的时间、地点、事件,必要的时候可以记录操作人

字段名

中文名

说明

LOGCODE

日志编号

主键

LOGTIME

日志时间

生成业务日志时的时间

LOGTYPE

信息类型

业务日志的类型

LOGTITLE

信息标题

业务日志的简述

LOGMESSAGE

日志信息

业务日志的内容

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 枚举常量类

枚举常量类用在系统中不会经常变动的常量数据,例如:性别(男、女)、学历(初中、高中、大专、本科)。象这类的数据可以统一管理起来,统一显示名称、统一多语言化管理

枚举类型主表

字段名

中文名

说明

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)

设置当前EnumService的默认语言,默认为1(取NAME1字段)

 

11.4 系统信息类

系统中还会有信息提示,如:错误信息提示,这些信息提示的完整和规范直接影响用户友好性。系统信息类提供统一规范的信息提示模板及多语言支持。

字段名

中文名

说明

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的数据为:f1="员工号"

数据库表中MESSAGE1="{f1}输入不能为空!"

通过MessageService的方法可以得到"员工号输入不能为空!"

 

11.5 树型结构类

系统中对树的使用也非常多,如:组织机构、产品等。树型结构类将这些结构的数据统一放在一个表中,再通过专门的实现类提供的检索方法。这样有利于代码重用,提高开发效率。实现业务数据与数据结构分离。OpenHandX-real提供两种实现方法。

11.5.1COMMON树型结构类

普通树实现,是通过PARENTID字段完成树型结构组建,这种树结构简单,插入、移动、删除一个节点相对较快,但是检索所有子、所有祖先必须递归效率非常低,节点数越多越明显。

字段名

中文名

说明

TYPE

树类型

树的类型,一个类型代表一棵树,如:机构树为1、产品树为2

BUSID

业务ID

对应到业务数据的主键,如:机构编号、产品编号

PARENTID

ID

上级业务数据主键

SORT

顺序

同级的显示顺序

 

11.5.2SEARCH树型结构类

最优树实现,数据架构增加级别、左右跨度,它所有的子节点都在它的跨度范围内。这种的的新增、移动效率非常低,但是检索所有子、所有祖先效率非常高。用于树变化量较小,查询较多的应用中。

 

字段名

中文名

说明

TYPE

树类型

树的类型,一个类型代表一棵树,如:机构树为1、产品树为2

BUSID

业务ID

对应到业务数据的主键,如:机构编号、产品编号

LVL

级别

当前数据所处的级别

LEFTSETP

左跨度-下级的最小

所有下级的LEFTSETP大于等于当前的LEFTSETP

RIGHTSETP

右跨度-下级的最大

所有下级的RIGHTSETP小于等于当前的RIGHTSETP

SEARCH树实现原理是通过LEFTSETP、RIGHTSETP来决定上下级,其中上级节点的LEFTSETP、RIGHTSETP包含所有子节点的LEFTSETP、RIGHTSETP。同级兄弟节点之间的LEFTSETP、RIGHTSETP不会交叉。通过此原理实现的树,能很容易完成对所有子的检索(任意深度)。同时DAO还提供SQL where子句的方法便于开发者与业务表做关联查询。

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 注意

常用工具类所用到的表名都是可以由开发者自定义的。JDBC或spring的实现DAO类里都提供setTableName方法。通过此方法来完成。

 

 

12     OpenHandX所有项目介绍

项目名称

说明

open-Common

公共开发包,整理了日常开发中可能经常用到的方法、工具类

open-Chart

图表工具,核心采用jfreechart,将jfreechart重新包装简化,方便使用

open-Report

多维度报表工具,支持表达式计算、汇总、分组、排序、集成图表,支持Excel输出

open-Real

持久层报表工具,封装jdbc的增、删、改、查。具有自动匹配sql条件,orm影射

open-Batch

分布式批量架构,处理复杂耗时的数据加工或ETL加工

open-Unreal

SSScript-Service)脚本服务Web开发框架,并提供WebServie功能

open-River

基于open-unrealESB产品,提供代理和点对点模式,并提供快速消息传输通道

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

 

 

 

posted on 2011-01-12 10:05 彭明华 阅读(2089) 评论(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,好久了,怎么工作流跟规则引擎方面的内容没见发布?  回复  更多评论
  
# re: OpenHandX-Real 1.0 2011-04-19 20:50 彭明华
@qiu768
谢谢你的关注,今年打算推出web框架。工作流引擎和规则引擎肯定是要发布的,现在还处于规划阶段。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: