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