java - 如何将PreparedStatement与 JDBC 结合使用

标签 java jdbc

我是 JDBC 和 Java 新手。

我有 Javascript 和 Typescript 背景。我决定通过创建一个小型基本项目来学习 Oracle 的 JDBC。

我正在使用JDK 8。我正在关注这个学习 Material :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 进行了交叉检查。

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

最佳答案

您创建了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 (?,?,?)

关于java - 如何将PreparedStatement与 JDBC 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60388186/

相关文章:

java - 在java中避免SQL注入(inject)

java - 错误: malformed record literal: - JDBC insert data with self defined type array

java - 使用 Formatter Java 格式化字符串类型的日期

java - Android 应用程序在闪屏显示致命异常 : main 后崩溃

java - 这是一个好的多线程服务器设计吗?

java - 首选免费项目管理+SCM工具组合

java - Eclipse ECJ 接受此代码,javac 不接受 - 谁是对的?

java - 如何使用Install4j打包MySQL Install4j是否具有创建也可以安装MYSQL的安装程序的功能

java - 带有尝试资源的 JDBC

sql-server - HTTP 状态 500 - 此驱动程序不支持 Java 运行时环境 (JRE) 版本 1.7