Java 将日期插入数据库Postgres JDBC

Java 将日期插入数据库Postgres JDBC,java,postgresql,jdbc,Java,Postgresql,Jdbc,我对Java和Postgres都是新手 我有一个关于餐厅的小项目,我有一张struk(英文:bill)桌子,像这样: public int insertBill(int id_karyawan, String tanggal, String waktu, int total) { String SQL = "INSERT INTO struk(kode, id_karyawan, tanggal, waktu, total) VALUES (?,?,?,?,?)"; int id

我对Java和Postgres都是新手

我有一个关于餐厅的小项目,我有一张struk(英文:bill)桌子,像这样:

public int insertBill(int id_karyawan, String tanggal, String waktu, int total) {
    String SQL = "INSERT INTO struk(kode, id_karyawan, tanggal, waktu, total) VALUES (?,?,?,?,?)";
    int id = 0;

    try(Connection conn = connect(); PreparedStatement pstmt = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS)) {
        pstmt.setInt(1, 1);
        pstmt.setInt(2, id_karyawan);
        pstmt.setString(3, tanggal);
        pstmt.setString(4, waktu);
        pstmt.setInt(5, total);

        int affectedRows = pstmt.executeUpdate();
        if(affectedRows > 0) {
            try(ResultSet rs = pstmt.getGeneratedKeys()) {
                if(rs.next()) {
                    id = rs.getInt(1);
                }
            } catch (SQLException ex) {
                System.out.println(ex.getMessage());
            }
        }
    } catch (SQLException ex) {
        System.out.println(ex.getMessage());
    }
    return id;
}

我有一种方法可以像这样将信息插入表中:

public int insertBill(int id_karyawan, String tanggal, String waktu, int total) {
    String SQL = "INSERT INTO struk(kode, id_karyawan, tanggal, waktu, total) VALUES (?,?,?,?,?)";
    int id = 0;

    try(Connection conn = connect(); PreparedStatement pstmt = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS)) {
        pstmt.setInt(1, 1);
        pstmt.setInt(2, id_karyawan);
        pstmt.setString(3, tanggal);
        pstmt.setString(4, waktu);
        pstmt.setInt(5, total);

        int affectedRows = pstmt.executeUpdate();
        if(affectedRows > 0) {
            try(ResultSet rs = pstmt.getGeneratedKeys()) {
                if(rs.next()) {
                    id = rs.getInt(1);
                }
            } catch (SQLException ex) {
                System.out.println(ex.getMessage());
            }
        }
    } catch (SQLException ex) {
        System.out.println(ex.getMessage());
    }
    return id;
}
稍后,将使用以下命令调用该方法:

int billID = app.insertBill(1, "2017-09-24", "08:00:00", 150000);

问题是,我不知道日期和时间,我应该传递什么作为参数?什么样的变量才能使查询正常工作?我已经搜索过了,找到了一些使用字符串的线索。现在我在查询方法中使用字符串。有什么建议吗?

既然您说您是java新手,我假设您将使用java 8,PostgreSQL JDBC驱动程序使用JDBC 4.2为java 8日期和时间API提供本机支持

PostgreSQL支持以下日期/时间数据类型:

日期
时间[无时区]
时间戳[无时区]
带时区的时间戳

您可以使用LocalDate、LocalTime、LocalDateTime或OffsetDateTime(OffsetDateTime是具有偏移量的日期时间的不可变表示形式,例如:值“2017年7月20日10:45.24.123456789+04:00”可以存储在OffsetDateTime中)。这些类出现在java 8中引入的java.time包中,作为一种新的日期时间API(它涵盖了旧日期时间API的几个缺点,如设计问题、线程安全、时区处理问题等)。但是,PostgreSQl目前不支持ZonedDateTime、Instant和OffsetTime/time[无时区](如JDBC 4.2)。现在,根据您的代码编写部分,您可以这样做

public int insertBill(int id_karyawan, String tanggal, String waktu, int total) {

LocalDate localDate = LocalDate.now(); //or whatever date you want to use, for passing parameter as string you could use 

                        /*public static LocalDate parse(CharSequence text,
                          DateTimeFormatter formatter)*/

 //   LocalDate ld = LocalDate.of(2017, Month.JULY, 20);
 LocalTime lt = LocalTime.of(8, 0, 0); 

String SQL = "INSERT INTO struk(kode, id_karyawan, tanggal, waktu, total) VALUES (?,?,?,?,?)";
int id = 0;

try(Connection conn = connect(); PreparedStatement pstmt = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS)) {
pstmt.setInt(1, 1);
pstmt.setInt(2, id_karyawan);
pstmt.setObject(3, localDate);
pstmt.setObject(4, lt);
pstmt.setInt(5, total);

pstmt.executeUpdate(); 
pstmt.close();


希望这对你有帮助。如果您使用的是低于8的Java版本,您可以使用joda time。

希望这能帮助您:

public int insertBill(int id_karyawan, String tanggal, String waktu, int total) {
String SQL = "INSERT INTO struk(kode, id_karyawan, tanggal, waktu, total) VALUES (?,?,?,?,?)";
int id = 0;

try(Connection conn = connect(); PreparedStatement pstmt = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS)) {
    pstmt.setInt(1, 1);
    pstmt.setInt(2, id_karyawan);
    pstmt.setDate(3, java.sql.Date.valueof("2017-09-24")); 
    pstmt.setTime(4, java.sql.Time.valueof("08:00:00")); 
    pstmt.setInt(5, total);

    int affectedRows = pstmt.executeUpdate();
    if(affectedRows > 0) {
        try(ResultSet rs = pstmt.getGeneratedKeys()) {
            if(rs.next()) {
                id = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }
} catch (SQLException ex) {
    System.out.println(ex.getMessage());
}
return id;

}

使用一个实际的
Date
/
Time
对象,让JDBC驱动程序处理它,将字符串转换为日期(SimpleDataFormat),然后使用setDate如果您使用的是Java 8,并且您有最新的JDBC驱动程序,那么您应该使用
Java.Time
对象,如
LocalDate
LocalTime
,然后使用
setObject
。你们为什么不把这个写下来作为答案呢?我认为注释是用来提问的。使用
pstmt.setTime(4,…)
和pstmt.setDate(3,…)`并使用适当的
java.sql.Date
java.sql.Time
值实际上Joda Time项目处于维护模式。团队建议迁移到Java.time类。对于Java6和Java7,大部分Java.time功能都在ThreeTen Backport项目中进行了后端口。