2017-07-20 144 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); 

問題是,我沒有任何關於日期和時間的想法,我應該通過什麼作爲參數?什麼樣的變量,以便查詢工作良好?我搜索了一下它得到了一些使用字符串的線索。現在我在查詢方法上使用字符串。有什麼建議?

+0

使用實際的'Date' /'Time'對象並讓JDBC驅動程序處理它 – MadProgrammer

+0

將String轉換爲日期(SimpleDateFormat)然後使用setDate –

+1

如果您使用的是Java 8,並且具有最新的JDBC驅動程序,你應該使用像'LocalDate'和'LocalTime'這樣的'java.time'對象,並使用'setObject'。 – RealSkeptic

回答

5

由於您已經說過您是java的新手,我假設您將使用Java 8並且PostgreSQL JDBC驅動程序使用JDBC 4.2爲Java 8 Date和Time API提供本機支持。

以下數據類型的日期/時間PostgreSQL支持:

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

可以使用LOCALDATE的,本地時間,LocalDateTime或OffsetDateTime(OffsetDateTime是一個日期,時間偏移例如一個不可變的表示:值「2017年7月20日10:45.24.123456789 +04:00」可以存儲在OffsetDateTime中)。這些類在Java 8中引入的java.time包中,作爲一個新的Date-Time API(它涵蓋了幾個舊的日期時間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時間。

+2

其實Joda-Time項目處於維護模式。該團隊建議轉移到Java.time類。至於Java 6和Java 7,大部分java.time功能都被移植到了* ThreeTen-Backport *項目中。 –