2017-07-20 4 views
2

私はJavaとPostgresを初めて使い慣れました。 データベースPostgresに日付を挿入するJDBC

私がレストランについて少しプロジェクトを持っていると私はstrukを持っている(ENG:法案)は、このようなテーブル:

enter image description here

と私はこのような、そのテーブルに情報を挿入する方法があります:

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); 

問題は、私は日時については何も知りません。何をパラメータとして渡すべきですか?クエリがうまくいくようにどのような変数がありますか?私はそれが文字列を使用するいくつかの手掛かりを持っていることを探しました。私は現在、クエリメソッドでstringを使用しています。何かアドバイス?

+0

実際の 'Date' /' Time'オブジェクトを使用して、JDBCドライバに処理させます – MadProgrammer

+0

文字列をDate(SimpleDateFormat)に変換してからsetDateを使用します –

+1

Java 8で最新のJDBCドライバ'LocalDate'や' LocalTime'のような 'java.time'オブジェクトを使い、' setObject'を使うべきです。 – RealSkeptic

答えて

5

あなたはあなたがJavaの初心者だと言いましたので、私はあなたがJava 8を使用していると想定しています。PostgreSQL JDBCドライバは、JDBC 4.2を使用するJava 8 Date and Time 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に格納できます)。これらのクラスは、新しいDate-Time APIとしてJava 8で導入されたjava.timeパッケージに含まれています(設計上の問題、スレッドの安全性、タイムゾーン処理の問題などの古い日時APIのいくつかの欠点をカバーしています)ただし、ZonedDateTime、Instant、OffsetTime/TIME [WITHOUT TIMEZONE]は現在PostgreSQl(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時間を使用できます。

+2

実際、Joda-Timeプロジェクトはメンテナンスモードです。チームはJava.timeクラスへの移行を勧告しています。 Java 6とJava 7では、* ThreeTen-Backport *プロジェクトでjava.timeの機能の多くがバックポートされています。 –

関連する問題