在sql语句中使用java变量

时间:2012-07-05 03:20:56

标签: java sql

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

SELECT var1 FROM var2 WHERE var3=var4 

或类似的东西。

我的想法是用网页中的用户选择项填充var。我知道这可以使用Post方法在PHP中完成,但我没有使用PHP。另外,我已经阅读了Java中的Prepared Statement,但似乎只有在比较运算符之后使用时才能工作;例如:

SELECT * FROM table Where attr = ? &

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

  • Incase:我正在尝试使用HTML& amp; JSP。

5 个答案:

答案 0 :(得分:3)

您使用?进行的操作是参数化查询。该查询只能针对值而不是表或列的名称进行参数化。

每次运行查询。数据库必须创建查询计划。如果您反复运行相同的查询,则可以通过创建PreparedStatement来减少此开销。 第一次执行PreparedStatement将生成查询计划。随后的执行将重复使用相同的计划。

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

如果更改列或表名称或修改查询结构,则它是一个不同的查询,需要不同的查询计划。在这种情况下,PreparedStement没有用,您应该坚持使用您所谈论的硬编码版本。由于这个原因,如果您尝试在PreparedStement中参数化表或列名称,则会出现错误。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

例如 -

String query = "SELECT * FROM table Where attr = ?";
PreparedStatement pt = con.prepareStatement(query);
pt.setString(1, attribete);
pt.executeUpdate();

答案 3 :(得分:0)

在任何SQL打包类或其他类中都没有使用单个方法在查询字符串中替换表,列名和查询参数值。

您需要依赖PreparedStatement和任何字符串方法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

答案 4 :(得分:-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,我相信还有办法可以做。