String sql="SELECT t.id " + "FROM table AS t "
+ "INNER JOIN table1 AS t1 ON (t.id=t1.id) "
+ "WHERE ((t.id='a') AND (t1.time BETWEEN '1900' AND '2000')) "
+ "GROUP BY t.id HAVING (t.id>1) " + "ORDER BY t.id ASC "
现在用DSL语言的java实现比表示SQL
Table t = table("table").as("t");
Table t1 = table("table1").as("t1");
Field tId = t.field("id");
Field t1Id = t1.field("id");
Field t1Time = t1.field("time");
Query query = select(tId).from(t).join(inner(t1, tId.eq(t1Id))).where(
and(tId.eq("'a'"), t1Time.between("'1900'", "'2000'")))
.groupBy(tId).having(tId.gt("1")).orderBy(asc(tId));
String sql=query.toString();
这个DSL版本有几项优点。后者能够透明地适应转换到使用PreparedStatement的方法——用String拼写SQL的版本则需要大量的修改才能适应转换到使用捆绑变量的方法。如果引用不正确或者一个integer变量被传递到date column作比较的话,后者版本根本无法通过编译。代码“nvl(foo, 'X') != 'X'”是Oracle SQL中的一种特殊形式,这个句型对于非Oracle SQL程序员或不熟悉SQL的人来说很难读懂。例如在SQL Server方言中,该代码应该这样表达“(foo is null or foo != 'X')”。但通过使用更易理解、更像人类语言的“isNotNullOr(rejectedValue)”来替代这段代码的话,显然会更具阅读性,并且系统也能够受到保护,从而避免将来为了利用另一个数据库供应商的设施而不得不修改最初的代码实现。 3.现在介绍DSL-SQL
DSL-SQL是thoughtWorks的开源项目
域代码 http://code.google.com/p/sql-dsl/
附件有源代码分析