diff --git a/pom.xml b/pom.xml
index bd84b4a..8526a62 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
xyz.zhouxy.jdbc
simple-jdbc
- 0.1.1-SNAPSHOT
+ 0.1.0-SNAPSHOT
8
diff --git a/src/main/java/xyz/zhouxy/jdbc/DefaultBeanResultMap.java b/src/main/java/xyz/zhouxy/jdbc/DefaultBeanRowMapper.java
similarity index 91%
rename from src/main/java/xyz/zhouxy/jdbc/DefaultBeanResultMap.java
rename to src/main/java/xyz/zhouxy/jdbc/DefaultBeanRowMapper.java
index 238031c..f0dcd6b 100644
--- a/src/main/java/xyz/zhouxy/jdbc/DefaultBeanResultMap.java
+++ b/src/main/java/xyz/zhouxy/jdbc/DefaultBeanRowMapper.java
@@ -35,21 +35,21 @@ import javax.annotation.Nullable;
import com.google.common.base.CaseFormat;
-public class DefaultBeanResultMap implements ResultMap {
+public class DefaultBeanRowMapper implements RowMapper {
private final Constructor constructor;
private final Map colPropertyMap;
- private DefaultBeanResultMap(Constructor constructor, Map colPropertyMap) {
+ private DefaultBeanRowMapper(Constructor constructor, Map colPropertyMap) {
this.constructor = constructor;
this.colPropertyMap = colPropertyMap;
}
- public static DefaultBeanResultMap of(Class beanType) throws SQLException {
+ public static DefaultBeanRowMapper of(Class beanType) throws SQLException {
return of(beanType, null);
}
- public static DefaultBeanResultMap of(Class beanType, @Nullable Map propertyColMap)
+ public static DefaultBeanRowMapper of(Class beanType, @Nullable Map propertyColMap)
throws SQLException {
try {
// 获取无参构造器
@@ -74,7 +74,7 @@ public class DefaultBeanResultMap implements ResultMap {
}
Map colPropertyMap = Arrays.stream(propertyDescriptors).collect(
Collectors.toMap(keyMapper, Function.identity(), (a, b) -> b));
- return new DefaultBeanResultMap<>(constructor, colPropertyMap);
+ return new DefaultBeanRowMapper<>(constructor, colPropertyMap);
}
catch (IntrospectionException e) {
throw new SQLException("There is an exception occurs during introspection.", e);
@@ -85,7 +85,7 @@ public class DefaultBeanResultMap implements ResultMap {
}
@Override
- public T map(ResultSet rs, int rowNumber) throws SQLException {
+ public T mapRow(ResultSet rs, int rowNumber) throws SQLException {
try {
T newInstance = this.constructor.newInstance();
ResultSetMetaData metaData = rs.getMetaData();
diff --git a/src/main/java/xyz/zhouxy/jdbc/ResultHandler.java b/src/main/java/xyz/zhouxy/jdbc/ResultHandler.java
new file mode 100644
index 0000000..b15019e
--- /dev/null
+++ b/src/main/java/xyz/zhouxy/jdbc/ResultHandler.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2024 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package xyz.zhouxy.jdbc;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+@FunctionalInterface
+public interface ResultHandler {
+ T handle(ResultSet resultSet) throws SQLException;
+}
diff --git a/src/main/java/xyz/zhouxy/jdbc/ResultMap.java b/src/main/java/xyz/zhouxy/jdbc/RowMapper.java
similarity index 60%
rename from src/main/java/xyz/zhouxy/jdbc/ResultMap.java
rename to src/main/java/xyz/zhouxy/jdbc/RowMapper.java
index 800ff82..404013f 100644
--- a/src/main/java/xyz/zhouxy/jdbc/ResultMap.java
+++ b/src/main/java/xyz/zhouxy/jdbc/RowMapper.java
@@ -23,10 +23,10 @@ import java.util.HashMap;
import java.util.Map;
@FunctionalInterface
-public interface ResultMap {
- T map(ResultSet rs, int rowNumber) throws SQLException;
+public interface RowMapper {
+ T mapRow(ResultSet rs, int rowNumber) throws SQLException;
- public static final ResultMap> mapResultMap = (rs, rowNumber) -> {
+ public static final RowMapper> HASH_MAP_MAPPER = (rs, rowNumber) -> {
Map result = new HashMap<>();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
@@ -37,23 +37,15 @@ public interface ResultMap {
return result;
};
- public static final ResultMap recordResultMap = (rs, rowNumber) -> {
- DbRecord result = new DbRecord();
- ResultSetMetaData metaData = rs.getMetaData();
- int columnCount = metaData.getColumnCount();
- for (int i = 1; i <= columnCount; i++) {
- String colName = metaData.getColumnName(i);
- result.put(colName, rs.getObject(colName));
- }
- return result;
- };
+ public static final RowMapper RECORD_MAPPER =
+ (rs, rowNumber) -> new DbRecord(HASH_MAP_MAPPER.mapRow(rs, rowNumber));
- public static ResultMap beanResultMap(Class beanType) throws SQLException {
- return DefaultBeanResultMap.of(beanType);
+ public static RowMapper beanRowMapper(Class beanType) throws SQLException {
+ return DefaultBeanRowMapper.of(beanType);
}
- public static ResultMap beanResultMap(Class beanType, Map propertyColMap)
+ public static RowMapper beanRowMapper(Class beanType, Map propertyColMap)
throws SQLException {
- return DefaultBeanResultMap.of(beanType, propertyColMap);
+ return DefaultBeanRowMapper.of(beanType, propertyColMap);
}
}
diff --git a/src/main/java/xyz/zhouxy/jdbc/SimpleJdbcTemplate.java b/src/main/java/xyz/zhouxy/jdbc/SimpleJdbcTemplate.java
index 7659598..fc44d6c 100644
--- a/src/main/java/xyz/zhouxy/jdbc/SimpleJdbcTemplate.java
+++ b/src/main/java/xyz/zhouxy/jdbc/SimpleJdbcTemplate.java
@@ -36,11 +36,10 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.sql.DataSource;
-import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
-import xyz.zhouxy.plusone.commons.function.ThrowingConsumer;
-import xyz.zhouxy.plusone.commons.function.ThrowingPredicate;
+import xyz.zhouxy.plusone.commons.collection.CollectionTools;
+import xyz.zhouxy.plusone.commons.util.AssertTools;
import xyz.zhouxy.plusone.commons.util.OptionalTools;
public class SimpleJdbcTemplate {
@@ -49,185 +48,224 @@ public class SimpleJdbcTemplate {
private final DataSource dataSource;
public SimpleJdbcTemplate(@Nonnull DataSource dataSource) {
- Preconditions.checkNotNull(dataSource);
+ AssertTools.checkNotNull(dataSource);
this.dataSource = dataSource;
}
- public List query(String sql, Object[] params, ResultMap resultMap)
+ // #region - query
+
+ public T query(String sql, Object[] params, ResultHandler resultHandler)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.query(conn, sql, params, resultMap);
+ return JdbcExecutor.query(conn, sql, params, resultHandler);
}
}
- public Optional queryFirst(String sql, Object[] params, ResultMap resultMap)
+ public T query(String sql, ResultHandler resultHandler)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryFirst(conn, sql, params, resultMap);
+ return JdbcExecutor.query(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, resultHandler);
}
}
- public List> query(String sql, Object[] params)
+ // #endregion
+
+ // #region - queryList
+
+ public List queryList(String sql, Object[] params, RowMapper rowMapper)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.query(conn, sql, params);
+ return JdbcExecutor.queryList(conn, sql, params, rowMapper);
+ }
+ }
+
+ public List queryList(String sql, Object[] params, Class clazz)
+ throws SQLException {
+ try (Connection conn = this.dataSource.getConnection()) {
+ return JdbcExecutor.queryList(conn, sql, params, clazz);
+ }
+ }
+
+ public List> queryList(String sql, Object[] params)
+ throws SQLException {
+ try (Connection conn = this.dataSource.getConnection()) {
+ return JdbcExecutor.queryList(conn, sql, params, RowMapper.HASH_MAP_MAPPER);
+ }
+ }
+
+ public List queryRecordList(String sql, Object[] params)
+ throws SQLException {
+ try (Connection conn = this.dataSource.getConnection()) {
+ return JdbcExecutor.queryList(conn, sql, params, RowMapper.RECORD_MAPPER);
+ }
+ }
+
+ public List queryList(String sql, RowMapper rowMapper)
+ throws SQLException {
+ try (Connection conn = this.dataSource.getConnection()) {
+ return JdbcExecutor.queryList(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, rowMapper);
+ }
+ }
+
+ public List queryList(String sql, Class clazz)
+ throws SQLException {
+ try (Connection conn = this.dataSource.getConnection()) {
+ return JdbcExecutor.queryList(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, clazz);
+ }
+ }
+
+ public List> queryList(String sql)
+ throws SQLException {
+ try (Connection conn = this.dataSource.getConnection()) {
+ return JdbcExecutor.queryList(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, RowMapper.HASH_MAP_MAPPER);
+ }
+ }
+
+ public List queryRecordList(String sql)
+ throws SQLException {
+ try (Connection conn = this.dataSource.getConnection()) {
+ return JdbcExecutor.queryList(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, RowMapper.RECORD_MAPPER);
+ }
+ }
+
+ // #endregion
+
+ // #region - queryFirst
+
+ public Optional queryFirst(String sql, Object[] params, RowMapper rowMapper)
+ throws SQLException {
+ try (Connection conn = this.dataSource.getConnection()) {
+ return JdbcExecutor.queryFirst(conn, sql, params, rowMapper);
+ }
+ }
+
+ public Optional queryFirst(String sql, Object[] params, Class clazz)
+ throws SQLException {
+ try (Connection conn = this.dataSource.getConnection()) {
+ return JdbcExecutor.queryFirst(conn, sql, params, clazz);
}
}
public Optional> queryFirst(String sql, Object[] params)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryFirst(conn, sql, params);
- }
- }
-
- public List queryToRecordList(String sql, Object[] params)
- throws SQLException {
- try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryToRecordList(conn, sql, params);
+ return JdbcExecutor.queryFirst(conn, sql, params, RowMapper.HASH_MAP_MAPPER);
}
}
public Optional queryFirstRecord(String sql, Object[] params)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryFirstRecord(conn, sql, params);
+ return JdbcExecutor.queryFirst(conn, sql, params, RowMapper.RECORD_MAPPER);
}
}
- public Optional queryToString(String sql, Object[] params)
+ public Optional queryFirstString(String sql, Object[] params)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryToString(conn, sql, params);
+ return JdbcExecutor.queryFirstString(conn, sql, params);
}
}
- public OptionalInt queryToInt(String sql, Object[] params)
+ public OptionalInt queryFirstInt(String sql, Object[] params)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryToInt(conn, sql, params);
+ return JdbcExecutor.queryFirstInt(conn, sql, params);
}
}
- public OptionalLong queryToLong(String sql, Object[] params)
+ public OptionalLong queryFirstLong(String sql, Object[] params)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryToLong(conn, sql, params);
+ return JdbcExecutor.queryFirstLong(conn, sql, params);
}
}
- public OptionalDouble queryToDouble(String sql, Object[] params)
+ public OptionalDouble queryFirstDouble(String sql, Object[] params)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryToDouble(conn, sql, params);
+ return JdbcExecutor.queryFirstDouble(conn, sql, params);
}
}
- public Optional queryToBigDecimal(String sql, Object[] params)
+ public Optional queryFirstBigDecimal(String sql, Object[] params)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryToBigDecimal(conn, sql, params);
+ return JdbcExecutor.queryFirstBigDecimal(conn, sql, params);
}
}
- public int update(String sql, Object[] params)
+ public Optional queryFirst(String sql, RowMapper rowMapper)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.update(conn, sql, params);
+ return JdbcExecutor.queryFirst(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, rowMapper);
}
}
- /**
- * 执行 SQL 并更新后的数据
- *
- * @param sql 要执行的 SQL 语句
- * @param params 参数
- * @param resultMap 结果映射规则
- *
- * @return 更新的数据
- * @throws SQLException 执行 SQL 遇到异常情况将抛出
- */
- public List update(String sql, Object[] params, ResultMap resultMap)
+ public Optional queryFirst(String sql, Class clazz)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.update(conn, sql, params, resultMap);
- }
- }
-
- public List query(String sql, ResultMap resultMap)
- throws SQLException {
- try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.query(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, resultMap);
- }
- }
-
- public Optional queryFirst(String sql, ResultMap resultMap)
- throws SQLException {
- try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryFirst(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, resultMap);
- }
- }
-
- public List> query(String sql)
- throws SQLException {
- try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.query(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirst(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, clazz);
}
}
public Optional> queryFirst(String sql)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryFirst(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
- }
- }
-
- public List queryToRecordList(String sql)
- throws SQLException {
- try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryToRecordList(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirst(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, RowMapper.HASH_MAP_MAPPER);
}
}
public Optional queryFirstRecord(String sql)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryFirstRecord(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirst(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, RowMapper.RECORD_MAPPER);
}
}
- public Optional queryToString(String sql)
+ public Optional queryFirstString(String sql)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryToString(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirstString(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
}
}
- public OptionalInt queryToInt(String sql)
+ public OptionalInt queryFirstInt(String sql)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryToInt(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirstInt(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
}
}
- public OptionalLong queryToLong(String sql)
+ public OptionalLong queryFirstLong(String sql)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryToLong(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirstLong(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
}
}
- public OptionalDouble queryToDouble(String sql)
+ public OptionalDouble queryFirstDouble(String sql)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryToDouble(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirstDouble(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
}
}
- public Optional queryToBigDecimal(String sql)
+ public Optional queryFirstBigDecimal(String sql)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.queryToBigDecimal(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirstBigDecimal(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ }
+ }
+
+ // #endregion
+
+ // #region - update & batchUpdate
+
+ public int update(String sql, Object[] params)
+ throws SQLException {
+ try (Connection conn = this.dataSource.getConnection()) {
+ return JdbcExecutor.update(conn, sql, params);
}
}
@@ -243,15 +281,32 @@ public class SimpleJdbcTemplate {
*
* @param sql 要执行的 SQL 语句
* @param params 参数
- * @param resultMap 结果映射规则
+ * @param rowMapper 结果映射规则
*
* @return 更新的数据
* @throws SQLException 执行 SQL 遇到异常情况将抛出
*/
- public List update(String sql, ResultMap resultMap)
+ public List update(String sql, Object[] params, RowMapper rowMapper)
throws SQLException {
try (Connection conn = this.dataSource.getConnection()) {
- return JdbcExecutor.update(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, resultMap);
+ return JdbcExecutor.update(conn, sql, params, rowMapper);
+ }
+ }
+
+ /**
+ * 执行 SQL 并更新后的数据
+ *
+ * @param sql 要执行的 SQL 语句
+ * @param params 参数
+ * @param rowMapper 结果映射规则
+ *
+ * @return 更新的数据
+ * @throws SQLException 执行 SQL 遇到异常情况将抛出
+ */
+ public List update(String sql, RowMapper rowMapper)
+ throws SQLException {
+ try (Connection conn = this.dataSource.getConnection()) {
+ return JdbcExecutor.update(conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, rowMapper);
}
}
@@ -262,14 +317,26 @@ public class SimpleJdbcTemplate {
}
}
- public void executeTransaction(@Nonnull final ThrowingConsumer operations)
+ public List batchUpdateAndIgnoreException(String sql, @Nullable Collection params,
+ int batchSize, List exceptions)
+ throws SQLException {
+ try (Connection conn = this.dataSource.getConnection()) {
+ return JdbcExecutor.batchUpdateAndIgnoreException(conn, sql, params, batchSize, exceptions);
+ }
+ }
+
+ // #endregion
+
+ // #region - transaction
+
+ public void executeTransaction(@Nonnull final DbOperations operations)
throws SQLException, E {
- Preconditions.checkNotNull(operations, "Operations can not be null.");
+ AssertTools.checkNotNull(operations, "Operations can not be null.");
try (Connection conn = this.dataSource.getConnection()) {
final boolean autoCommit = conn.getAutoCommit();
try {
conn.setAutoCommit(false);
- operations.accept(new JdbcExecutor(conn));
+ operations.execute(new JdbcExecutor(conn));
conn.commit();
}
catch (Exception e) {
@@ -282,9 +349,9 @@ public class SimpleJdbcTemplate {
}
}
- public void commitIfTrue(@Nonnull final ThrowingPredicate operations)
+ public void commitIfTrue(@Nonnull final PredicateWithThrowable operations)
throws SQLException, E {
- Preconditions.checkNotNull(operations, "Operations can not be null.");
+ AssertTools.checkNotNull(operations, "Operations can not be null.");
try (Connection conn = this.dataSource.getConnection()) {
final boolean autoCommit = conn.getAutoCommit();
try {
@@ -306,6 +373,18 @@ public class SimpleJdbcTemplate {
}
}
+ @FunctionalInterface
+ public interface DbOperations {
+ void execute(JdbcExecutor jdbcExecutor) throws E;
+ }
+
+ @FunctionalInterface
+ public interface PredicateWithThrowable {
+ boolean test(JdbcExecutor jdbcExecutor) throws E;
+ }
+
+ // #endregion
+
public static final class JdbcExecutor {
private final Connection conn;
@@ -314,139 +393,163 @@ public class SimpleJdbcTemplate {
this.conn = conn;
}
- public List query(String sql, Object[] params, ResultMap resultMap)
+ // #region - query
+
+ public T query(String sql, Object[] params, ResultHandler resulthHandler)
throws SQLException {
- return JdbcExecutor.query(this.conn, sql, params, resultMap);
+ return JdbcExecutor.query(this.conn, sql, params, resulthHandler);
}
- public Optional queryFirst(String sql, Object[] params, ResultMap resultMap)
+ public T query(String sql, ResultHandler resulthHandler)
throws SQLException {
- return JdbcExecutor.queryFirst(this.conn, sql, params, resultMap);
+ return JdbcExecutor.query(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, resulthHandler);
}
- public List> query(String sql, Object[] params)
+ // #endregion
+
+ // #region - queryList
+
+ public List queryList(String sql, Object[] params, RowMapper rowMapper)
throws SQLException {
- return JdbcExecutor.query(this.conn, sql, params);
+ return JdbcExecutor.queryList(this.conn, sql, params, rowMapper);
+ }
+
+ public List queryList(String sql, Object[] params, Class clazz)
+ throws SQLException {
+ return JdbcExecutor.queryList(this.conn, sql, params, clazz);
+ }
+
+ public List> queryList(String sql, Object[] params)
+ throws SQLException {
+ return JdbcExecutor.queryList(this.conn, sql, params, RowMapper.HASH_MAP_MAPPER);
+ }
+
+ public List queryRecordList(String sql, Object[] params)
+ throws SQLException {
+ return JdbcExecutor.queryList(this.conn, sql, params, RowMapper.RECORD_MAPPER);
+ }
+
+ public List queryList(String sql, RowMapper rowMapper)
+ throws SQLException {
+ return JdbcExecutor.queryList(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, rowMapper);
+ }
+
+ public List queryList(String sql, Class clazz)
+ throws SQLException {
+ return JdbcExecutor.queryList(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, clazz);
+ }
+
+ public List> queryList(String sql)
+ throws SQLException {
+ return JdbcExecutor.queryList(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, RowMapper.HASH_MAP_MAPPER);
+ }
+
+ public List queryRecordList(String sql)
+ throws SQLException {
+ return JdbcExecutor.queryList(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, RowMapper.RECORD_MAPPER);
+ }
+
+ // #endregion
+
+ // #region - queryFirst
+
+ public Optional queryFirst(String sql, Object[] params, RowMapper rowMapper)
+ throws SQLException {
+ return JdbcExecutor.queryFirst(this.conn, sql, params, rowMapper);
+ }
+
+ public Optional queryFirst(String sql, Object[] params, Class clazz)
+ throws SQLException {
+ return JdbcExecutor.queryFirst(this.conn, sql, params, clazz);
}
public Optional> queryFirst(String sql, Object[] params)
throws SQLException {
- return JdbcExecutor.queryFirst(this.conn, sql, params);
- }
-
- public List queryToRecordList(String sql, Object[] params)
- throws SQLException {
- return JdbcExecutor.queryToRecordList(this.conn, sql, params);
+ return JdbcExecutor.queryFirst(this.conn, sql, params, RowMapper.HASH_MAP_MAPPER);
}
public Optional queryFirstRecord(String sql, Object[] params)
throws SQLException {
- return JdbcExecutor.queryFirstRecord(this.conn, sql, params);
+ return JdbcExecutor.queryFirst(this.conn, sql, params, RowMapper.RECORD_MAPPER);
}
- public Optional queryToString(String sql, Object[] params)
+ public Optional queryFirstString(String sql, Object[] params)
throws SQLException {
- return JdbcExecutor.queryToString(this.conn, sql, params);
+ return JdbcExecutor.queryFirstString(this.conn, sql, params);
}
- public OptionalInt queryToInt(String sql, Object[] params)
+ public OptionalInt queryFirstInt(String sql, Object[] params)
throws SQLException {
- return JdbcExecutor.queryToInt(this.conn, sql, params);
+ return JdbcExecutor.queryFirstInt(this.conn, sql, params);
}
- public OptionalLong queryToLong(String sql, Object[] params)
+ public OptionalLong queryFirstLong(String sql, Object[] params)
throws SQLException {
- return JdbcExecutor.queryToLong(this.conn, sql, params);
+ return JdbcExecutor.queryFirstLong(this.conn, sql, params);
}
- public OptionalDouble queryToDouble(String sql, Object[] params)
+ public OptionalDouble queryFirstDouble(String sql, Object[] params)
throws SQLException {
- return JdbcExecutor.queryToDouble(this.conn, sql, params);
+ return JdbcExecutor.queryFirstDouble(this.conn, sql, params);
}
- public Optional queryToBigDecimal(String sql, Object[] params)
+ public Optional queryFirstBigDecimal(String sql, Object[] params)
throws SQLException {
- return JdbcExecutor.queryToBigDecimal(this.conn, sql, params);
+ return JdbcExecutor.queryFirstBigDecimal(this.conn, sql, params);
}
- public int update(String sql, Object[] params)
+ public Optional queryFirst(String sql, RowMapper rowMapper)
throws SQLException {
- return JdbcExecutor.update(this.conn, sql, params);
+ return JdbcExecutor.queryFirst(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, rowMapper);
}
- /**
- * 执行 SQL 并更新后的数据
- *
- * @param sql 要执行的 SQL 语句
- * @param params 参数
- * @param resultMap 结果映射规则
- *
- * @return 更新的数据
- * @throws SQLException 执行 SQL 遇到异常情况将抛出
- */
- public List update(String sql, Object[] params, ResultMap resultMap)
+ public Optional queryFirst(String sql, Class clazz)
throws SQLException {
- return JdbcExecutor.update(this.conn, sql, params, resultMap);
- }
-
- public List batchUpdate(String sql, @Nullable Collection params, int batchSize)
- throws SQLException {
- return JdbcExecutor.batchUpdate(this.conn, sql, params, batchSize);
- }
-
- public List query(String sql, ResultMap resultMap)
- throws SQLException {
- return JdbcExecutor.query(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, resultMap);
- }
-
- public Optional queryFirst(String sql, ResultMap resultMap)
- throws SQLException {
- return JdbcExecutor.queryFirst(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, resultMap);
- }
-
- public List> query(String sql)
- throws SQLException {
- return JdbcExecutor.query(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirst(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, clazz);
}
public Optional> queryFirst(String sql)
throws SQLException {
- return JdbcExecutor.queryFirst(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
- }
-
- public List queryToRecordList(String sql)
- throws SQLException {
- return JdbcExecutor.queryToRecordList(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirst(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, RowMapper.HASH_MAP_MAPPER);
}
public Optional queryFirstRecord(String sql)
throws SQLException {
- return JdbcExecutor.queryFirstRecord(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirst(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, RowMapper.RECORD_MAPPER);
}
- public Optional queryToString(String sql)
+ public Optional queryFirstString(String sql)
throws SQLException {
- return JdbcExecutor.queryToString(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirstString(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
}
- public OptionalInt queryToInt(String sql)
+ public OptionalInt queryFirstInt(String sql)
throws SQLException {
- return JdbcExecutor.queryToInt(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirstInt(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
}
- public OptionalLong queryToLong(String sql)
+ public OptionalLong queryFirstLong(String sql)
throws SQLException {
- return JdbcExecutor.queryToLong(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirstLong(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
}
- public OptionalDouble queryToDouble(String sql)
+ public OptionalDouble queryFirstDouble(String sql)
throws SQLException {
- return JdbcExecutor.queryToDouble(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirstDouble(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
}
- public Optional queryToBigDecimal(String sql)
+ public Optional queryFirstBigDecimal(String sql)
throws SQLException {
- return JdbcExecutor.queryToBigDecimal(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ return JdbcExecutor.queryFirstBigDecimal(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY);
+ }
+
+ // #endregion
+
+ // #region - update & batchUpdate
+
+ public int update(String sql, Object[] params)
+ throws SQLException {
+ return JdbcExecutor.update(this.conn, sql, params);
}
public int update(String sql)
@@ -459,88 +562,172 @@ public class SimpleJdbcTemplate {
*
* @param sql 要执行的 SQL 语句
* @param params 参数
- * @param resultMap 结果映射规则
+ * @param rowMapper 结果映射规则
*
* @return 更新的数据
* @throws SQLException 执行 SQL 遇到异常情况将抛出
*/
- public List update(String sql, ResultMap resultMap)
+ public List update(String sql, Object[] params, RowMapper rowMapper)
throws SQLException {
- return JdbcExecutor.update(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, resultMap);
+ return JdbcExecutor.update(this.conn, sql, params, rowMapper);
}
- private static List query(Connection conn, String sql, Object[] params, ResultMap resultMap)
+ /**
+ * 执行 SQL 并更新后的数据
+ *
+ * @param sql 要执行的 SQL 语句
+ * @param params 参数
+ * @param rowMapper 结果映射规则
+ *
+ * @return 更新的数据
+ * @throws SQLException 执行 SQL 遇到异常情况将抛出
+ */
+ public List update(String sql, RowMapper rowMapper)
+ throws SQLException {
+ return JdbcExecutor.update(this.conn, sql, ParamBuilder.EMPTY_OBJECT_ARRAY, rowMapper);
+ }
+
+ public List batchUpdate(String sql, @Nullable Collection params, int batchSize)
+ throws SQLException {
+ return JdbcExecutor.batchUpdate(this.conn, sql, params, batchSize);
+ }
+
+ public List batchUpdateAndIgnoreException(String sql, @Nullable Collection params,
+ int batchSize, List exceptions)
+ throws SQLException {
+ return JdbcExecutor.batchUpdateAndIgnoreException(this.conn, sql, params, batchSize, exceptions);
+ }
+
+ // #endregion
+
+ // #region - internal
+
+ private static T queryInternal(@Nonnull Connection conn,
+ @Nonnull String sql,
+ @Nullable Object[] params,
+ @Nonnull ResultHandler resultHandler)
throws SQLException {
- assertConnectionNotNull(conn);
- assertSqlNotNull(sql);
- assertResultMapNotNull(resultMap);
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
fillStatement(stmt, params);
try (ResultSet rs = stmt.executeQuery()) {
- List result = new ArrayList<>();
- int rowNumber = 0;
- while (rs.next()) {
- T e = resultMap.map(rs, rowNumber++);
- result.add(e);
- }
- return result;
+ return resultHandler.handle(rs);
}
}
}
- private static Optional queryFirst(Connection conn, String sql, Object[] params, ResultMap resultMap)
+ private static List queryListInternal(@Nonnull Connection conn,
+ @Nonnull String sql,
+ @Nullable Object[] params,
+ @Nonnull RowMapper rowMapper)
throws SQLException {
- return query(conn, sql, params, resultMap).stream().findFirst();
+ return queryInternal(conn, sql, params, rs -> {
+ List result = new ArrayList<>();
+ int rowNumber = 0;
+ while (rs.next()) {
+ T e = rowMapper.mapRow(rs, rowNumber++);
+ result.add(e);
+ }
+ return result;
+ });
}
- private static List> query(Connection conn, String sql, Object[] params)
+ private static Optional queryFirstInternal(@Nonnull Connection conn,
+ @Nonnull String sql,
+ @Nullable Object[] params,
+ @Nonnull RowMapper rowMapper)
throws SQLException {
- return query(conn, sql, params, ResultMap.mapResultMap);
+ return queryInternal(conn, sql, params, rs -> {
+ if (rs.next()) {
+ return Optional.ofNullable(rowMapper.mapRow(rs, 0));
+ }
+ return Optional.empty();
+ });
}
- private static Optional> queryFirst(Connection conn, String sql, Object[] params)
+ // #endregion
+
+ // #region - query
+
+ private static T query(Connection conn, String sql, Object[] params, ResultHandler resultHandler)
throws SQLException {
- return queryFirst(conn, sql, params, ResultMap.mapResultMap);
+ assertConnectionNotNull(conn);
+ assertSqlNotNull(sql);
+ assertResultHandlerNotNull(resultHandler);
+ return queryInternal(conn, sql, params, resultHandler);
}
- private static List queryToRecordList(Connection conn, String sql, Object[] params)
+ // #endregion
+
+ // #region - queryList
+
+ private static List queryList(Connection conn, String sql, Object[] params, RowMapper rowMapper)
throws SQLException {
- return query(conn, sql, params, ResultMap.recordResultMap);
+ assertConnectionNotNull(conn);
+ assertSqlNotNull(sql);
+ assertRowMapperNotNull(rowMapper);
+ return queryListInternal(conn, sql, params, rowMapper);
}
- private static Optional queryFirstRecord(Connection conn, String sql, Object[] params)
+ private static List queryList(Connection conn, String sql, Object[] params, Class clazz)
throws SQLException {
- return queryFirst(conn, sql, params, ResultMap.recordResultMap);
+ assertConnectionNotNull(conn);
+ assertSqlNotNull(sql);
+ assertClazzNotNull(clazz);
+ return queryListInternal(conn, sql, params, (rs, rowNumber) -> rs.getObject(1, clazz));
}
- private static Optional queryToString(Connection conn, String sql, Object[] params)
+ // #endregion
+
+ // #region - queryFirst
+
+ private static Optional queryFirst(Connection conn, String sql, Object[] params, RowMapper rowMapper)
+ throws SQLException {
+ assertConnectionNotNull(conn);
+ assertSqlNotNull(sql);
+ assertRowMapperNotNull(rowMapper);
+ return queryFirstInternal(conn, sql, params, rowMapper);
+ }
+
+ private static Optional queryFirst(Connection conn, String sql, Object[] params, Class clazz)
+ throws SQLException {
+ assertConnectionNotNull(conn);
+ assertSqlNotNull(sql);
+ assertClazzNotNull(clazz);
+ return queryFirstInternal(conn, sql, params, (rs, rowNumber) -> rs.getObject(1, clazz));
+ }
+
+ private static Optional queryFirstString(Connection conn, String sql, Object[] params)
throws SQLException {
return queryFirst(conn, sql, params, (rs, rowNumber) -> rs.getString(1));
}
- private static OptionalInt queryToInt(Connection conn, String sql, Object[] params)
+ private static OptionalInt queryFirstInt(Connection conn, String sql, Object[] params)
throws SQLException {
Optional result = queryFirst(conn, sql, params, (rs, rowNumber) -> rs.getInt(1));
return OptionalTools.toOptionalInt(result);
}
- private static OptionalLong queryToLong(Connection conn, String sql, Object[] params)
+ private static OptionalLong queryFirstLong(Connection conn, String sql, Object[] params)
throws SQLException {
Optional