我是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
,则相同的代码可以完美地工作。
您创建了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 (?,?,?)