Как использовать PreparedStatement с JDBC - PullRequest
0 голосов
/ 25 февраля 2020

Я новичок в JDB C и Java.

Я пришел из Javascript и фона Typescript. Я решил изучить JDB C на Oracle, создав небольшой базовый проект c.

Я использую 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.

1 Ответ

5 голосов
/ 25 февраля 2020

Вы создаете PreparedStatement, но не используете его.

Готовый оператор существует, например, для вставки различных значений в таблицу несколько раз.

Вы создаете PreparedStatement один раз, как если бы вы выполняли обычный оператор и включали ? вместо значений, которые отличаются.

Если вы хотите выполнить его, вы должны установить значения (? s будет заменено на их) с помощью методов 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() method.

PreparedStatement (и объект Connection) следует закрывать, когда он вам больше не нужен.

Также как @ TT. предлагает в комментариях, вы должны указать столбцы в INSERT утверждении. Это было бы что-то вроде

INSERT INTO mybranches (name,createdFrom,pulledFrom) VALUES (?,?,?)
...