作为我的Java
程序的一部分,我需要针对(Oracle
)数据库运行大量查询。
目前,我们创建了一个混合SQL和Java,它(我知道)是一件坏事。
处理这样的事情的正确方法是什么?如果可能,请包括示例。
谢谢。
编辑:
有关该应用程序的更多信息。它是一个Web应用程序,主要从数据库中获取内容(它需要用户输入并根据数据库认为是真实的内容来绘制内容)。
我对今天如何做的最大的担忧是混合Java代码和SQL查询看起来“不合适”,就像它一样紧密耦合(查询硬编码作为源代码的一部分)
我正在寻找一种更清洁的方法来处理这种情况,这将提高手头项目的可维护性和清晰度
答案 0 :(得分:4)
对于您所描述的内容,合并对象关系映射器(ORM)或重写为存储过程可能比您想要拥抱的工作更多。两者都有非平凡的学习曲线。
相反,一个好的做法是在每个表或目的的类中合并SQL。查看table data gateway object和data access object设计模式,了解在实践中如何完成此操作。
这种方法的结果是无数的。您可以更好地重复使用,因为查询位于一个位置。当您使用方法调用替换多行JDBC和SQL时,客户端代码变得更具可读性(例如userTableDataGateway.getContentToShow(pageId)
)。最后,这将帮助您更清楚地了解ORM帮助解决的问题。
答案 1 :(得分:3)
嗯,您可以考虑的一件事是Object Relational Mapper(例如,Hibernate)。这将允许您将数据库模式映射到Java对象,这通常会清理Java代码。
但是,如果性能和速度至关重要,那么最好使用普通的JDBC驱动程序。
这当然也取决于您的应用程序试图完成的任务。例如,如果您需要基于CSV文件进行批量更新,那么我将使用纯JDBC解决方案。如果您正在设计一个Web应用程序,我肯定会使用ORM解决方案。
另外,请注意纯JDBC解决方案将涉及在Java代码中使用SQL。实际上,就此而言,在任何ORM解决方案中,您都必须拥有某种形式的SQL,无论是HQL,JPQL还是纯SQL。重点是,Java应用程序中的某些SQL没有任何问题。
编辑以回应OP的编辑
如果我从头开始编写Web应用程序,我会使用ORM。但是,由于您已经拥有一个正在运行的应用程序,因此从纯JDBC解决方案转换为ORM将非常痛苦。它会清理你的代码,但是涉及到一个重要的学习曲线,它需要相当多的设置。如果您正在使用某种类型的bean管理系统(如Spring),那么设置的一些痛苦会得到缓解,但它仍然非常重要。
这还取决于您希望将应用程序放在何处。如果您计划在相当长的一段时间内维护和添加此代码,则可能需要重构。我会不,但是,建议重新编写系统,因为你不喜欢在应用程序中使用SQL硬编码。
答案 2 :(得分:2)
根据您的更新,我同意Tim Pote编辑的内容:整合ORM的学习曲线。但是,您可以执行诸如使用预准备语句之类的操作,而不是集成ORM,而后者又存储在属性文件中。或者甚至将您的查询存储在数据库中,以便您可以对它们进行细微更新,然后可以立即读取它们而无需重新启动应用服务器。这两种策略都会破坏硬编码SQL的Java代码。
但最终,我认为你的问题没有一个明确的答案,因为你所做的事情没有任何内在错误。它只是有点不灵活,但对你的情况可能是可以接受的。
那就是说,我发布这个作为答案!
答案 3 :(得分:2)
我不确定项目的状态,但您也可以找到名为MyBatis的“备用”对象关系映射器。它具有比流行的hibernate或eclipselink更低的学习曲线,让你实际编写查询,以便你知道代码在做什么。那就是ORM是你的事。
我现在正在使用JPA(主要是因为它是当前趋势,需要学习)。 JPA是ORM的Java标准。如果您要了解目前典型的ORM操作方式,JPA可能是最好的方法。像Hibernate和Eclipselink这样的框架驱动它。根据您选择为您的JPA应用程序提供支持的框架,您可以使用专有功能,但这将很好地将您与该框架联系起来。 JPA并不难开始使用,但是当它不起作用时可能会非常神秘,因为它很大程度上混淆了与数据库的交互(请注意,它确实允许使用本机SQL查询的选项,但这种方式否定了之所以人们说JPA风格的数据库访问很好)。
是的,仍然有人在准备好的语句中使用JDBC。通常,在使用简单的旧JDBC进行编程时,您将使用的实践/模式就像一个非常非常极简的ORM ......或者真的,更接近MyBatis。再次,如果你走这条路,请使用预备语句。他们否定了一些危险。
这是一个宗教问题,所以你会听到很多改变你写这个问题的方式。事实上有人可能会为此解决你的问题。我认为唯一可以问的可能是更糟糕的是emacs或vi对于一群unix极客来说是否更好。
答案 4 :(得分:1)
你的问题似乎过于笼统,但是如果你在Oracle和Java SQL上混合使用Direct SQL,最好在Hibernate或Apache Cayenne等ORM上投入一些时间。 ORM是一种单独的设计方法,用于将数据库操作与Java端隔离开来。所有数据库交互和数据库设计都在ORM上实现,所有访问和业务逻辑都将驻留在Java中,这是一个建议。但是仍然不清楚你的实际问题。
答案 5 :(得分:1)
我对今天如何做的最大关注是混合 当耦合为时,Java代码和SQL查询看起来“不合适” 紧紧地(查询硬编码作为源代码的一部分)
你的这个假设并不是真正的“正确”,因为你的问题会有一个真实/错误的答案。这里的这个问题解释了有几种方法可以处理Java和SQL的混合:
Java Programming - Where should SQL statements be stored?
它基本上区分了SQL:
我会补充一点:
答案 6 :(得分:0)
Apache Cayenne,是最容易使用的ORM之一。它配备了Cayenne Modeller来建模数据对象并进行映射。我会向ORM的初学者推荐Cayenne。它可以通过建模器创建映射类和DB同步。