如何在JDBC中使用PreparedStatement

问题描述 投票:0回答:1

我是JDBC和Java的新手。

我来自Javascript和Typescript背景。我决定通过创建一个小的基础项目来与Oracle一起学习JDBC。

我正在使用JDK 8。我正在关注这份学习资料:TutorialsPoint-PreparedStatement。我发现问题出在我的DataService

这是我的DataService类:

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DataService {
    Connection con;
    PreparedStatement pstmt;

    static String branch_name="";
    static LocalDate branch_created_on;
    static String branch_pulled_from="";

    DataService() {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","system","scott");
        }
        catch(Exception e){ 
            System.out.println(e);
        }
    }

    public void getValue() {
        branch_name=AddNewBranchRecord.branchNameTextField.getText();
        branch_created_on=AddNewBranchRecord.datePicker1.getValue();
        branch_pulled_from=(String) AddNewBranchRecord.combo_box_1.getValue();
    }

    public void putValue() {
        System.out.println("Branch name: "+branch_name);
        System.out.println("Branch created on: "+branch_created_on);
        System.out.println("Branch pulled from: "+branch_pulled_from);
    }

    public void insertRecord() {
        System.out.println("Adding a record...");
        getValue();
        try {
            String sql;
            sql = "insert into mybranches values (branch_name, branch_created_on, branch_pulled_from);";
            pstmt = con.prepareStatement(sql);
        } catch (SQLException ex) {
            Logger.getLogger(DataService.class.getName()).log(Level.SEVERE, null, ex);
        }
        pstmt .close();
    }
}

我确定有些东西我错过了。

我没有收到任何错误或异常,但没有在数据库中插入任何行。

我与select * from mybranches进行了交叉核对。

但是,如果我使用普通的Statement,则相同的代码可以完美地工作。

java jdbc
1个回答
4
投票

您创建了PreparedStatement,但没有使用它。

例如,有准备好的陈述。多次将不同的值插入表中。

一次创建PreparedStatement就像执行普通语句一样,并包含?而不是不同的值。

如果要执行它,则必须使用?方法设置值(setXXX(int,Type)将替换为它们,然后使用.execute()执行它。

如问题注释中所指出,SQL代码无效。 sql代码准备语句类似于常规语句的sql代码,但始终更改的值将替换为?

准备好的语句的SQL代码将是这样的:

INSERT INTO mybranches VALUES (?,?,?)

如果要使用PreparedStatement,则可以这样设置值:

pstmt.setString(1,branch_name);
pstmt.setObject(2,branch_created_from);
pstmt.setString(3,branch_pulled_from);

最后,用]执行>

pstmt.execute();

[请注意,(正如我已经说过的那样)您应该创建一次PreparedStatement,而不是每次执行insertRecord()方法时都要创建,在该方法中,您应该只调用setXXX方法和execute()方法。

PreparedStatement(和Connection对象)在不再需要时应关闭。

此外,如@ TT.在注释中所建议,您应在INSERT语句中指定列。就像

INSERT INTO mybranches (name,createdFrom,pulledFrom) VALUES (?,?,?)
© www.soinside.com 2019 - 2024. All rights reserved.