将日期插入oracle数据库

时间:2016-10-19 20:26:02

标签: java sql oracle

我需要在我的数据库中插入日期,我有一个包含Date类型的行日期的表,但我需要插入日期而不使用preparedStatement但它不会工作。这是我的代码:

=DATE(YEAR([column]),MONTH([column])+1,0)

2 个答案:

答案 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快速和宽松地玩。