结论:我们需不需要像存储过程一样的跨数据库过程
经过一段时间的思考以及对所开发过项目的总结,最终下了结论,主要分两部份完成,在描述之前,先说明一下需要达到的目标:
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-->
Command:?INSERT
Description:?Inserts?new?rows?into?a?table
???INSERT?INTO?table?[?(?column?[,?...]?)?]
????????{?VALUES?(?expression?[,?...]?)?|?SELECT?query?}
?
?
Command:?UPDATE
Description:?Replaces?values?of?columns?in?a?table
???UPDATE?table?SET?col?=?expression?[,...]
????????[?FROM?fromlist?]
????????[?WHERE?condition?]
?
最近一段时间终于发现了一个项目,与本人的想法十分附合,只不够它的语法恶心的点。
jOOQ项目,大家可以关注一下。