2017-07-20 215 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 *项目中。 –