将SQL与JAVA代码分开

时间:2013-01-29 14:47:00

标签: java sql dao

问题

在我的一些项目中,我使用的是SQL代码,这没什么特别的。 但我正在重新思考这一战略。我搜索SO以寻找分开我的东西 代码和SQL语句。

我找到了一个我喜欢的答案,在属性文件中收集所有SQL语句。 我觉得它很干净。但是如果你想插入变量怎么办。

我发现的另一个解决方案是使用DAO对象。例如,我使用以下方法创建MYSQLFactory类:addCustomer(Customer customer),deleteCustomer(int CustomerId)等。您可以集中SQL代码。仍然 不会把它分开。

有没有更好的方法来做到这一点,而不使用像Hibernate这样的ORM。我读的越多,我就越相信用JAVA没有一种巧妙的方法。

搜索来源

Java - Storing SQL statements in an external file

Separating SQL from the Java Code

更新

感谢您的回复。我对此很好奇。 @Gilbert,我认为这是一个很好的解决方案,事实上我已经一次使用过您的解决方案,所以非常感谢。 :)

有时我只想研究某些问题的新方法。

4 个答案:

答案 0 :(得分:2)

不,没有。如果不使用ORM,则需要在代码中的某处进行直接SQL调用。如果你开始在工厂模式中混淆sql调用,那你只是做了一个糟糕的ORM。

答案 1 :(得分:2)

您没有说明您的目标是什么。我不确定您是否只是在寻找将所有SQL代码放在一个地方的技术解决方案,或者建议如何跨多种语言管理应用程序。

对于使用其他语言管理SQL代码,以下是您的朋友:

  • 存储过程
  • 浏览

以下不是你的朋友:

  • 即席查询

问题是数据库的“API”。 SQL是原始数据表的接口。但是,通常数据库是应具有自己的API的应用程序的组件。通常,该层应包含视图和存储过程。因此,例如,更新和插入(即即席查询)应该包装在存储过程中。

答案 2 :(得分:1)

我个人更喜欢在Java文件中执行SQL查询。这样可以更容易地维护代码:无需在多个文件之间切换。

也就是说,将SQL查询存储在外部文件(属性或XML或其他)中非常简单。如果需要插入变量,则无论如何都要使用预准备语句,因此SQL看起来像

select foo.* from Foo foo where foo.id = ?

唯一的困难是动态生成的SQL查询(例如,一组可选的搜索条件)。但是有些API允许在不连接查询部分的情况下生成这种SQL查询。

答案 3 :(得分:0)

关于你的问题:
没有理想的方法,有几种解决方案:
A.使用ORM - 不确定为什么你不想要它。
B.按照建议使用属性文件 - 关于参数,
您将需要处理它,考虑使用一些框架为您执行参数替换。
C.您可以在数据库中使用存储过程/视图层抽象一些SQL查询。