用于编译时发现不安全/错误查询的模式

时间:2008-12-16 14:53:01

标签: mysql

我的团队正在开发一个大型java应用程序,它广泛地查询MySQL数据库(在不同的类和模块中)。 我想知道是否有一种模式允许我在编译时通知如果存在引用错误表结构的查询(例如,如果我在表上删除或添加字段并且查询字符串引用it),以防止运行时错误。 这也适用于JOIN查询。

3 个答案:

答案 0 :(得分:1)

Querydsl与LiquidForm类似,支持JPA / Hibernate和基于SQL的后端。

对于基于SQL的版本,我们目前支持MySQL(5.?测试),Oracle(10g测试)和HSQLDB。

简而言之,像这样的查询

select count(*) from test where name = null

会变成

long count = query.from(test).where(test.name.isnull()).count();

Querydsl SQL使用代码生成将SQL模式反映到Java类中。

答案 1 :(得分:0)

我会说简单的答案是“不”。更完整的答案是“是的,在某种程度上”,取决于你是否愿意跳过篮球。

除非您拥有数据库模式的java表示形式,否则如果查询错误(可以生成这些类),您将永远无法获得编译时通知。此外,您必须使用这些类来构建查询,因此必须放弃您今天使用的方法(查询字符串)。为了能够使用java类来构建查询,您还必须使用技巧。 LiquidForm使用所需的技巧来构建JPA查询,但我还没有看到类似的库来构建SQL查询(LiquidForm是新的,非常精彩)。你实际上必须自己建立一个类似的库。因此,如您所见,在构造SQL时获取编译时警告很难,但并非不可能(只是几乎不可能)。但即使您应该能够创建我建议的内容,也必须在架构更改后立即更新架构的java表示,因此必须在IDE或构建工具中生成java类。

我建议您更好地进行单元测试,以便在您的查询因架构更改而变得非法时发出警告。这是实现您想要的最常用方式。此外,如果您决定“升级”到JPA,您可以使用LiquidForm来获得您想要的内容。

答案 2 :(得分:0)

有一个名为DODS(数据对象设计工作室)的开源工具可以做你想要的。 DODS工具最初是Enhydra Java应用程序服务器项目的一部分,自从2002年支持该项目的公司变成了kablooey之后,DODS已经在ObjectWeb上托管和维护。无论如何,它是开源的(LGPL)。

http://forge.objectweb.org/projects/dods

概念是您在XML文件中描述您的模式,DODS生成Java POJO类,您可以使用它们查询和操作数据库表。当然,每次更改架构时,都需要再次运行DODS以重新生成ORM类,并针对它们重新编译应用程序。

但结果是,如果表或列消失,并且您的应用程序正在查询不再存在的数据库元数据,则会出现编译时错误,因为您的代码现在正在调用不再相应的类或方法存在。