源代码

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. 错误原因:没有为参数1指定值,预编译时preparedStatement = connection.prepareStatement(sql);,如果没有传参,则会抛出异常
  2. 在该行后面传参:
//传参
//根据参数类型的不同,选择不同的setXXX方法
//参数的位置:从1开始
preparedStatement.setString(1,name);
preparedStatement.setInt(2,depId);
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐