diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java
index 8f8aaab3516..a111549fbed 100644
--- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java
+++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java
@@ -196,6 +196,26 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
afterPropertiesSet();
}
+ /**
+ * Copy constructor for a derived JdbcTemplate.
+ * @param original the original template to copy from
+ * @since 7.0
+ */
+ public JdbcTemplate(JdbcAccessor original) {
+ setDataSource(original.getDataSource());
+ setExceptionTranslator(original.getExceptionTranslator());
+ setLazyInit(original.isLazyInit());
+ if (original instanceof JdbcTemplate originalTemplate) {
+ setIgnoreWarnings(originalTemplate.isIgnoreWarnings());
+ setFetchSize(originalTemplate.getFetchSize());
+ setMaxRows(originalTemplate.getMaxRows());
+ setQueryTimeout(originalTemplate.getQueryTimeout());
+ setSkipResultsProcessing(originalTemplate.isSkipResultsProcessing());
+ setSkipUndeclaredResults(originalTemplate.isSkipUndeclaredResults());
+ setResultsMapCaseInsensitive(originalTemplate.isResultsMapCaseInsensitive());
+ }
+ }
+
/**
* Set whether we want to ignore JDBC statement warnings ({@link SQLWarning}).
@@ -264,7 +284,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
}
/**
- * Set the query timeout for statements that this JdbcTemplate executes.
+ * Set the query timeout (seconds) for statements that this JdbcTemplate executes.
*
Default is -1, indicating to use the JDBC driver's default
* (i.e. to not pass a specific query timeout setting on the driver).
*
Note: Any timeout specified here will be overridden by the remaining
@@ -277,7 +297,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
}
/**
- * Return the query timeout for statements that this JdbcTemplate executes.
+ * Return the query timeout (seconds) for statements that this JdbcTemplate executes.
*/
public int getQueryTimeout() {
return this.queryTimeout;
diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.java
index fa07fec74bc..f41cd0eb7b1 100644
--- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.java
+++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.java
@@ -87,8 +87,7 @@ public class NamedParameterJdbcTemplate implements NamedParameterJdbcOperations
private final JdbcOperations classicJdbcTemplate;
/** Cache of original SQL String to ParsedSql representation. */
- private volatile ConcurrentLruCache parsedSqlCache =
- new ConcurrentLruCache<>(DEFAULT_CACHE_LIMIT, NamedParameterUtils::parseSqlStatement);
+ private volatile ConcurrentLruCache parsedSqlCache;
/**
@@ -97,8 +96,7 @@ public class NamedParameterJdbcTemplate implements NamedParameterJdbcOperations
* @param dataSource the JDBC DataSource to access
*/
public NamedParameterJdbcTemplate(DataSource dataSource) {
- Assert.notNull(dataSource, "DataSource must not be null");
- this.classicJdbcTemplate = new JdbcTemplate(dataSource);
+ this(new JdbcTemplate(dataSource));
}
/**
@@ -109,6 +107,19 @@ public class NamedParameterJdbcTemplate implements NamedParameterJdbcOperations
public NamedParameterJdbcTemplate(JdbcOperations classicJdbcTemplate) {
Assert.notNull(classicJdbcTemplate, "JdbcTemplate must not be null");
this.classicJdbcTemplate = classicJdbcTemplate;
+ this.parsedSqlCache = new ConcurrentLruCache<>(DEFAULT_CACHE_LIMIT, NamedParameterUtils::parseSqlStatement);
+ }
+
+ /**
+ * Copy constructor for a derived NamedParameterJdbcTemplate.
+ * @param original the original NamedParameterJdbcTemplate to copy from
+ * @param classicJdbcTemplate the actual JdbcTemplate delegate to use
+ * @since 7.0
+ */
+ public NamedParameterJdbcTemplate(NamedParameterJdbcTemplate original, JdbcTemplate classicJdbcTemplate) {
+ Assert.notNull(classicJdbcTemplate, "JdbcTemplate must not be null");
+ this.classicJdbcTemplate = classicJdbcTemplate;
+ this.parsedSqlCache = original.parsedSqlCache;
}
diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/DefaultJdbcClient.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/DefaultJdbcClient.java
index d9e8df8398c..8a91191b63b 100644
--- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/DefaultJdbcClient.java
+++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/DefaultJdbcClient.java
@@ -45,6 +45,7 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SimplePropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
+import org.springframework.jdbc.support.JdbcAccessor;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.util.Assert;
@@ -62,8 +63,6 @@ import org.springframework.util.Assert;
*/
final class DefaultJdbcClient implements JdbcClient {
- private final JdbcOperations classicOps;
-
private final NamedParameterJdbcOperations namedParamOps;
private final ConversionService conversionService;
@@ -81,7 +80,6 @@ final class DefaultJdbcClient implements JdbcClient {
public DefaultJdbcClient(NamedParameterJdbcOperations jdbcTemplate, @Nullable ConversionService conversionService) {
Assert.notNull(jdbcTemplate, "JdbcTemplate must not be null");
- this.classicOps = jdbcTemplate.getJdbcOperations();
this.namedParamOps = jdbcTemplate;
this.conversionService =
(conversionService != null ? conversionService : DefaultConversionService.getSharedInstance());
@@ -90,7 +88,7 @@ final class DefaultJdbcClient implements JdbcClient {
@Override
public StatementSpec sql(String sql) {
- return new DefaultStatementSpec(sql);
+ return new DefaultStatementSpec(sql, this.namedParamOps);
}
@@ -98,14 +96,55 @@ final class DefaultJdbcClient implements JdbcClient {
private final String sql;
- private final List