如何为 PreparedStatements 重写 SQL 语句?
How to rewrite SQL statements for PreparedStatements?
我想将下面的 SQL 语句重写为动态 PreparedStatement
java:
UPDATE table SET field='C' WHERE id=3;
INSERT INTO table (id, field)
SELECT 3, 'C'
WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=3);
特别是我不知道如何将 SELECT 3, 'C'
行重写为动态语句。
UPDATE table SET name=:name WHERE id=:id
INSERT INTO table (id, name)
SELECT 3, 'C' <-- how could I rewrite these values to take the dynamic values from PreparedStatement?
WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=3);
我的对象,相似:
@Entity
public class MyEntity {
long id, String name;
}
你会做:
SELECT ?, ?
然后使用生成的 PreparedStatement
对象,您将绑定参数:
myPreparedStatement.setLong(1, 3); //The first ? found
myPreparedStatement.setString(2, "C");
当您执行循环或使用通过方法传递给您的变量时,这比您在代码中已经知道的常量(以防出现这种情况)更有优势
您必须在两个语句中执行此操作:
PreparedStatement update = connection.prepareStatement(
"UPDATE table SET field=? WHERE id=?");
PreparedSTatement insert = connection.prepareStatement(
"INSERT INTO table (id, field) \n" +
" SELECT ?, ? \n" +
" WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=?)";
update.setString(1, "C");
update.setInt(2, 3);
update.executeUpdate();
insert.setInt(1, 3);
insert.setString(2, "C");
insert.setInt(3, 3);
insert.executeUpdate();
connection.commit();
编辑 我忘记了 Postgres 允许在一个 PreparedStatement
:
中包含多个 SQL 语句
PreparedStatement stmt = connection.prepareStatement(
"UPDATE table SET field=? WHERE id=?;\n" +
"INSERT INTO table (id, field) \n" +
" SELECT ?, ? \n" +
" WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=?)";
stmt.setString(1, "C");
stmt.setInt(2, 3);
stmt.setInt(3, 3);
stmt.setString(4, "C");
stmt.setInt(5, 3);
stmt.executeUpdate();
connection.commit();
Edit2 我能想到的唯一方法是你只指定值 一次 是这样的:
String sql =
"with data (id, col1) as ( \n" +
" values (?, ?) \n" +
"), updated as ( \n" +
" \n" +
" UPDATE foo \n" +
" SET field = (select col1 from data) \n" +
" WHERE id = (select id from data) \n" +
") \n" +
"insert into foo \n" +
"select id, col1 \n" +
"from data \n" +
"where not exists (select 1 \n" +
" from foo \n" +
" where id = (select id from data))";
pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, 3);
pstmt.setString(2, "C");
pstmt.executeUpdate();
我想将下面的 SQL 语句重写为动态 PreparedStatement
java:
UPDATE table SET field='C' WHERE id=3;
INSERT INTO table (id, field)
SELECT 3, 'C'
WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=3);
特别是我不知道如何将 SELECT 3, 'C'
行重写为动态语句。
UPDATE table SET name=:name WHERE id=:id
INSERT INTO table (id, name)
SELECT 3, 'C' <-- how could I rewrite these values to take the dynamic values from PreparedStatement?
WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=3);
我的对象,相似:
@Entity
public class MyEntity {
long id, String name;
}
你会做:
SELECT ?, ?
然后使用生成的 PreparedStatement
对象,您将绑定参数:
myPreparedStatement.setLong(1, 3); //The first ? found
myPreparedStatement.setString(2, "C");
当您执行循环或使用通过方法传递给您的变量时,这比您在代码中已经知道的常量(以防出现这种情况)更有优势
您必须在两个语句中执行此操作:
PreparedStatement update = connection.prepareStatement(
"UPDATE table SET field=? WHERE id=?");
PreparedSTatement insert = connection.prepareStatement(
"INSERT INTO table (id, field) \n" +
" SELECT ?, ? \n" +
" WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=?)";
update.setString(1, "C");
update.setInt(2, 3);
update.executeUpdate();
insert.setInt(1, 3);
insert.setString(2, "C");
insert.setInt(3, 3);
insert.executeUpdate();
connection.commit();
编辑 我忘记了 Postgres 允许在一个 PreparedStatement
:
PreparedStatement stmt = connection.prepareStatement(
"UPDATE table SET field=? WHERE id=?;\n" +
"INSERT INTO table (id, field) \n" +
" SELECT ?, ? \n" +
" WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=?)";
stmt.setString(1, "C");
stmt.setInt(2, 3);
stmt.setInt(3, 3);
stmt.setString(4, "C");
stmt.setInt(5, 3);
stmt.executeUpdate();
connection.commit();
Edit2 我能想到的唯一方法是你只指定值 一次 是这样的:
String sql =
"with data (id, col1) as ( \n" +
" values (?, ?) \n" +
"), updated as ( \n" +
" \n" +
" UPDATE foo \n" +
" SET field = (select col1 from data) \n" +
" WHERE id = (select id from data) \n" +
") \n" +
"insert into foo \n" +
"select id, col1 \n" +
"from data \n" +
"where not exists (select 1 \n" +
" from foo \n" +
" where id = (select id from data))";
pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, 3);
pstmt.setString(2, "C");
pstmt.executeUpdate();