diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/StatementUtil.java b/hutool-db/src/main/java/org/dromara/hutool/db/StatementUtil.java
index 449109869..68a32f881 100644
--- a/hutool-db/src/main/java/org/dromara/hutool/db/StatementUtil.java
+++ b/hutool-db/src/main/java/org/dromara/hutool/db/StatementUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2023 looly(loolly@aliyun.com)
+ * Copyright (c) 2023-2024. looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/sql/BoundSql.java b/hutool-db/src/main/java/org/dromara/hutool/db/sql/BoundSql.java
new file mode 100644
index 000000000..bf063e57e
--- /dev/null
+++ b/hutool-db/src/main/java/org/dromara/hutool/db/sql/BoundSql.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2024. looly(loolly@aliyun.com)
+ * Hutool is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * https://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ */
+
+package org.dromara.hutool.db.sql;
+
+import java.util.List;
+
+/**
+ * 参数绑定的SQL封装,用于表示SQL语句模板('?'表示参数占位符)和参数值的封装
+ * SQL中的'?'占位符必须和params列表中的参数值一一对应
+ *
+ * @author Looly
+ */
+public class BoundSql {
+
+ protected String sql;
+ protected final List params;
+
+ /**
+ * 构造
+ *
+ * @param sql SQL语句,参数占位符使用'?'表示
+ * @param params 参数列表,每个参数对应一个'?'
+ */
+ public BoundSql(final String sql, final List params) {
+ this.sql = sql;
+ this.params = params;
+ }
+
+ /**
+ * 获取SQL
+ *
+ * @return SQL
+ */
+ public String getSql() {
+ return this.sql;
+ }
+
+ /**
+ * 获取参数列表,按照占位符顺序
+ *
+ * @return 参数列表
+ */
+ public List getParams() {
+ return this.params;
+ }
+
+ /**
+ * 获取参数列表,按照占位符顺序
+ *
+ * @return 参数数组
+ */
+ public Object[] getParamArray() {
+ return this.params.toArray(new Object[0]);
+ }
+}
diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/sql/NamedSql.java b/hutool-db/src/main/java/org/dromara/hutool/db/sql/NamedSql.java
index 68b763f8e..db442abdf 100644
--- a/hutool-db/src/main/java/org/dromara/hutool/db/sql/NamedSql.java
+++ b/hutool-db/src/main/java/org/dromara/hutool/db/sql/NamedSql.java
@@ -12,13 +12,12 @@
package org.dromara.hutool.db.sql;
+import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.map.MapUtil;
import org.dromara.hutool.core.text.StrUtil;
-import org.dromara.hutool.core.array.ArrayUtil;
import java.util.Collection;
import java.util.LinkedList;
-import java.util.List;
import java.util.Map;
/**
@@ -33,12 +32,12 @@ import java.util.Map;
* @author looly
* @since 4.0.10
*/
-public class NamedSql {
+public class NamedSql extends BoundSql {
private static final char[] NAME_START_CHARS = {':', '@', '?'};
- private String sql;
- private final List params;
+ private final String namedSql;
+ private final Map paramMap;
/**
* 构造
@@ -47,35 +46,28 @@ public class NamedSql {
* @param paramMap 名和参数的对应Map
*/
public NamedSql(final String namedSql, final Map paramMap) {
- this.params = new LinkedList<>();
+ super(null, new LinkedList<>());
+ this.namedSql = namedSql;
+ this.paramMap = paramMap;
parse(namedSql, paramMap);
}
/**
- * 获取SQL
+ * 获取原始地带名称占位符的SQL语句
*
- * @return SQL
+ * @return 名称占位符的SQL
*/
- public String getSql() {
- return this.sql;
+ public String getNamedSql() {
+ return namedSql;
}
/**
- * 获取参数列表,按照占位符顺序
+ * 获取原始参数名和参数值对应关系参数表
*
- * @return 参数数组
+ * @return 参数名和参数值对应关系参数表
*/
- public Object[] getParams() {
- return this.params.toArray(new Object[0]);
- }
-
- /**
- * 获取参数列表,按照占位符顺序
- *
- * @return 参数列表
- */
- public List getParamList() {
- return this.params;
+ public Map getParamMap() {
+ return paramMap;
}
/**
diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/sql/SqlExecutor.java b/hutool-db/src/main/java/org/dromara/hutool/db/sql/SqlExecutor.java
index a4245d661..90f6361f8 100644
--- a/hutool-db/src/main/java/org/dromara/hutool/db/sql/SqlExecutor.java
+++ b/hutool-db/src/main/java/org/dromara/hutool/db/sql/SqlExecutor.java
@@ -44,7 +44,7 @@ public class SqlExecutor {
*/
public static int execute(final Connection conn, final String sql, final Map paramMap) throws DbRuntimeException {
final NamedSql namedSql = new NamedSql(sql, paramMap);
- return execute(conn, namedSql.getSql(), namedSql.getParams());
+ return execute(conn, namedSql.getSql(), namedSql.getParamArray());
}
/**
@@ -125,7 +125,7 @@ public class SqlExecutor {
*/
public static Long executeForGeneratedKey(final Connection conn, final String sql, final Map paramMap) throws DbRuntimeException {
final NamedSql namedSql = new NamedSql(sql, paramMap);
- return executeForGeneratedKey(conn, namedSql.getSql(), namedSql.getParams());
+ return executeForGeneratedKey(conn, namedSql.getSql(), namedSql.getParamArray());
}
/**
@@ -241,7 +241,7 @@ public class SqlExecutor {
*/
public static T query(final Connection conn, final String sql, final RsHandler rsh, final Map paramMap) throws DbRuntimeException {
final NamedSql namedSql = new NamedSql(sql, paramMap);
- return query(conn, namedSql.getSql(), rsh, namedSql.getParams());
+ return query(conn, namedSql.getSql(), rsh, namedSql.getParamArray());
}
/**
diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/sql/StatementBuilder.java b/hutool-db/src/main/java/org/dromara/hutool/db/sql/StatementBuilder.java
index 521342b75..1eb0b930a 100644
--- a/hutool-db/src/main/java/org/dromara/hutool/db/sql/StatementBuilder.java
+++ b/hutool-db/src/main/java/org/dromara/hutool/db/sql/StatementBuilder.java
@@ -200,7 +200,7 @@ public class StatementBuilder implements Builder {
// 检查参数是否为命名方式的参数
final NamedSql namedSql = new NamedSql(sql, Convert.toMap(String.class, Object.class, params[0]));
sql = namedSql.getSql();
- params = namedSql.getParams();
+ params = namedSql.getParamArray();
}
sqlLog.log(sql, ArrayUtil.isEmpty(params) ? null : params);
diff --git a/hutool-db/src/test/java/org/dromara/hutool/db/NamedSqlTest.java b/hutool-db/src/test/java/org/dromara/hutool/db/NamedSqlTest.java
index bbee47be0..0253facb3 100644
--- a/hutool-db/src/test/java/org/dromara/hutool/db/NamedSqlTest.java
+++ b/hutool-db/src/test/java/org/dromara/hutool/db/NamedSqlTest.java
@@ -36,8 +36,8 @@ public class NamedSqlTest {
final NamedSql namedSql = new NamedSql(sql, paramMap);
//未指定参数原样输出
Assertions.assertEquals("select * from table where id=@id and name = ? and nickName = ?", namedSql.getSql());
- Assertions.assertEquals("张三", namedSql.getParams()[0]);
- Assertions.assertEquals("小豆豆", namedSql.getParams()[1]);
+ Assertions.assertEquals("张三", namedSql.getParamArray()[0]);
+ Assertions.assertEquals("小豆豆", namedSql.getParamArray()[1]);
}
@Test
@@ -54,9 +54,9 @@ public class NamedSqlTest {
final NamedSql namedSql = new NamedSql(sql, paramMap);
Assertions.assertEquals("select * from table where id=? and name = ? and nickName = ?", namedSql.getSql());
//指定了null参数的依旧替换,参数值为null
- Assertions.assertNull(namedSql.getParams()[0]);
- Assertions.assertEquals("张三", namedSql.getParams()[1]);
- Assertions.assertEquals("小豆豆", namedSql.getParams()[2]);
+ Assertions.assertNull(namedSql.getParamArray()[0]);
+ Assertions.assertEquals("张三", namedSql.getParamArray()[1]);
+ Assertions.assertEquals("小豆豆", namedSql.getParamArray()[2]);
}
@Test
@@ -92,9 +92,9 @@ public class NamedSqlTest {
final NamedSql namedSql = new NamedSql(sql, paramMap);
Assertions.assertEquals("select * from user where id in (?,?,?)", namedSql.getSql());
- Assertions.assertEquals(1, namedSql.getParams()[0]);
- Assertions.assertEquals(2, namedSql.getParams()[1]);
- Assertions.assertEquals(3, namedSql.getParams()[2]);
+ Assertions.assertEquals(1, namedSql.getParamArray()[0]);
+ Assertions.assertEquals(2, namedSql.getParamArray()[1]);
+ Assertions.assertEquals(3, namedSql.getParamArray()[2]);
}
@Test