经过一段时间的思考以及对所开发过项目的总结,最终下了结论,主要分两部份完成,在描述之前,先说明一下需要达到的目标:
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 subquery)} ] [ GROUP BY column [,...] ] [ HAVING condition [,...] ] [ { UNION [ ALL ] | INTERSECT | EXCEPT | MINUS } select ] [ ORDER BY {column | int} [ ASC | DESC | USING operator ] [,...] ] [ FOR UPDATE [ OF class_name [,...] ] ] LIMIT { count | ALL } [ { OFFSET | ,} start ] |
Command: DELETE |
Description: Removes rows from a table |
DELETE FROM table [ WHERE condition ] |
<!--EndFragment-->
|
|
最近一段时间终于发现了一个项目,与本人的想法十分附合,只不够它的语法恶心的点。
jOOQ项目,大家可以关注一下。