java.sql.SQLException: No value specified for parameter 1
源代码public class PrepareStatementDemo2 {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;try {Class.forName("com.mysql.jdbc.Driver");St
·
源代码
public class PrepareStatementDemo2 {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/usermanager?useSSL=false&characterEncoding=utf-8&timeZone=CST";
String username = "root";
String password = "root";
connection = DriverManager.getConnection(url, username, password);
System.out.println("连接数据库成功");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名");
String name = scanner.nextLine();
System.out.println("请选择部门 1.开发一部 2.开发二部");
int depId = scanner.nextInt();
//通过数据对象实例化命令对象
//不能用拼接方式
//String sql = "insert into manager values(NULL,'"+name+"',2)";
//正确方式:使用?占位符
//不需要判断数据的类型,不能添加"
String sql = "insert into manager values(NULL,?,?)";
//带着参数执行预编译
preparedStatement = connection.prepareStatement(sql);
//执行SQL操作, 返回影响的行数
int i = preparedStatement.executeUpdate();
System.out.println("i"+i);
} catch (ClassNotFoundException e) {
System.out.println("驱动程序不存在");
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
报错
java.sql.SQLException: No value specified for parameter 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:861)
at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2211)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2191)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2058)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)
at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)
at com.gxa.day27.PrepareStatementDemo.main(PrepareStatementDemo.java:45)
Process finished with exit code 0
分析解决
- 错误原因:没有为参数1指定值,预编译时
preparedStatement = connection.prepareStatement(sql);
,如果没有传参,则会抛出异常 - 在该行后面传参:
//传参
//根据参数类型的不同,选择不同的setXXX方法
//参数的位置:从1开始
preparedStatement.setString(1,name);
preparedStatement.setInt(2,depId);
更多推荐
已为社区贡献3条内容
所有评论(0)