java编程—sql语句应该存储在哪里?

jv4diomz  于 2021-07-05  发布在  Java
关注(0)|答案(8)|浏览(442)

关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。

7年前关门了。
改进这个问题
兼容jdbc的应用程序应该将其sql语句存储在哪里?为什么?
到目前为止,我设法确定了这些选项:
业务对象中的硬编码
嵌入在sqlj子句中
封装在单独的类中,例如数据访问对象
元数据驱动(将对象模式与数据模式分离-在元数据中描述它们之间的Map)
外部文件(如属性或资源文件)
存储过程
每种方法的“优点”和“缺点”是什么?
sql代码应该被认为是“代码”还是“元数据”?
存储过程应该只用于性能优化,还是应该是数据库结构的合法抽象?
绩效是决定的关键因素吗?供应商锁定怎么办?
什么更好?松耦合还是紧耦合?为什么?
编辑:谢谢大家的回答-以下是总结:
元数据驱动,即对象关系Map(orm)
赞成的意见:
非常抽象-db服务器可以在不改变模型的情况下进行切换
广泛传播-实际上是一个标准
减少所需的sql量
可以在资源文件中存储sql
性能(通常)可以接受
元数据驱动方法
(数据库)供应商独立性
欺骗:
隐藏sql和真正的开发人员意图
数据库管理员难以审查/更改sql
奇怪的情况下可能仍然需要sql
可以强制使用专有查询语言,例如hql
不适合优化(抽象)
可能缺乏引用完整性
替代缺乏sql知识或对db中的代码缺乏关注
从不匹配本机数据库性能(即使接近)
模型代码与数据库模型紧密耦合
硬编码/封装在dao层
赞成的意见:
sql保存在访问数据的对象中(封装)
sql易于编写(开发速度)
当需要更改时,sql很容易跟踪
简单的解决方案(没有混乱的体系结构)
欺骗:
dba不能审查/更改sql
sql很可能变得特定于db
sql很难维护
存储过程
赞成的意见:
数据库中保留的sql(接近数据)
sql由dbms进行解析、编译和优化
sql很容易被dba审查/更改
减少网络流量
提高安全性
欺骗:
sql绑定到数据库(供应商锁定)
sql代码更难维护
外部文件(如属性或资源文件)
赞成的意见
无需重建应用程序即可更改sql
将sql逻辑与应用程序业务逻辑分离
所有sql语句的中央存储库—易于维护
更容易理解
欺骗:
sql代码可能变得不可维护
更难检查sql代码的(语法)错误
嵌入在sqlj子句中
赞成的意见:
更好的语法检查
欺骗:
与java的联系过于紧密
性能低于jdbc
缺少动态查询
不太受欢迎

ubof19bj

ubof19bj1#

我不认为有人会给你一个正反两方面的问题,因为这是一个相当大的问题。所以这里是我过去用过的,将来用的。
我在dal中使用sql硬编码。在dba想使用sql之前,我一直认为这很好。然后你必须把它挖出来,格式化并把它发送给dba。谁会嘲笑它,取而代之。但是如果没有好的问号,或者问号的顺序不对,那么就让您把它放回java代码中。
我们还使用了orm,虽然这对开发人员来说很好,但我们的dba讨厌它,因为没有sql可供他们取笑。我们还使用了一个奇怪的orm(来自第三方供应商的定制orm),它有终止数据库的习惯。我从那时起就开始使用jpa了,而且非常棒,但是要让dba通过任何复杂的使用都是一场艰苦的战斗。
我们现在使用存储过程(带有硬编码的call语句)。现在每个人都会抱怨的第一件事是,你被数据库束缚住了。你是。但是,您多久更改一次数据库?我知道一个事实,我们甚至不能尝试它,大量的其他代码依赖于它,再加上重新培训我们的dba,再加上迁移数据。这将是一个非常昂贵的手术。然而,如果在你的世界里改变星盘在一滴水帽子是必要的SP很可能了。
接下来,我将使用带有代码生成工具的存储过程从oracle包创建java类。
编辑2013-01-31:几年后DBA和我们现在使用hibernate,只有在绝对需要时才使用sql(数据库中的存储过程)。我认为这是最好的解决办法。99%的时候dbs不需要担心sql,1%的时候他们已经习惯了。

beq87vna

beq87vna2#

sql代码应该被认为是“代码”还是“元数据”?
代码。
存储过程应该只用于性能优化,还是应该是数据库结构的合法抽象?
存储过程允许重用,包括在其他存储过程内部。这意味着您可以对数据库进行一次访问并让它执行支持指令—理想的通信量是最少的。orm或sproc,连接db和back的时间是无法补偿的。
orm不适合优化,因为它是抽象的。ime、orm还意味着缺乏引用完整性—使数据库难以从中报告。原本保存的复杂性,现在已经增加到能够以一种可行的方式将数据输出。
绩效是决定的关键因素吗?供应商锁定怎么办?
不,简单就是。供应商锁定也会发生在数据库中—sql是相对标准化的,但是仍然有特定于供应商的方法。

xtfmy6hx

xtfmy6hx3#

通常,应用程序在大小和/或可重用性方面增长得越多,就越需要将sql语句外部化/抽象化。
硬编码(作为静态最终常数)是第一步。下一步是存储在文件(properties/xml文件)中。元数据驱动(如hibernate/jpa这样的orm所做的)是最后一步。
硬编码的缺点是,您的代码可能会变得特定于数据库,并且每次更改都需要重写/重建/重新分发。优点是你把它放在一个地方。
存储在文件中的缺点是,当应用程序增长时,它可能变得不可维护。优点是不需要重写/重建应用程序,除非需要添加额外的dao方法。
元数据驱动的缺点是模型代码与数据库模型的耦合非常紧密。对于数据库模型中的每一个更改,您都需要重写/重建/重新分发代码。它的优点是非常抽象,您可以轻松地从db服务器切换,而无需更改模型(但现在问问自己:一家公司多久从db服务器切换一次?可能至少每三年一次,不是吗?)。
我不认为存储过程是解决这个问题的“好”解决方案。他们有完全不同的目的。尽管如此,您的代码将依赖于所使用的db/配置。

ix0qys7i

ix0qys7i4#

java世界中对供应商锁定的恐惧很有趣。
我希望你没有为oracleenterprise支付50000美元的prcpu,然后仅仅使用最小公分母来随时切换到mysql。任何一位优秀的dba都会告诉您,不同的大型数据库之间存在细微的差异,特别是在锁定模型以及它们如何实现一致性方面。
因此,不要仅仅基于与供应商无关的sql原则来决定如何实现sql调用—这样做有真正的(业务)原因。

mbyulnm0

mbyulnm05#

你问的唯一一个有明确答案的问题是“是sql代码还是元数据?”它是最明确的代码,因此应该保存在某种源代码控制中,并且有一个易于更新到最新版本的系统

mfuanj7w

mfuanj7w6#

存储过程中的sql由数据库系统进行优化,并以更快的速度进行编译——这是它的天然归宿。sql被数据库系统理解,被数据库系统解析。如果可以的话,将sql保存在数据库中;用存储过程或函数或数据库系统提供的任何逻辑单元 Package 它,并使用您或其他人提到的任何工具对其进行简单调用。
为什么要将数据库系统的sql代码存储在db之外?通常是为了发展的速度。为什么要使用ormMap有人说ormMap提供了跨不同数据库系统的兼容性;然而,在现实世界中,很少有应用程序在构建时脱离数据库平台,特别是当它开始使用诸如复制之类的高级功能时,而且在极少数情况下,确实会发生数据库系统被交换出去的情况,因此需要做一些工作。我相信orm的一个缺点是它经常代替缺乏sql知识或对数据库中的代码缺乏关注。此外,orm永远不会匹配本机数据库的性能,即使它接近。
我的立场是将sql代码保存在数据库中,并通过您希望使用的任何api或接口对其进行简单调用。通过将数据库调用放在抽象类或oo接口(用方法表示)后面,也可以抽象出进行数据库调用的时间点,因此,如果您在一种新的数据源中进行交换,它将与业务层无缝连接。

u0sqgete

u0sqgete7#

通过使用orm(比如hibernate),希望您不会担心sql语句。性能通常是可以接受的,而且您还可以获得供应商独立性。

j1dl9f46

j1dl9f468#

我不知道这是否是最佳的,但根据我的经验,它们最终会在dao层中硬编码(即字符串文本)。

相关问题