你用什么编码技巧来避免编写更多的sql?

Evi*_*ach 7 sql reference

这个问题是由Kyralessa你最有用的sql技巧中提出的,以避免编写更多的sql? 我从最后一个问题中得到了很多好主意,我有兴趣看看这个问题是什么.

再一次,我没有保持这个问题的声誉.我等了7天,寻找答案,然后将其标记为维基.问题所获得的声誉,对这个问题有好处.

基本规则:

  • 虽然编写代码,将处理从SQL转移到代码来解决性能问题当然是合理的,但这确实不是问题的关键.问题不仅限于绩效问题.目标不仅仅是减少sql来完成工作.

  • 传达这个概念,以便其他用户说"哦,哇,我不知道你能做到这一点."

  • 示例代码非常有用,可以帮助主要是视觉学习者的人.

  • 明确说明您正在使用的语言,以及您正在使用的SQL方言.

  • 把自己放在读者的鞋子里.他们需要在他们面前的屏幕上看到什么,这将导致顿悟.你的答案是为了让读者受益.写给他们.

  • 非现场链接是可以的,如果它们出现在示例之后.非现场链接作为真实答案的替代品不是.

可能还有其他一些东西让读者更好,我没有想到.获得创意.分享知识.玩得开心炫耀.

[编辑] - 看起来好像有一段时间没有任何活动.5票= 50,所以有赏金,它已经被证实了.

Jos*_*rke 10

如果你想避免写SQL,可以使用ORM,例如nHibernate,或者是一个Microsoft产品Linq to SQL/Entity Framework

这甚至比使用生成器更好,因为您不需要重新运行生成器,如果您使用Fluent nHibernate,您可以通过约定启用配置,甚至不维护映射文件/类.


Mr.*_* 安宇 1

在我工作的地方,我们做了一些事情来减少 SQL 以及减少在 Java 中使用 SQL 的相关开销。(我们使用 MSSQL、MySQL 和 Oracle 运行 Java)。

最有用的技巧是使用 Java 的 setObject 方法来绑定参数。这与 Varargs 相结合,让您可以编写一个用于执行 SQL 的实用方法:

DBUtil.execSQL(Connection con, String sql, Object... params)
Run Code Online (Sandbox Code Playgroud)

只需迭代参数并使用statement.setObject(index, param[index-1])。对于空值,您可以使用 setNull()。我们使用 getResultSet 方法将这个概念扩展到查询;包装的 ResultSet 对象还会关闭其语句,从而更容易进行资源管理。

为了减少实际编写的 SQL 代码,我们有一个查询构建框架,可让您指定一堆列及其类型,然后使用它自动指定搜索条件和输出列。我们可以轻松指定连接和连接标准,这可以处理大多数正常情况。优点是大约10行代码就可以生成一个报告,包括不同的查询参数、排序、分组等。代码太复杂,这里不包含。

我还使用 Oracle 的 ALL_TABLES 和 ALL_TAB_COLUMNS 表来生成 SELECT 语句;我使用的另一个技巧是使用 ResultSetMetadata 来分析表:

ResultSet rs = DBUtil.getResultSet(con, "SELECT * FROM " + someTable);
ResultSetMetaData rsm = rs.getMetaData();

boolean first = true;
for (int i = 1; i <= rsm.getColumnCount(); i++) {
  String col = rsm.getColumnName(i).toUpperCase();
  // do something with the column name
}
Run Code Online (Sandbox Code Playgroud)

这使得生成某些类型的语句变得容易;在本例中,我们有一个活动表和一个存档表,并且我们将记录从一个表移动到另一个表。无需争论如何使用存档表,我编写的 Java 代码允许我修改这两个表,而无需修改存档脚本。

我们使用的另一个技巧是对所有表和列名称使用常量。这使得输入 SQL 变得有点乏味,但它允许我们(除其他外)轻松地为具有相似或相同结构的表生成 SQL。由于我们使用常量来定义列名,因此代码实际上强制相同的列具有相同的名称。使用常量还可以让您找到对特定列的引用,从而允许您检查可能与您正在执行的工作相关的其他 SQL 语句。这让我们可以重复使用其他模块中的 SQL,而不是盲目地再次重写相同的语句。