我需要在我的数据库中插入日期,我有一个包含Date类型的行日期的表,但我需要插入日期而不使用preparedStatement但它不会工作。这是我的代码:
=DATE(YEAR([column]),MONTH([column])+1,0)
答案 0 :(得分:2)
正确的方法:
在等待用户输入时,不要保持数据库连接。首先收集输入,然后连接到数据库 原因:如果用户速度慢,连接可能会超时。
使用try-with-resources清理JDBC资源 原因:保证清理,更好的错误处理,更清晰的代码。
使用PreparedStatement
。切勿将字符串连接与用户提供的文本一起使用来构建SQL语句,因为这会使您的代码容易崩溃,但更重要的是容易受到SQL Injection攻击,允许黑客窃取您的数据并删除您的表强>
由于您需要收集多组值,因此请创建一个用于保留这些值的类。
public class Invoice {
private final String invoiceNumber;
private final String customerName;
private final Date invoiceDate;
public Invoice(String invoiceNumber, String customerName, Date invoiceDate) {
this.invoiceNumber = invoiceNumber;
this.customerName = customerName;
this.invoiceDate = invoiceDate;
}
public String getInvoiceNumber() {
return this.invoiceNumber;
}
public String getCustomerName() {
return this.customerName;
}
public Date getInvoiceDate() {
return this.invoiceDate;
}
}
// Prompt user for two invoices
List<Invoice> invoices = new ArrayList<>();
for (int i = 1; i < 3; i++) {
String invoiceNumber = JOptionPane.showInputDialog("Invoice Number:");
String customerName = JOptionPane.showInputDialog("Customer Name:");
invoices.add(new Invoice(invoiceNumber, customerName, new Date()));
}
// Insert invoices
try (Connection dbConnection = DriverManager.getConnection(DR_URL, DB_USER, DB_PASSWORD)) {
String sql = "INSERT INTO INVOICEMAIN VALUES (?,?,?)";
try (PreparedStatement stmt = dbConnection.prepareStatement(sql)) {
for (Invoice invoice : invoices) {
stmt.setString(1, invoice.getInvoiceNumber());
stmt.setString(2, invoice.getCustomerName());
stmt.setDate (3, new java.sql.Date(invoice.getInvoiceDate().getTime()));
stmt.addBatch();
}
stmt.executeBatch();
}
}
答案 1 :(得分:0)
如果您只是插入当前日期,则可以使用Oracle的SYSDATE函数:
stmt.executeUpdate("INSERT INTO INVOICEMAIN VALUES ('" + invoiceNumber + "','" + customerName + "',SYSDATE)");
使用SYSDATE函数还可以防止与日期相关的问题,具体取决于代码执行的位置(客户端计算机与中间层或数据库层服务器)。
但是,我同意@Andreas,在构建SQL语句时,应避免用户输入值的字符串连接。那当然除非你喜欢用little Bobby Tables快速和宽松地玩。