You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2022/07/09 22:34:14 UTC

[commons-dbcp] branch master updated: Internal refactoring

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-dbcp.git


The following commit(s) were added to refs/heads/master by this push:
     new 51d30a80 Internal refactoring
51d30a80 is described below

commit 51d30a80b5ecca70534d89b480770535d13bf16f
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sat Jul 9 18:34:08 2022 -0400

    Internal refactoring
---
 .../java/org/apache/commons/dbcp2/PStmtKey.java    | 477 ++++++++-------------
 1 file changed, 179 insertions(+), 298 deletions(-)

diff --git a/src/main/java/org/apache/commons/dbcp2/PStmtKey.java b/src/main/java/org/apache/commons/dbcp2/PStmtKey.java
index 65858fc4..f2f39f04 100644
--- a/src/main/java/org/apache/commons/dbcp2/PStmtKey.java
+++ b/src/main/java/org/apache/commons/dbcp2/PStmtKey.java
@@ -21,6 +21,7 @@ import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Arrays;
 import java.util.Objects;
+import java.util.function.Supplier;
 
 import org.apache.commons.dbcp2.PoolingConnection.StatementType;
 
@@ -128,14 +129,30 @@ public class PStmtKey {
         Statement createStatement(Connection connection) throws SQLException;
     }
 
+    private static StatementBuilder toStatementBuilder(final StatementType statementType, final Supplier<StatementBuilder> prep,
+        final Supplier<StatementBuilder> call) {
+        if (statementType != null) {
+            switch (statementType) {
+            case PREPARED_STATEMENT:
+                return prep.get();
+            case CALLABLE_STATEMENT:
+                return call.get();
+            default:
+                // TODO Throw?
+                return null;
+            }
+        }
+        return null;
+    }
+
     /**
      * SQL defining Prepared or Callable Statement
      */
     private final String sql;
 
     /**
-     * Result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY}, {@code ResultSet.TYPE_SCROLL_INSENSITIVE},
-     * or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
+     * Result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY}, {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or
+     * {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
      */
     private final Integer resultSetType;
 
@@ -146,8 +163,8 @@ public class PStmtKey {
     private final Integer resultSetConcurrency;
 
     /**
-     * Result set holdability. One of the following {@code ResultSet} constants:
-     * {@code ResultSet.HOLD_CURSORS_OVER_COMMIT} or {@code ResultSet.CLOSE_CURSORS_AT_COMMIT}.
+     * Result set holdability. One of the following {@code ResultSet} constants: {@code ResultSet.HOLD_CURSORS_OVER_COMMIT}
+     * or {@code ResultSet.CLOSE_CURSORS_AT_COMMIT}.
      */
     private final Integer resultSetHoldability;
 
@@ -158,8 +175,8 @@ public class PStmtKey {
     private final String schema;
 
     /**
-     * A flag indicating whether auto-generated keys should be returned; one of
-     * {@code Statement.RETURN_GENERATED_KEYS} or {@code Statement.NO_GENERATED_KEYS}.
+     * A flag indicating whether auto-generated keys should be returned; one of {@code Statement.RETURN_GENERATED_KEYS} or
+     * {@code Statement.NO_GENERATED_KEYS}.
      */
     private final Integer autoGeneratedKeys;
 
@@ -173,19 +190,20 @@ public class PStmtKey {
      */
     private final String[] columnNames;
 
+    /** 
+     * Statement builder.
+     */
+    private final transient StatementBuilder statementBuilder;
+
     /**
      * Statement type, prepared or callable.
      */
     private final StatementType statementType;
 
-    /** Statement builder */
-    private transient StatementBuilder builder;
-
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
+     * @param sql The SQL statement.
      * @deprecated Use {@link #PStmtKey(String, String, String)}.
      */
     @Deprecated
@@ -196,14 +214,11 @@ public class PStmtKey {
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param resultSetType
-     *            A result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
-     *            {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
-     * @param resultSetConcurrency
-     *            A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
-     *            {@code ResultSet.CONCUR_UPDATABLE}.
+     * @param sql The SQL statement.
+     * @param resultSetType A result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
+     *        {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
+     * @param resultSetConcurrency A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
+     *        {@code ResultSet.CONCUR_UPDATABLE}.
      * @deprecated Use {@link #PStmtKey(String, String, String, int, int)}.
      */
     @Deprecated
@@ -214,10 +229,8 @@ public class PStmtKey {
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
      * @deprecated Use {@link #PStmtKey(String, String, String)}.
      */
     @Deprecated
@@ -228,13 +241,10 @@ public class PStmtKey {
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param autoGeneratedKeys
-     *            A flag indicating whether auto-generated keys should be returned; one of
-     *            {@code Statement.RETURN_GENERATED_KEYS} or {@code Statement.NO_GENERATED_KEYS}.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param autoGeneratedKeys A flag indicating whether auto-generated keys should be returned; one of
+     *        {@code Statement.RETURN_GENERATED_KEYS} or {@code Statement.NO_GENERATED_KEYS}.
      * @deprecated Use {@link #PStmtKey(String, String, String, int)}.
      */
     @Deprecated
@@ -245,16 +255,12 @@ public class PStmtKey {
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param resultSetType
-     *            A result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
-     *            {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
-     * @param resultSetConcurrency
-     *            A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
-     *            {@code ResultSet.CONCUR_UPDATABLE}.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param resultSetType A result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
+     *        {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
+     * @param resultSetConcurrency A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
+     *        {@code ResultSet.CONCUR_UPDATABLE}.
      * @deprecated Use @link {@link #PStmtKey(String, String, String, int, int)}.
      */
     @Deprecated
@@ -265,50 +271,38 @@ public class PStmtKey {
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param resultSetType
-     *            a result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
-     *            {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
-     * @param resultSetConcurrency
-     *            A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
-     *            {@code ResultSet.CONCUR_UPDATABLE}
-     * @param resultSetHoldability
-     *            One of the following {@code ResultSet} constants: {@code ResultSet.HOLD_CURSORS_OVER_COMMIT}
-     *            or {@code ResultSet.CLOSE_CURSORS_AT_COMMIT}.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param resultSetType a result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
+     *        {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
+     * @param resultSetConcurrency A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
+     *        {@code ResultSet.CONCUR_UPDATABLE}
+     * @param resultSetHoldability One of the following {@code ResultSet} constants:
+     *        {@code ResultSet.HOLD_CURSORS_OVER_COMMIT} or {@code ResultSet.CLOSE_CURSORS_AT_COMMIT}.
      * @deprecated Use {@link #PStmtKey(String, String, String, int, int, int)}.
      */
     @Deprecated
-    public PStmtKey(final String sql, final String catalog, final int resultSetType, final int resultSetConcurrency,
-            final int resultSetHoldability) {
+    public PStmtKey(final String sql, final String catalog, final int resultSetType, final int resultSetConcurrency, final int resultSetHoldability) {
         this(sql, catalog, resultSetType, resultSetConcurrency, resultSetHoldability, StatementType.PREPARED_STATEMENT);
     }
 
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param resultSetType
-     *            a result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
-     *            {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}
-     * @param resultSetConcurrency
-     *            A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
-     *            {@code ResultSet.CONCUR_UPDATABLE}.
-     * @param resultSetHoldability
-     *            One of the following {@code ResultSet} constants: {@code ResultSet.HOLD_CURSORS_OVER_COMMIT}
-     *            or {@code ResultSet.CLOSE_CURSORS_AT_COMMIT}.
-     * @param statementType
-     *            The SQL statement type, prepared or callable.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param resultSetType a result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
+     *        {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}
+     * @param resultSetConcurrency A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
+     *        {@code ResultSet.CONCUR_UPDATABLE}.
+     * @param resultSetHoldability One of the following {@code ResultSet} constants:
+     *        {@code ResultSet.HOLD_CURSORS_OVER_COMMIT} or {@code ResultSet.CLOSE_CURSORS_AT_COMMIT}.
+     * @param statementType The SQL statement type, prepared or callable.
      * @deprecated Use {@link #PStmtKey(String, String, String, int, int, int, PoolingConnection.StatementType)}
      */
     @Deprecated
-    public PStmtKey(final String sql, final String catalog, final int resultSetType, final int resultSetConcurrency,
-            final int resultSetHoldability, final StatementType statementType) {
+    public PStmtKey(final String sql, final String catalog, final int resultSetType, final int resultSetConcurrency, final int resultSetHoldability,
+        final StatementType statementType) {
         this.sql = sql;
         this.catalog = catalog;
         this.schema = null;
@@ -319,34 +313,23 @@ public class PStmtKey {
         this.autoGeneratedKeys = null;
         this.columnIndexes = null;
         this.columnNames = null;
-        // create builder
-        if (statementType == StatementType.PREPARED_STATEMENT) {
-            this.builder = new PreparedStatementWithResultSetHoldability();
-        } else if (statementType == StatementType.CALLABLE_STATEMENT) {
-            this.builder = new PreparedCallWithResultSetHoldability();
-        }
+        this.statementBuilder = toStatementBuilder(statementType, PreparedStatementWithResultSetHoldability::new, PreparedCallWithResultSetHoldability::new);
     }
 
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param resultSetType
-     *            A result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
-     *            {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
-     * @param resultSetConcurrency
-     *            A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
-     *            {@code ResultSet.CONCUR_UPDATABLE}.
-     * @param statementType
-     *            The SQL statement type, prepared or callable.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param resultSetType A result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
+     *        {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
+     * @param resultSetConcurrency A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
+     *        {@code ResultSet.CONCUR_UPDATABLE}.
+     * @param statementType The SQL statement type, prepared or callable.
      * @deprecated Use {@link #PStmtKey(String, String, String, int, int, PoolingConnection.StatementType)}.
      */
     @Deprecated
-    public PStmtKey(final String sql, final String catalog, final int resultSetType, final int resultSetConcurrency,
-            final StatementType statementType) {
+    public PStmtKey(final String sql, final String catalog, final int resultSetType, final int resultSetConcurrency, final StatementType statementType) {
         this.sql = sql;
         this.catalog = catalog;
         this.schema = null;
@@ -357,24 +340,16 @@ public class PStmtKey {
         this.autoGeneratedKeys = null;
         this.columnIndexes = null;
         this.columnNames = null;
-        // create builder
-        if (statementType == StatementType.PREPARED_STATEMENT) {
-            this.builder = new PreparedStatementWithResultSetConcurrency();
-        } else if (statementType == StatementType.CALLABLE_STATEMENT) {
-            this.builder = new PreparedCallWithResultSetConcurrency();
-        }
+        this.statementBuilder = toStatementBuilder(statementType, PreparedStatementWithResultSetConcurrency::new, PreparedCallWithResultSetConcurrency::new);
     }
 
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param columnIndexes
-     *            An array of column indexes indicating the columns that should be returned from the inserted row or
-     *            rows.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param columnIndexes An array of column indexes indicating the columns that should be returned from the inserted row
+     *        or rows.
      * @deprecated Use {@link #PStmtKey(String, String, String, int[])}.
      */
     @Deprecated
@@ -389,19 +364,15 @@ public class PStmtKey {
         this.resultSetType = null;
         this.resultSetConcurrency = null;
         this.resultSetHoldability = null;
-        // create builder
-        this.builder = new PreparedStatementWithColumnIndexes();
+        this.statementBuilder = new PreparedStatementWithColumnIndexes();
     }
 
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param statementType
-     *            The SQL statement type, prepared or callable.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param statementType The SQL statement type, prepared or callable.
      * @deprecated Use {@link #PStmtKey(String, String, String, PoolingConnection.StatementType)}.
      */
     @Deprecated
@@ -416,31 +387,21 @@ public class PStmtKey {
         this.resultSetType = null;
         this.resultSetConcurrency = null;
         this.resultSetHoldability = null;
-        // create builder
-        if (statementType == StatementType.PREPARED_STATEMENT) {
-            this.builder = new PreparedStatementSQL();
-        } else if (statementType == StatementType.CALLABLE_STATEMENT) {
-            this.builder = new PreparedCallSQL();
-        }
+        this.statementBuilder = toStatementBuilder(statementType, PreparedStatementSQL::new, PreparedCallSQL::new);
     }
 
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param statementType
-     *            The SQL statement type, prepared or callable.
-     * @param autoGeneratedKeys
-     *            A flag indicating whether auto-generated keys should be returned; one of
-     *            {@code Statement.RETURN_GENERATED_KEYS} or {@code Statement.NO_GENERATED_KEYS}.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param statementType The SQL statement type, prepared or callable.
+     * @param autoGeneratedKeys A flag indicating whether auto-generated keys should be returned; one of
+     *        {@code Statement.RETURN_GENERATED_KEYS} or {@code Statement.NO_GENERATED_KEYS}.
      * @deprecated Use {@link #PStmtKey(String, String, String, PoolingConnection.StatementType, Integer)}
      */
     @Deprecated
-    public PStmtKey(final String sql, final String catalog, final StatementType statementType,
-            final Integer autoGeneratedKeys) {
+    public PStmtKey(final String sql, final String catalog, final StatementType statementType, final Integer autoGeneratedKeys) {
         this.sql = sql;
         this.catalog = catalog;
         this.schema = null;
@@ -451,23 +412,15 @@ public class PStmtKey {
         this.resultSetType = null;
         this.resultSetConcurrency = null;
         this.resultSetHoldability = null;
-        // create builder
-        if (statementType == StatementType.PREPARED_STATEMENT) {
-            this.builder = new PreparedStatementWithAutoGeneratedKeys();
-        } else if (statementType == StatementType.CALLABLE_STATEMENT) {
-            this.builder = new PreparedCallSQL();
-        }
+        this.statementBuilder = toStatementBuilder(statementType, PreparedStatementWithAutoGeneratedKeys::new, PreparedCallSQL::new);
     }
 
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param schema
-     *            The schema
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param schema The schema
      * @since 2.5.0
      */
     public PStmtKey(final String sql, final String catalog, final String schema) {
@@ -477,15 +430,11 @@ public class PStmtKey {
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param schema
-     *            The schema
-     * @param autoGeneratedKeys
-     *            A flag indicating whether auto-generated keys should be returned; one of
-     *            {@code Statement.RETURN_GENERATED_KEYS} or {@code Statement.NO_GENERATED_KEYS}.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param schema The schema
+     * @param autoGeneratedKeys A flag indicating whether auto-generated keys should be returned; one of
+     *        {@code Statement.RETURN_GENERATED_KEYS} or {@code Statement.NO_GENERATED_KEYS}.
      * @since 2.5.0
      */
     public PStmtKey(final String sql, final String catalog, final String schema, final int autoGeneratedKeys) {
@@ -495,18 +444,13 @@ public class PStmtKey {
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param schema
-     *            The schema
-     * @param resultSetType
-     *            A result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
-     *            {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
-     * @param resultSetConcurrency
-     *            A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
-     *            {@code ResultSet.CONCUR_UPDATABLE}.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param schema The schema
+     * @param resultSetType A result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
+     *        {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
+     * @param resultSetConcurrency A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
+     *        {@code ResultSet.CONCUR_UPDATABLE}.
      */
     public PStmtKey(final String sql, final String catalog, final String schema, final int resultSetType, final int resultSetConcurrency) {
         this(sql, catalog, schema, resultSetType, resultSetConcurrency, StatementType.PREPARED_STATEMENT);
@@ -515,52 +459,39 @@ public class PStmtKey {
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param schema
-     *            The schema
-     * @param resultSetType
-     *            a result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
-     *            {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
-     * @param resultSetConcurrency
-     *            A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
-     *            {@code ResultSet.CONCUR_UPDATABLE}
-     * @param resultSetHoldability
-     *            One of the following {@code ResultSet} constants: {@code ResultSet.HOLD_CURSORS_OVER_COMMIT}
-     *            or {@code ResultSet.CLOSE_CURSORS_AT_COMMIT}.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param schema The schema
+     * @param resultSetType a result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
+     *        {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
+     * @param resultSetConcurrency A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
+     *        {@code ResultSet.CONCUR_UPDATABLE}
+     * @param resultSetHoldability One of the following {@code ResultSet} constants:
+     *        {@code ResultSet.HOLD_CURSORS_OVER_COMMIT} or {@code ResultSet.CLOSE_CURSORS_AT_COMMIT}.
      * @since 2.5.0
      */
     public PStmtKey(final String sql, final String catalog, final String schema, final int resultSetType, final int resultSetConcurrency,
-            final int resultSetHoldability) {
+        final int resultSetHoldability) {
         this(sql, catalog, schema, resultSetType, resultSetConcurrency, resultSetHoldability, StatementType.PREPARED_STATEMENT);
     }
 
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param schema
-     *            The schema.
-     * @param resultSetType
-     *            a result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
-     *            {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}
-     * @param resultSetConcurrency
-     *            A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
-     *            {@code ResultSet.CONCUR_UPDATABLE}.
-     * @param resultSetHoldability
-     *            One of the following {@code ResultSet} constants: {@code ResultSet.HOLD_CURSORS_OVER_COMMIT}
-     *            or {@code ResultSet.CLOSE_CURSORS_AT_COMMIT}.
-     * @param statementType
-     *            The SQL statement type, prepared or callable.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param schema The schema.
+     * @param resultSetType a result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
+     *        {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}
+     * @param resultSetConcurrency A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
+     *        {@code ResultSet.CONCUR_UPDATABLE}.
+     * @param resultSetHoldability One of the following {@code ResultSet} constants:
+     *        {@code ResultSet.HOLD_CURSORS_OVER_COMMIT} or {@code ResultSet.CLOSE_CURSORS_AT_COMMIT}.
+     * @param statementType The SQL statement type, prepared or callable.
      * @since 2.5.0
      */
     public PStmtKey(final String sql, final String catalog, final String schema, final int resultSetType, final int resultSetConcurrency,
-            final int resultSetHoldability, final StatementType statementType) {
+        final int resultSetHoldability, final StatementType statementType) {
         this.sql = sql;
         this.catalog = catalog;
         this.schema = schema;
@@ -571,35 +502,24 @@ public class PStmtKey {
         this.autoGeneratedKeys = null;
         this.columnIndexes = null;
         this.columnNames = null;
-        // create builder
-        if (statementType == StatementType.PREPARED_STATEMENT) {
-            this.builder = new PreparedStatementWithResultSetHoldability();
-        } else if (statementType == StatementType.CALLABLE_STATEMENT) {
-            this.builder = new PreparedCallWithResultSetHoldability();
-        }
+        this.statementBuilder = toStatementBuilder(statementType, PreparedStatementWithResultSetHoldability::new, PreparedCallWithResultSetHoldability::new);
     }
 
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param schema
-     *            The schema.
-     * @param resultSetType
-     *            A result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
-     *            {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
-     * @param resultSetConcurrency
-     *            A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
-     *            {@code ResultSet.CONCUR_UPDATABLE}.
-     * @param statementType
-     *            The SQL statement type, prepared or callable.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param schema The schema.
+     * @param resultSetType A result set type; one of {@code ResultSet.TYPE_FORWARD_ONLY},
+     *        {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
+     * @param resultSetConcurrency A concurrency type; one of {@code ResultSet.CONCUR_READ_ONLY} or
+     *        {@code ResultSet.CONCUR_UPDATABLE}.
+     * @param statementType The SQL statement type, prepared or callable.
      * @since 2.5.0
      */
     public PStmtKey(final String sql, final String catalog, final String schema, final int resultSetType, final int resultSetConcurrency,
-            final StatementType statementType) {
+        final StatementType statementType) {
         this.sql = sql;
         this.catalog = catalog;
         this.schema = schema;
@@ -610,26 +530,17 @@ public class PStmtKey {
         this.autoGeneratedKeys = null;
         this.columnIndexes = null;
         this.columnNames = null;
-        // create builder
-        if (statementType == StatementType.PREPARED_STATEMENT) {
-            this.builder = new PreparedStatementWithResultSetConcurrency();
-        } else if (statementType == StatementType.CALLABLE_STATEMENT) {
-            this.builder = new PreparedCallWithResultSetConcurrency();
-        }
+        this.statementBuilder = toStatementBuilder(statementType, PreparedStatementWithResultSetConcurrency::new, PreparedCallWithResultSetConcurrency::new);
     }
 
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param schema
-     *            The schema.
-     * @param columnIndexes
-     *            An array of column indexes indicating the columns that should be returned from the inserted row or
-     *            rows.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param schema The schema.
+     * @param columnIndexes An array of column indexes indicating the columns that should be returned from the inserted row
+     *        or rows.
      */
     public PStmtKey(final String sql, final String catalog, final String schema, final int[] columnIndexes) {
         this.sql = sql;
@@ -642,21 +553,16 @@ public class PStmtKey {
         this.resultSetType = null;
         this.resultSetConcurrency = null;
         this.resultSetHoldability = null;
-        // create builder
-        this.builder = new PreparedStatementWithColumnIndexes();
+        this.statementBuilder = new PreparedStatementWithColumnIndexes();
     }
 
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param schema
-     *            The schema.
-     * @param statementType
-     *            The SQL statement type, prepared or callable.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param schema The schema.
+     * @param statementType The SQL statement type, prepared or callable.
      * @since 2.5.0
      */
     public PStmtKey(final String sql, final String catalog, final String schema, final StatementType statementType) {
@@ -670,32 +576,21 @@ public class PStmtKey {
         this.resultSetType = null;
         this.resultSetConcurrency = null;
         this.resultSetHoldability = null;
-        // create builder
-        if (statementType == StatementType.PREPARED_STATEMENT) {
-            this.builder = new PreparedStatementSQL();
-        } else if (statementType == StatementType.CALLABLE_STATEMENT) {
-            this.builder = new PreparedCallSQL();
-        }
+        this.statementBuilder = toStatementBuilder(statementType, PreparedStatementSQL::new, PreparedCallSQL::new);
     }
 
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param schema
-     *            The schema.
-     * @param statementType
-     *            The SQL statement type, prepared or callable.
-     * @param autoGeneratedKeys
-     *            A flag indicating whether auto-generated keys should be returned; one of
-     *            {@code Statement.RETURN_GENERATED_KEYS} or {@code Statement.NO_GENERATED_KEYS}.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param schema The schema.
+     * @param statementType The SQL statement type, prepared or callable.
+     * @param autoGeneratedKeys A flag indicating whether auto-generated keys should be returned; one of
+     *        {@code Statement.RETURN_GENERATED_KEYS} or {@code Statement.NO_GENERATED_KEYS}.
      * @since 2.5.0
      */
-    public PStmtKey(final String sql, final String catalog, final String schema, final StatementType statementType,
-            final Integer autoGeneratedKeys) {
+    public PStmtKey(final String sql, final String catalog, final String schema, final StatementType statementType, final Integer autoGeneratedKeys) {
         this.sql = sql;
         this.catalog = catalog;
         this.schema = schema;
@@ -706,25 +601,17 @@ public class PStmtKey {
         this.resultSetType = null;
         this.resultSetConcurrency = null;
         this.resultSetHoldability = null;
-        // create builder
-        if (statementType == StatementType.PREPARED_STATEMENT) {
-            this.builder = new PreparedStatementWithAutoGeneratedKeys();
-        } else if (statementType == StatementType.CALLABLE_STATEMENT) {
-            this.builder = new PreparedCallSQL();
-        }
+        this.statementBuilder = toStatementBuilder(statementType, PreparedStatementWithAutoGeneratedKeys::new, PreparedCallSQL::new);
     }
 
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param schema
-     *            The schema.
-     * @param columnNames
-     *            An array of column names indicating the columns that should be returned from the inserted row or rows.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param schema The schema.
+     * @param columnNames An array of column names indicating the columns that should be returned from the inserted row or
+     *        rows.
      * @since 2.5.0
      */
     public PStmtKey(final String sql, final String catalog, final String schema, final String[] columnNames) {
@@ -738,19 +625,16 @@ public class PStmtKey {
         this.resultSetType = null;
         this.resultSetConcurrency = null;
         this.resultSetHoldability = null;
-        // create builder
-        builder = new PreparedStatementWithColumnNames();
+        this.statementBuilder = new PreparedStatementWithColumnNames();
     }
 
     /**
      * Constructs a key to uniquely identify a prepared statement.
      *
-     * @param sql
-     *            The SQL statement.
-     * @param catalog
-     *            The catalog.
-     * @param columnNames
-     *            An array of column names indicating the columns that should be returned from the inserted row or rows.
+     * @param sql The SQL statement.
+     * @param catalog The catalog.
+     * @param columnNames An array of column names indicating the columns that should be returned from the inserted row or
+     *        rows.
      * @deprecated Use {@link #PStmtKey(String, String, String, String[])}.
      */
     @Deprecated
@@ -765,24 +649,21 @@ public class PStmtKey {
         this.resultSetType = null;
         this.resultSetConcurrency = null;
         this.resultSetHoldability = null;
-        // create builder
-        builder = new PreparedStatementWithColumnNames();
+        this.statementBuilder = new PreparedStatementWithColumnNames();
     }
 
     /**
      * Creates a new Statement from the given Connection.
      *
-     * @param connection
-     *            The Connection to use to create the statement.
+     * @param connection The Connection to use to create the statement.
      * @return The statement.
-     * @throws SQLException
-     *             Thrown when there is a problem creating the statement.
+     * @throws SQLException Thrown when there is a problem creating the statement.
      */
     public Statement createStatement(final Connection connection) throws SQLException {
-        if (builder == null) {
+        if (statementBuilder == null) {
             throw new IllegalStateException("Prepared statement key is invalid.");
         }
-        return builder.createStatement(connection);
+        return statementBuilder.createStatement(connection);
     }
 
     @Override
@@ -828,8 +709,8 @@ public class PStmtKey {
     }
 
     /**
-     * Gets a flag indicating whether auto-generated keys should be returned; one of
-     * {@code Statement.RETURN_GENERATED_KEYS} or {@code Statement.NO_GENERATED_KEYS}.
+     * Gets a flag indicating whether auto-generated keys should be returned; one of {@code Statement.RETURN_GENERATED_KEYS}
+     * or {@code Statement.NO_GENERATED_KEYS}.
      *
      * @return a flag indicating whether auto-generated keys should be returned.
      */
@@ -885,8 +766,8 @@ public class PStmtKey {
     }
 
     /**
-     * Gets the result set type, one of {@code ResultSet.TYPE_FORWARD_ONLY},
-     * {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
+     * Gets the result set type, one of {@code ResultSet.TYPE_FORWARD_ONLY}, {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or
+     * {@code ResultSet.TYPE_SCROLL_SENSITIVE}.
      *
      * @return the result set type.
      */
@@ -923,8 +804,8 @@ public class PStmtKey {
 
     @Override
     public int hashCode() {
-        return Objects.hash(autoGeneratedKeys, catalog, Arrays.hashCode(columnIndexes), Arrays.hashCode(columnNames),
-            resultSetConcurrency, resultSetHoldability, resultSetType, schema, sql, statementType);
+        return Objects.hash(autoGeneratedKeys, catalog, Arrays.hashCode(columnIndexes), Arrays.hashCode(columnNames), resultSetConcurrency,
+            resultSetHoldability, resultSetType, schema, sql, statementType);
     }
 
     @Override