问题描述
我正在尝试学习 JDBC 事务,我编写了一些基本代码来测试它。但是,当我运行代码时,输出中显示了一些错误。任何人都可以帮助我为什么会发生这种情况以及如何摆脱这种情况?
这是代码:
public class JDBCTransactionExample {
private static String db_url = "jdbc:MysqL://localhost:3306/test";
private static String db_user = "root";
private static String db_password = "root";
private static final String INSERT_INTO_USER = "INSERT INTO user VALUES(?,?,?);";
private static final String UPDATE_USER = "UPDATE user SET name = ? WHERE id = ?;";
public static void main(String[] args) {
Connection conn = null;
try {
Class.forName("com.MysqL.cj.jdbc.Driver");
conn = DriverManager.getConnection(db_url,db_user,db_password);
conn.setAutoCommit(false);
try {
PreparedStatement insertStmt = conn.prepareStatement("INSERT_INTO_USER");
PreparedStatement updateStmt = conn.prepareStatement("UPDATE_USER");
// Create insert statement
insertStmt.setInt(1,4);
insertStmt.setString(2,"BBB");
insertStmt.setString(3,"bbb@gmail.com");
insertStmt.setString(4,"en");
insertStmt.setString(5,"7894");
insertStmt.executeUpdate();
// Create update statement
updateStmt.setString(1,"AAA");
updateStmt.setInt(2,4);
updateStmt.executeUpdate();
// STEP 2 - Commit insert and update statement
conn.commit();
System.out.println("Transaction is commited successfully.");
} catch (sqlException e) {
e.printstacktrace();
if (conn != null) {
try {
// STEP 3 - Roll back transaction
System.out.println("Transaction is being rolled back.");
conn.rollback();
} catch (Exception ex) {
ex.printstacktrace();
}
}
}
} catch (Exception e) {
e.printstacktrace();
}
}
}
输出如下:
java.sql.sqlException: Parameter index out of range (1 > number of parameters,which is 0).Transaction is being rolled back.
at com.MysqL.cj.jdbc.exceptions.sqlError.createsqlException(sqlError.java:129)
at com.MysqL.cj.jdbc.exceptions.sqlError.createsqlException(sqlError.java:97)
at com.MysqL.cj.jdbc.exceptions.sqlError.createsqlException(sqlError.java:89)
at com.MysqL.cj.jdbc.exceptions.sqlError.createsqlException(sqlError.java:63)
at com.MysqL.cj.jdbc.ClientPreparedStatement.checkBounds(ClientPreparedStatement.java:1372)
at com.MysqL.cj.jdbc.ClientPreparedStatement.getCoreParameterIndex(ClientPreparedStatement.java:1385)
at com.MysqL.cj.jdbc.ClientPreparedStatement.setInt(ClientPreparedStatement.java:1573)
at jdbc.transaction.JDBCTransactionExample.main(JDBCTransactionExample.java:29)
解决方法
我认为您打算在这里使用常量而不是 String
:
PreparedStatement insertStmt = conn.prepareStatement("INSERT_INTO_USER");
PreparedStatement updateStmt = conn.prepareStatement("UPDATE_USER");
应该
PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_USER);
PreparedStatement updateStmt = conn.prepareStatement(UPDATE_USER);
,
private static final String INSERT_INTO_USER = "INSERT INTO user VALUES(?,?,?);";
private static final String UPDATE_USER = "UPDATE user SET name = ? WHERE id = ?;";
看看你的字符串,符号 ;
是多余的,应该如下:
private static final String INSERT_INTO_USER = "INSERT INTO user VALUES(?,?)";
private static final String UPDATE_USER = "UPDATE user SET name = ? WHERE id = ?";
......
PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_USER);
PreparedStatement updateStmt = conn.prepareStatement(UPDATE_USER);
,
基本上这个错误与 ?在preparedStatement中(?:指的是preparedStatement的参数索引)
但是对于您的情况,您已经将 sql 查询声明为字符串,因此您不需要双引号,您只需要调用 CONST UPDATE_USER 和 UPDATE_USER !
使用: PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_USER); PreparedStatement updateStmt = conn.prepareStatement(UPDATE_USER);