【问题标题】:Insert Date Into Database Postgres JDBC将日期插入数据库 Postgres JDBC
【发布时间】:2017-07-20 06:30:30
【问题描述】:

我是 Java 新手,也是 Postgres 新手。

我有一个关于餐厅的小项目,我有一张这样的 struk(eng: 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;
}

稍后,该方法将通过以下方式调用:

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

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

【问题讨论】:

  • 使用一个实际的Date/Time 对象并让JDBC驱动处理它
  • 将字符串转换为日期(SimpleDateFormat)然后使用setDate
  • 如果您使用的是 Java 8,并且拥有最新的 JDBC 驱动程序,则应使用 java.time 对象,例如 LocalDateLocalTime,并使用 setObject。跨度>
  • 你们为什么不把这个写成答案呢?我认为 cmets 是用来提问的。
  • 使用 pstmt.setTime(4, ...) 和 pstmt.setDate(3, ...)` 并使用正确的 java.sql.Datejava.sql.Time

标签: java postgresql jdbc


【解决方案1】:

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

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

DATE
TIME [ WITHOUT TIMEZONE ]
TIMESTAMP [ WITHOUT TIMEZONE ]
TIMESTAMP WITH TIMEZONE

您可以使用 LocalDate、LocalTime、LocalDateTime 或 OffsetDateTime(OffsetDateTime 是具有偏移量的日期时间的不可变表示,例如:可以存储值“2017 年 7 月 20 日 10:45.24.123456789 +04:00”在 OffsetDateTime 中)。这些类作为新的日期时间 API 出现在 Java 8 中引入的 java.time 包中。(它涵盖了旧日期时间 API 的几个缺点,如设计问题、线程安全、时区处理问题等)但是,PostgreSQl 目前不支持 ZonedDateTime、Instant 和 OffsetTime / TIME [ WITHOUT TIMEZONE ](如在 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();

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

【讨论】:

  • 实际上 Joda-Time 项目处于维护模式。该团队建议迁移到 Java.time 类。至于 Java 6 和 Java 7,大部分 java.time 功能都在 ThreeTen-Backport 项目中向后移植。
【解决方案2】:

希望对您有所帮助:

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;

}

【讨论】:

    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2016-04-22
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多