gpt4 book ai didi

java - 创建一个通用的PreparedStatement方法来检查表中是否存在值

转载 作者:行者123 更新时间:2023-11-30 05:54:49 32 4
gpt4 key购买 nike

我想创建一个通用的PreparedStatement方法。我有任何原始数据类型的多个值,以及一个特定查询 (SELECT COUNT(1) FROM TABLE WHERE COlUMN = ?) 或什至具有相同查询的 2 个或多个值 (SELECT COUNT(1) FROM TABLE WHERE COLUMN = ? AND COLUMN1 = ?) 来了解它是否确实存在,这些查询甚至可以来自任何连接/数据库。

我现在遇到的问题是,对于每个值/查询,我必须创建一个新方法,并且我想创建一个唯一/最少的方法来检查这一点。

Examples:
Check if 1, does exist in SELECT COUNT(1) FROM TABLE1, in database1
Check if "Hey", does exist SELECT COUNT(1) FROM TABLE1 in database1
Check if "Hey" and 2, does exist SELECT COUNT(1) FROM TABLE2 in database1
Check if "TEST-001-TEST", does exist SELECT COUNT(1) FROM TABLE1 in database2

Or Basically:
Check if any primitive data type, and any number values does exist in an specific query, in any connection/DB using PreparedStatement
...

最佳答案

首先,让我强调一下,我认为您应该为此使用一些经过测试的库。构建动态 SQL 是有风险的,如果您根据用户提供的数据构建 SQL,您可能很容易遭受 SQL 注入(inject)。

answer Elliot Frisch 链接到的包含不错的选择。

现在,这些查询构建器在幕后所做的实际上是根据您提供的数据构建 SQL 字符串。当然,您自己也可以这样做。基本上,您构建一个采用表名称、列名称列表和值列表的方法。

然后构建 SQL 字符串

StringBuilder sql = new StringBuilder();
sql.Append("SELECT 1 FROM ");
sql.Append(QuoteTableName(tableName));
sql.Append(" WHERE ");
bool firstCol = true;
for(String col: columns) {
if(firstCol) {
firstCol = false;
} else {
sql.Append(" AND ");
}
sql.Append(QuoteColumnName(col));
sql.Append(" = ?");
}

现在您可以创建准备好的语句并绑定(bind)参数值。PreparedStatement.setObject 在大多数情况下对于大多数原始值都可以正常工作。如果您在类型转换时遇到问题,可以为 SQLType 添加单独的参数。

PreparedStatement stmt = connection.prepareStatement(sql.toString());
for(int i = 0; i < values.length; ++i) {
Object val = values[i];
stmt.setObject(i+1, val);
}

这里棘手的部分是引用表名和列名。这会因数据库而异,据我了解,JDBC 中没有万无一失的方法。如果有人能纠正我这一点,我会很高兴。

关于java - 创建一个通用的PreparedStatement方法来检查表中是否存在值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53355697/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com