From a9d8cae6b1bd47918aa1f9a0e5123ea5a0eb1a13 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 12 Mar 2020 17:11:54 +0800 Subject: [PATCH] fix db bug --- CHANGELOG.md | 1 + .../main/java/cn/hutool/db/AbstractDb.java | 15 ++++++++++- .../main/java/cn/hutool/db/StatementUtil.java | 15 ++++++++--- .../main/java/cn/hutool/db/sql/NamedSql.java | 2 +- .../java/cn/hutool/db/sql/SqlExecutor.java | 10 +++---- .../test/java/cn/hutool/db/NamedSqlTest.java | 26 +++++++++++++++---- 6 files changed, 54 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6537952be..40ba6bfb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ * 【http 】 修复body方法添加多余头的问题(issue#769@Github) * 【bloomFilter 】修复默认为int类型,左移超过32位后,高位丢失问题(pr#770@Github) * 【core 】 修复beginOfWeek和endOfWeek一周开始计算错误问题(issue#I1BDPW@Gitee) +* 【db 】 修复Db.query使用命名方式查询产生的歧义(issue#776@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java b/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java index 39e06e325..8579ca239 100644 --- a/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java +++ b/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java @@ -71,6 +71,19 @@ public abstract class AbstractDb implements Serializable { */ public abstract void closeConnection(Connection conn); + /** + * 查询 + * + * @param sql 查询语句 + * @param params 参数 + * @return 结果对象 + * @throws SQLException SQL执行异常 + * @since 3.1.1 + */ + public List query(String sql, Map params) throws SQLException { + return query(sql, new EntityListHandler(), params); + } + /** * 查询 * @@ -164,7 +177,7 @@ public abstract class AbstractDb implements Serializable { * @param paramMap 参数 * @return 结果对象 * @throws SQLException SQL执行异常 - * @since 5.1.1 + * @since 5.2.2 */ public T query(String sql, RsHandler rsh, Map paramMap) throws SQLException { Connection conn = null; diff --git a/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java b/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java index 8ad2a6a9a..b1c7dcb89 100644 --- a/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java +++ b/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java @@ -2,9 +2,11 @@ package cn.hutool.db; import cn.hutool.core.collection.ArrayIter; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.db.sql.NamedSql; import cn.hutool.db.sql.SqlBuilder; import cn.hutool.db.sql.SqlLog; import cn.hutool.db.sql.SqlUtil; @@ -96,7 +98,7 @@ public class StatementUtil { * @since 3.2.3 */ public static PreparedStatement prepareStatement(Connection conn, String sql, Collection params) throws SQLException { - return prepareStatement(conn, sql, params.toArray(new Object[params.size()])); + return prepareStatement(conn, sql, params.toArray(new Object[0])); } /** @@ -111,8 +113,15 @@ public class StatementUtil { */ public static PreparedStatement prepareStatement(Connection conn, String sql, Object... params) throws SQLException { Assert.notBlank(sql, "Sql String must be not blank!"); - sql = sql.trim(); + + if(ArrayUtil.isNotEmpty(params) && 1 == params.length && params[0] instanceof Map){ + // 检查参数是否为命名方式的参数 + final NamedSql namedSql = new NamedSql(sql, Convert.toMap(String.class, Object.class, params[0])); + sql = namedSql.getSql(); + params = namedSql.getParams(); + } + SqlLog.INSTANCE.log(sql, ArrayUtil.isEmpty(params) ? null : params); PreparedStatement ps; if (StrUtil.startWithIgnoreCase(sql, "insert")) { @@ -135,7 +144,7 @@ public class StatementUtil { * @since 4.1.13 */ public static PreparedStatement prepareStatementForBatch(Connection conn, String sql, Object[]... paramsBatch) throws SQLException { - return prepareStatementForBatch(conn, sql, new ArrayIter(paramsBatch)); + return prepareStatementForBatch(conn, sql, new ArrayIter<>(paramsBatch)); } /** diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/NamedSql.java b/hutool-db/src/main/java/cn/hutool/db/sql/NamedSql.java index 107837641..e58eea699 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/NamedSql.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/NamedSql.java @@ -50,7 +50,7 @@ public class NamedSql { * @return 参数数组 */ public Object[] getParams() { - return this.params.toArray(new Object[this.params.size()]); + return this.params.toArray(new Object[0]); } /** diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java b/hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java index b0ba178fb..238c1b884 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java @@ -1,5 +1,10 @@ package cn.hutool.db.sql; +import cn.hutool.core.collection.ArrayIter; +import cn.hutool.db.DbUtil; +import cn.hutool.db.StatementUtil; +import cn.hutool.db.handler.RsHandler; + import java.sql.CallableStatement; import java.sql.Connection; import java.sql.PreparedStatement; @@ -8,11 +13,6 @@ import java.sql.SQLException; import java.sql.Statement; import java.util.Map; -import cn.hutool.core.collection.ArrayIter; -import cn.hutool.db.DbUtil; -import cn.hutool.db.StatementUtil; -import cn.hutool.db.handler.RsHandler; - /** * SQL执行器,全部为静态方法,执行查询或非查询的SQL语句
* 此方法为JDBC的简单封装,与数据库类型无关 diff --git a/hutool-db/src/test/java/cn/hutool/db/NamedSqlTest.java b/hutool-db/src/test/java/cn/hutool/db/NamedSqlTest.java index 78d01ae55..003902e42 100644 --- a/hutool-db/src/test/java/cn/hutool/db/NamedSqlTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/NamedSqlTest.java @@ -1,12 +1,13 @@ package cn.hutool.db; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - import cn.hutool.core.map.MapUtil; import cn.hutool.db.sql.NamedSql; +import org.junit.Assert; +import org.junit.Test; + +import java.sql.SQLException; +import java.util.List; +import java.util.Map; public class NamedSqlTest { @@ -36,4 +37,19 @@ public class NamedSqlTest { Assert.assertEquals("张三", namedSql.getParams()[1]); Assert.assertEquals("小豆豆", namedSql.getParams()[2]); } + + @Test + public void queryTest() throws SQLException { + Map paramMap = MapUtil + .builder("name1", (Object)"王五") + .put("age1", 18).build(); + String sql = "select * from user where name = @name1 and age = @age1"; + + List query = Db.use().query(sql, paramMap); + Assert.assertEquals(1, query.size()); + + // 采用传统方式查询是否能识别Map类型参数 + query = Db.use().query(sql, new Object[]{paramMap}); + Assert.assertEquals(1, query.size()); + } }