经过一段时间的思考以及对所开发过项目的总结,最终下了结论,主要分两部份完成,在描述之前,先说明一下需要达到的目标:
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项目,大家可以关注一下。
本文详细介绍了如何通过SQL92关键字对象化和扩展SQL92标准来实现跨数据库运行、可读性强、效率高的编程目标,并通过动态SQL语句实例展示了实现过程。以jOOQ项目为例,探讨了SQL语句的动态化及其在实际项目中的应用。

被折叠的 条评论
为什么被折叠?



