日期:2014-05-16  浏览次数:20444 次

结论:我们需不需要像存储过程一样的跨数据库过程

经过一段时间的思考以及对所开发过项目的总结,最终下了结论,主要分两部份完成,在描述之前,先说明一下需要达到的目标:

1、跨数据库:即允许在多个数据库上运行。

2、可读性强:可读性强,入门的成本低,开发人员容易接受。

3、效率高:主要分两部份,开发的效率及运行的效率,在两都之间达到平衡。

4、即时运行:以脚本化的方式运行。

?

实现的方案如下:

1、将SQL92关键字对象化。

2、扩展SQL92标准,支持如:@等关键用法。

?

用例如下:

1、关键字对象化:

UserInfo是一个用户对象:主要属性有用户代码、用户名称、性别、年龄,部门id (外键)等。

Dep是一个部门对象:含部门的相关信息。

isNullNotCondition是一个自定函数,如果部门名称为空,不做为条件。

Select(UserInfo.class,"DEP_NAME")?.from(UserInfo.class)

??????????????????????????????????????????????????????? .innerJour(Dep.class)

????????????????????????????????????????????????????????.on("UserInfo.dep_id=Dep.dep_id");

??????????????????????????????????????????????????????? .where()

????????????????????????????????????????????????????????.and("UserInfo.dep_id=:id")

????????????????????????????????????????????????????????.or(isNullNotCondition("Dep.dep_name=:name"));

?

动态SQL语句:

SQL = "select user_code,user_name,sex,age,dep_id,dep_name "+

???????????" ???????? from UserInfo"+

???????????"????????? innerJour?Dep?"+?

????????? ?"????????? on (user_info.dep_id=Dep.dep_id" +

?????????? "????????? where?userInfo.dep_id=:id"+

?????????? "??????????@isNullNotCondition(and Dep.dep_name=:name)";

封装的集合如下:

1、创建临时表

2、Insert、Update、Delete、Select语句。

3、根据数据库生成Java对象,java对象与数据库一一对应该。

附上SLQ92语法表:

?

Command:?SELECT?query

Description:?Retrieve?rows?from?a?table?or?view

???SELECT?[?ALL?|?DISTINCT?[?ON?(?expression?[,?...]?)?]?]

????????expression?[?<![AS]>?name?]?[,...]

????????[?INTO?[?TEMPORARY?|?TEMP?]?[?TABLE?]?new_table?]

????????[?FROM?{table?|?(select?query)}?[?alias?]?[,...]?]

????????[?{{LEFT?|?RIGHT}?[OUTER]?|?NATURAL?|[FULL]?OUTER}?JOIN?table?alias

????????{ON?condition?|?USING(col1,col2,...)}?]

????????[?WHERE?{condition?|?EXISTS?(correlated?subqu