繁体   English   中英

如何将 SQL 查询的结果设置为 Java 中的变量

[英]How to set a result of an SQL query into a variable in Java

我有一个看起来像这样的查询:

SELECT db_name, verb, COUNT(*) 
FROM request 
GROUP BY db_name, verb

结果是这样的:

查询结果

我希望将结果作为List<String> result ,或者理想情况下,作为具有字段的实体的List<Request> result

String db_name;
String verb;
int count;

有没有样板可以做到这一点?

go有2种方式,概括地说:

ORM / 持久化库

有一个标准 (JPA) 和该标准的一些实现,最值得注意的是Hibernate

考虑 hibernate 的最佳方式是它不是基于 SQL。 这是一种将对象持久存储到永久存储的方法(在哪里以及如何?最好不要硬编码到您的应用程序中,具体依赖于如何),并且有自己的查询语言,与 SQL 无关,功能要弱得多,但要简单得多从 java 使用。 针对主要负载进行优化要困难得多。 但它远远更好地集成到 java 中。 你可以……拿东西,任何东西——然后把它们存起来。 稍后再查询它们。 它还为您提供数据库引擎独立性。 是的,“在幕后”,这确实使用关系数据库来使一切正常。

You can alternatively think about hibernate as an advanced tool to attempt to automagically (and that term applies here) map SQL tables to java objects and back again, adding a veneer of db independence, but this is not recommended . The learning curve of figuring out what hibernate (HQL) queries end up running which SQL and how that interacts with the particulars of your flavour of DB engine is astronomical , and you end up spending a day just trying to wrangle hibernate into building precisely the SQL查询您真正想要的性能或索引或其他原因。 这就是为什么最好不要将 hibernate 视为 SQL 抽象 - 它可以做到这一点,但它是一个非常复杂的工具。

如果您使用 hibernate,您通常应该远离以 SQL 为中心的思维。 思考对象并为它们查询。 eg using a lot of joins, selecting expressions ( SELECT YEARS(dob, signup) < 18 AS signedUpAsMinor FROM... for example), using windowing functions, SQL arrays, postgres's JSON support, etc - none of these are good ideas in hibernate .

SQL 抽象

与 hibernate 相比,有些库不会回避 SQL,因此更容易理解:如果您知道 Z9778840A0100CB30C982876741B0B5A 想要使用什么功能,只需放入窗口即可。 go 领先。

这些库很糟糕,如果你:

  • 需要数据库独立性。
  • 不熟悉 SQL 或者不喜欢写它。
  • 真的只需要存储一堆对象并稍后查询它们——没有特别的性能或大数据需求。

但如果你:

  • 知道SQL跑什么
  • 需要性能调整
  • 你喜欢在查询方面“思考”。 你宁愿只写一个查询来做你想做的事,而不是编写 java 代码,使用几个简单的查询来做你想做的事。

没有规范,但有JOOQJDBI - 两者都为您提供了简单的选项,可以将ResultSet object “编组”为一些 java POJO 的可迭代或可流式序列,并且您可以准确地指导如何将结果集转换为默认值.

原始 JDBC

在 JDBC 中编写您自己的代码。 总之,这是愚蠢的。 JDBC 对于最终用户来说是一个非常糟糕的 API - 它非常古老,主要是为了能够展示任何主要数据库引擎(或过去 25 年被认为是主要数据库引擎)的所有功能,甚至是异国情调的引擎,并让您挤出每一滴性能,因为它旨在作为最低的“胶水”层。 尝试在 JDBC 中执行基于重试(序列化事务隔离级别)的东西非常困难,即使编写简单的查询也需要比您预期的更多的代码并且难以阅读,并且绝对不支持将 POJO 编组进出用于简单案例的数据库。

作为低级胶层,JDBC做得不错。 但是作为 API 用于“最终用户”编写与 DB 交互的软件? 不好。

强烈建议不要直接在 JDBC 上执行此操作。 选择其他两个选项之一。

结束的想法

我推荐 JOOQ/JDBI 路线,但这是个人喜好。 祝项目顺利!

最简单的方法是使用 ORM(对象关系映射),如 hibernate,但在纯 java 中,您应该自己序列化和反序列化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM