PreparedStatement,使用一个参数表示多个“?”

时间:2018-10-24 10:36:05

标签: java jdbc prepared-statement

我有一个插入(如果不存在)查询,如下所示。

BEGIN
    IF NOT EXISTS (SELECT * FROM tbl_sampleTable WHERE name = ? or subject = ?)
    BEGIN
        INSERT INTO tbl_sampleTable VALUES (?,?)
    END
END

我正在使用JDBC PreparedStatement如下执行上述查询

    pst.setString(1, name);
    pst.setString(2, subject);
    pst.setString(3, subject);
    pst.setString(4, name);
    pst.executeUpdate();

我将这些名称和主题作为方法参数,无论如何我可以为多个“?”提供值吗?具有相同的参数,而不是每次提及两次。

编辑:如果相关,我不会使用spring或任何其他框架。

4 个答案:

答案 0 :(得分:2)

JDBC不支持命名参数,但是Spring JDBC通过NamedParameterJdbcTemplate

提供了此功能。

答案 1 :(得分:2)

在这种情况下,您可能会使用SQL变量。这不是一般的解决方案。 而且,许多SQL供应商特定的变体也知道这种“不存在时插入”构造,不需要这种古旧的代码。

BEGIN
    DECLARE @MyName varchar(100);
    DECLARE @MySubject varchar(100);
    SET @MyName = ?;
    SET @MySubject = ?;
    IF NOT EXISTS (SELECT * FROM tbl_sampleTable WHERE name = @MyName OR subject = @MySubject)
    BEGIN
        INSERT INTO tbl_sampleTable(subject, name) VALUES (@MySubject, @MyName)
    END
END

答案 2 :(得分:0)

您需要添加一些包装,而无需使用Spring(NamedParameterJdbcTemplate),您可以尝试使用其他 HTTP-RPC framework

  

HTTP-RPC框架提供的org.httprpc.sql.Parameters类为JDBC提供了命名参数支持。此类的parse()方法用于从类似JPA的SQL查询中创建Parameters实例;例如:

SELECT * FROM user WHERE first_name LIKE :pattern or last_name LIKE :pattern
     

它需要一个包含查询文本作为参数的字符串或阅读器:

 Parameters parameters = Parameters.parse(sqlReader);
     

Parameters类的getSQL()方法以标准JDBC语法返回已处理的查询。此值可用于对Connection#prepareStatement()的调用:

PreparedStatement statement = connection.prepareStatement(parameters.getSQL());
     

参数值通过put()方法指定:

parameters.put("pattern", pattern);
     

这些值通过apply()方法应用于语句:

     

parameters.apply(statement);

答案 3 :(得分:0)

在这种情况下,usefull技巧是声明变量。

您只需将值绑定到变量一次,就可以在PL / SQL块中多次使用它们。

DECLARE
  l_name tbl_sampleTable.name%TYPE := ?;
  l_subject tbl_sampleTable.subject%TYPE := ?;
BEGIN
    IF NOT EXISTS (SELECT * FROM tbl_sampleTable WHERE name = l_name  or subject = l_subject )
    BEGIN
        INSERT INTO tbl_sampleTable (name,subject)
        VALUES (l_name ,l_subject )
    END
END