JDBC PreparedStatement - 使用相同的参数,可能吗?

2022-09-04 21:44:45

我正在使用“插入或更新”查询,如下所示:

        String sql = 
            "INSERT INTO servlets (path, applicationId, startTime, numOfRequests, totalResponseTime, totalBytes)" +
            "VALUES (?, ?, NOW(), 1, ?, ?)" +
            "ON DUPLICATE KEY UPDATE numOfRequests = numOfRequests + 1, " +
            "totalResponseTime = totalResponseTime + ?, totalBytes = totalBytes + ?";

我正在使用准备好的语句,并按以下方式用相关参数填充它:

        statement = connection.prepareStatement(sql);
        statement.setString(1, i_ServletModel.GetPath());
        statement.setInt(2, i_ServletModel.GetApplicationId());
        statement.setLong(3, i_RequestStats.GetResponseTime());
        statement.setLong(4, i_RequestStats.GetBytes());
        statement.setLong(5, i_RequestStats.GetResponseTime());
        statement.setLong(6, i_RequestStats.GetBytes());

请注意,参数 3 与参数 5 完全相同,参数 4 与参数 6 完全相同,因为它们在上面的查询中需要相同的值。

在查询或参数填充方法中,我有什么可以更改的,以避免这种“丑陋”的语法吗?


答案 1

使用局部变量,可以使代码不那么丑陋和容易出错。但是它不支持命名参数的缺点仍然存在。同一参数将再次出现多行。JDBC

    statement = connection.prepareStatement(sql);

    long time = i_RequestStats.GetResponseTime();
    long bytes = i_RequestStats.GetBytes();

    statement.setString(1, i_ServletModel.GetPath());
    statement.setInt(2, i_ServletModel.GetApplicationId());
    statement.setLong(3,time);
    statement.setLong(4, bytes);
    statement.setLong(5, time);
    statement.setLong(6, bytes);

答案 2

您不能更改SQL语法以引用您已经声明的“VALUES”吗?如下所示:

String sql = 
        "INSERT INTO servlets (path, applicationId, startTime, numOfRequests, totalResponseTime, totalBytes)" +
        "VALUES (?, ?, NOW(), 1, ?, ?)" +
        "ON DUPLICATE KEY UPDATE numOfRequests = numOfRequests + 1, " +
        "totalResponseTime = totalResponseTime + VALUES(5), totalBytes = totalBytes + VALUES(6)";

...这样,您只需将每个参数添加一次。


推荐