Java 将日期插入数据库Postgres JDBC
我对Java和Postgres都是新手 我有一个关于餐厅的小项目,我有一张struk(英文:bill)桌子,像这样: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
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项目中进行了后端口。