Java Return JOOQ 查询结果
Java Return result of JOOQ query
我有一个问题。最近有人告诉我如果我与数据库交互就使用 JOOQ,所以我一直在改革我的代码以与 JOOQ 一起正常工作,但我正在努力解决这个问题,我如何 select 来自数据库的数据和 return 它。我有以下 SqlConn
class:
package com.company.database;
import org.jooq.DSLContext;
import org.jooq.Result;
import org.jooq.Record;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import java.sql.*;
import java.util.HashMap;
public class SqlConn {
private final String SERVER = "database.me:3306";
private final String DATABASE = "testdb";
private final String USERNAME = "test";
private final String PASSWORD = "test";
private final String URL = "jdbc:mysql://" + SERVER + "/" + DATABASE;
public HashMap<String, String> getMarketCoins() {
HashMap<String, String> returnValue = new HashMap<>();
try (Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD)) {
DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
Result<Record> result = create.select().from("MarketCoins").fetch();
for (Record r : result) {
returnValue.put(r.getValue("Market").toString(), r.getValue("Coin").toString());
}
}
catch (Exception e) {
e.printStackTrace();
}
return returnValue;
}
}
现在这段代码可以正常工作,但这只是一个从 1 个特定 table 收集数据的函数。我以前的代码是构建的,我可以提供一个查询,代码将执行查询和 return 结果,但是使用新的 JOOQ 方法,似乎我需要为每个不同的查询创建一个函数和 table。我看了这个关于 JOOQ 的初学者教程:https://www.youtube.com/watch?v=4H3AGK_hNMA,但在这个视频中他还为不同的数据库调用创建了多个函数。这是正确的,还是有更好的方法可以轻松地从我的数据库中获取数据,其中 table 并不重要?我的数据库中有很多 table,所以这意味着我需要编写很多函数:(
请告诉我!
按照tutorial you've linked, jOOQ is best used using the code generator中的建议。您的特定查询可以这样实现:
public Map<String, String> getMarketCoins() {
return
create().select(MARKET_COINS.MARKET, MARKET_COINS.COIN)
.from(MARKET_COINS)
.fetchMap(MARKET_COINS.MARKET, MARKET_COINS.COIN);
}
几点说明:
MARKET_COINS
是为您的 table 生成的同名 class。它包含类型安全的列信息,例如类型 Field<String>
的 MARKET_COINS.MARKET
。因此,String
类型已经可供您使用。您无需执行任何操作
- 我假设您将使用连接池(例如 hikari)并向您的 class 注入一个
DSLContext
实例(例如使用 Spring ).您仍然可以使用 DriverManager
,但通常最好使用连接池。不过这与您的 jOOQ 使用无关
- 始终在
SELECT
子句中指定明确的列列表,如果您不打算处理额外的列,则永远不要 SELECT *
。
- jOOQ 有一个有用的
ResultQuery.fetchMap()
方法,所以你不必手动循环你的结果
- jOOQ 就是 dynamic SQL。以不必重复这些模式的方式编写查询应该很简单,例如如果您经常需要从 table:
中获取键和值
public <R extends Record, K, V> Map<K, V> getKeyValue(
TableField<R, K> key, TableField<R, V> value
) {
return
create().select(key, value)
.from(key.getTable())
.fetchMap(key, value);
}
现在,将其称为例如使用:
Map<String, String> result = getKeyValue(MARKET_COINS.MARKET, MARKET_COINS.COIN);
这显然再次从 code generator 用法中获益匪浅。
我有一个问题。最近有人告诉我如果我与数据库交互就使用 JOOQ,所以我一直在改革我的代码以与 JOOQ 一起正常工作,但我正在努力解决这个问题,我如何 select 来自数据库的数据和 return 它。我有以下 SqlConn
class:
package com.company.database;
import org.jooq.DSLContext;
import org.jooq.Result;
import org.jooq.Record;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import java.sql.*;
import java.util.HashMap;
public class SqlConn {
private final String SERVER = "database.me:3306";
private final String DATABASE = "testdb";
private final String USERNAME = "test";
private final String PASSWORD = "test";
private final String URL = "jdbc:mysql://" + SERVER + "/" + DATABASE;
public HashMap<String, String> getMarketCoins() {
HashMap<String, String> returnValue = new HashMap<>();
try (Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD)) {
DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
Result<Record> result = create.select().from("MarketCoins").fetch();
for (Record r : result) {
returnValue.put(r.getValue("Market").toString(), r.getValue("Coin").toString());
}
}
catch (Exception e) {
e.printStackTrace();
}
return returnValue;
}
}
现在这段代码可以正常工作,但这只是一个从 1 个特定 table 收集数据的函数。我以前的代码是构建的,我可以提供一个查询,代码将执行查询和 return 结果,但是使用新的 JOOQ 方法,似乎我需要为每个不同的查询创建一个函数和 table。我看了这个关于 JOOQ 的初学者教程:https://www.youtube.com/watch?v=4H3AGK_hNMA,但在这个视频中他还为不同的数据库调用创建了多个函数。这是正确的,还是有更好的方法可以轻松地从我的数据库中获取数据,其中 table 并不重要?我的数据库中有很多 table,所以这意味着我需要编写很多函数:(
请告诉我!
按照tutorial you've linked, jOOQ is best used using the code generator中的建议。您的特定查询可以这样实现:
public Map<String, String> getMarketCoins() {
return
create().select(MARKET_COINS.MARKET, MARKET_COINS.COIN)
.from(MARKET_COINS)
.fetchMap(MARKET_COINS.MARKET, MARKET_COINS.COIN);
}
几点说明:
MARKET_COINS
是为您的 table 生成的同名 class。它包含类型安全的列信息,例如类型Field<String>
的MARKET_COINS.MARKET
。因此,String
类型已经可供您使用。您无需执行任何操作- 我假设您将使用连接池(例如 hikari)并向您的 class 注入一个
DSLContext
实例(例如使用 Spring ).您仍然可以使用DriverManager
,但通常最好使用连接池。不过这与您的 jOOQ 使用无关 - 始终在
SELECT
子句中指定明确的列列表,如果您不打算处理额外的列,则永远不要SELECT *
。 - jOOQ 有一个有用的
ResultQuery.fetchMap()
方法,所以你不必手动循环你的结果 - jOOQ 就是 dynamic SQL。以不必重复这些模式的方式编写查询应该很简单,例如如果您经常需要从 table: 中获取键和值
public <R extends Record, K, V> Map<K, V> getKeyValue(
TableField<R, K> key, TableField<R, V> value
) {
return
create().select(key, value)
.from(key.getTable())
.fetchMap(key, value);
}
现在,将其称为例如使用:
Map<String, String> result = getKeyValue(MARKET_COINS.MARKET, MARKET_COINS.COIN);
这显然再次从 code generator 用法中获益匪浅。