diff --git a/db/src/main/java/org/zhdev/varioutil/sql/SqlAdapter.java b/db/src/main/java/org/zhdev/varioutil/sql/SqlAdapter.java index 9de1835..09ee96a 100644 --- a/db/src/main/java/org/zhdev/varioutil/sql/SqlAdapter.java +++ b/db/src/main/java/org/zhdev/varioutil/sql/SqlAdapter.java @@ -2,7 +2,6 @@ package org.zhdev.varioutil.sql; import org.zhdev.varioutil.util.CheckedFunction; -import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -11,6 +10,10 @@ import java.util.Objects; public final class SqlAdapter implements AutoCloseable { private ConnectionProvider provider = ConnectionProvider.NOT_ESTABLISHED; + public ConnectionProvider getProvider() { + return provider; + } + public void setProvider(ConnectionProvider provider) { Objects.requireNonNull(provider, "provider"); this.provider = provider; @@ -40,6 +43,15 @@ public final class SqlAdapter implements AutoCloseable { } } + public T prepareStatement(String[] columnNames, CheckedFunction function, String query, Object... args) throws SqlException { + try (PreparedStatement statement = provider.getConnection().prepareStatement(query, columnNames)) { + applyArgs(statement, args); + return function.apply(statement); + } catch (SQLException e) { + throw new SqlException(e); + } + } + public T executeQuery(CheckedFunction function, String query, Object... args) throws SqlException { return prepareStatement(statement -> { try (ResultSet set = statement.executeQuery()) { @@ -48,7 +60,21 @@ public final class SqlAdapter implements AutoCloseable { }, query, args); } + public T executeQuery(int autoGeneratedKeys, CheckedFunction function, String query, Object... args) throws SqlException { + return prepareStatement(autoGeneratedKeys, statement -> { + try (ResultSet set = statement.executeQuery()) { + return function.apply(set); + } + }, query, args); + } + public T executeQuery(String[] columnNames, CheckedFunction function, String query, Object... args) throws SqlException { + return prepareStatement(columnNames, statement -> { + try (ResultSet set = statement.executeQuery()) { + return function.apply(set); + } + }, query, args); + } public boolean isClosed() { return provider.isClosed();