JDBC和PostgreSQL - 如何基于另一个int在同一行中插入int

时间:2016-02-17 10:23:47

标签: java postgresql jdbc

我正在研究我的第一个个人项目,试图学习postgresql和Java的基础知识。

我试图在数据库中生成随机生成的整数,其中45000个条目,int表示日期和时间,在插入中使用for循环。我已经设法能够自己做这个部分并搜索SX,但我遇到了一个问题。

如果您可以查看下面的代码,我想基于同一行中的前一个字段随机生成一个整数。例如,如果我的TIMEHST(表示进程开始的时间小时)随机生成为该行的8,我希望我的TIMEHED(表示进程结束的时间小时)是随机的(TIMEHST和TIMEHST + 5)之间的整数。如果下面的代码看起来像意大利面条,请原谅我,我只编写了5个月的Java和1个月的Java。

package generateSamepleDataSet;

import java.sql.*;

/**
 * Created by jkyju_000 on 2/16/2016.
 */
public class GenerateProcessSqlDatabase {
    public static void main(String args[]) {
        Connection c = null;
        Statement stmt = null;
        try {
            Class.forName("org.postgresql.Driver");
            c = DriverManager
                    .getConnection("jdbc:postgresql://localhost:5432/postgres",
                            "postgres", "adfadf12");
            c.setAutoCommit(false);
            System.out.println("Opened database successfully");

            stmt = c.createStatement();

            for (int i = 0; i < 45000; i++) {
                String sql = "INSERT INTO ARRIVALS (DATEY,DATEM,DATED,TIMEHST,TIMEMST,TIMEHED,TIMEMED) "
                        + "VALUES ( " + (2012 + (int)(Math.random() * ((2015 - 2012) + 1))) + ", " + (1 + (int)(Math.random() * ((12 - 1) + 1))) + ", " + (1 + (int)(Math.random() * ((30 - 1) + 1))) + ", " + (7 + (int)(Math.random() * ((19 - 1) + 1))) + ", " + (0 + (int)(Math.random() * ((59 - 0) + 1))) + ", "I have no idea what to put in TIMEHED", "Also have no idea what to put in TIMEMED" );";
                stmt.executeUpdate(sql);
            }

            stmt.close();
            c.commit();
            c.close();
        } catch (Exception e) {
            System.err.println( e.getClass().getName()+": "+ e.getMessage() );
            System.exit(0);
        }
        System.out.println("Records created successfully");
    }
}

1 个答案:

答案 0 :(得分:1)

首先,您需要了解prepared statements来传递参数,而不是连接值。这将使您的代码更快,更重要,更安全,更容易阅读。

您还需要将整个问题分解为多个部分,并在方法中对这些部分进行编码:

int processStart = generateRandomProcessStart();
int processEnd = processStart + generateRandomDurationBetween0And5();
preparedStatement.setInt(4, processStart);
preparedStatement.setInt(6, processEnd);