2

我正在尝试构建一个网页以更好地学习 Java 和 SQL。我的问题是,Java 中有没有一种方法可以制作通用的 SQL 选择语句?例如:

SELECT var1 FROM var2 WHERE var3=var4 

或类似的东西。

var我的想法是用用户从网页中选择的项目填充s。我知道这可以在 PHP 中使用该Post方法完成,但我没有使用 PHP。另外,我读过Java中的Prepared Statement,但似乎只有在比较运算符之后使用时才有效;前任:

SELECT * FROM table Where attr = ? &

另外,我知道我可以做硬编码版本,"SELECT " + var1 + "FROM " + var2 + "WHERE attr = " + var3 + " "但这似乎不是很通用并且容易出现很多错误。

  • Incase:我正在尝试使用 HTML 和 JSP 构建这个测试页面。
4

5 回答 5

3

你正在做的?是参数化查询。查询只能为值参数化,而不是表或列的名称。

每次运行查询时。数据库必须创建一个查询计划。如果您一次又一次地运行相同的查询,您可以通过创建一个PreparedStatement. 第一次执行PreparedStatement将生成查询计划。随后的执行将重用相同的计划。

此处的相同查询意味着,除了 where 子句、表达式等中使用的值外,它在所有方面都是相同的。

如果您更改 Column 或 Table 名称或修改查询的结构,则它是一个不同的查询,需要不同的查询计划。PreparedStement 在这种情况下没有用,您应该坚持使用您谈到的硬编码版本。由于这个原因,如果您尝试在PreparedStement.

话说回来。不建议对查询采用这种通用方法。如果您的查询如此简单,您可以从 ORM 工具中受益。您甚至不必维护一行 SQL。对于复杂的查询,您可以选择使用 ORM 特定的查询语言或 JPQL 或 Native SQL。寻找 JPA + Hibernate

于 2012-07-05T04:49:02.103 回答
0

JDBC 不允许您的特定用途。创建准备好的语句时,您需要对表名进行硬编码。如果你真的想这样做,我建议你使用字符串连接来创建 SQL 语句,然后创建一个PreparedStatement带参数来处理 where 部分。如果您想知道为什么要PreparedStatements在特定的解决方案中打扰,那是为了避免 SQL 注入。

于 2012-07-05T03:35:57.313 回答
0

您可以使用它PreparedStatement来实现您的目标。

例如 -

String query = "SELECT * FROM table Where attr = ?";
PreparedStatement pt = con.prepareStatement(query);
pt.setString(1, attribete);
pt.executeUpdate();
于 2012-07-05T05:09:19.903 回答
0

在任何 SQL 打包类或其他类中都没有这样的直接规定,可以使用单一方法在查询字符串中替换表、列名以及查询参数值。

您需要同时依赖PreparedStatement任何一个 String 方法replace(...)replaceFirst(...)实现您的要求。

String sql = "Select $1, $2 from $3 where $4=? and $5=?";
sql = sql.replaceFirst( "$1", "col1_name" );
sql = sql.replaceFirst( "$2", "col2_name" );
sql = sql.replaceFirst( "$3", "table_name" );
sql = sql.replaceFirst( "$4", "col4_name" );
sql = sql.replaceFirst( "$5", "col5_name" );
// .. and so on

PreparedStatement pst = con.prepareStatement( sql );
// use relevant set methods to set the query parametrs.
pst.setXXX( 1, value_for_first_query_parameter ); // from a variable or literal
pst.setXXX( 2, value_for_second_query_parameter); // from a variable or literal
// ... and so on
于 2012-07-05T05:28:19.880 回答
-3

如果您使用的是 JDBC,可以试试这个

PreparedStatement statement = connection.prepareStatement("SELECT ? FROM ? WHERE ?=? ");

然后

statement.setString(1, "column_name");
statement.setString(2, "table_name");
statement.setString(3, "column_name");
statement.setBigDecimal(4, 123);

如果您使用的是其他 ORM,如 Hibernate 或 JPA,我相信也有办法。

于 2012-07-05T03:55:36.680 回答