我正在尝试构建一个网页,以便更好地学习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 + " "
的硬编码版本,但这似乎不是非常通用的,并且容易出现很多错误。
答案 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,我相信还有办法可以做。