我是 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/