preparedStatement优化statement所出现的问题

1、了解其中的用法

代码(以及是和前文一样的表)

/**
 * TODO:防止注入攻击,演示preparedStatement的使用
 */
​
public class preparedStatementLogin {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1、获取用户输入信息
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入账号:");
        String account= scanner.nextLine();
        System.out.println("请输入密码:");
        String password= scanner.nextLine();
​
        //preparedStatement的数据库使用流程
​
        //2、注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //3、建立连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_study", "root", "mysql");
​
        /**
         * preparedStatement
         *      1、编写SQL语句结果  不包含动态值部分的语句,动态值部分使用占位符 ? 替代  注意:? 只能替代动态值
         *      2、创建preparedStatement,并且传入动态值
         *      3、动态值 占位符 赋值 ? 单独赋值即可
         *      4、发送SQL语句即可,并获取返回结果
         */
        //4、创建SQL语句
        String sql="select * from t_user where account = ? and password = ?;";
        //5、创建预编译的preparedStatement对象,并设置SQL语句结果
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //6、单独的占位符进行赋值
        /**
         * 参数1:index 占位符的位置,从左往右数,从1开始  账号 ? 1
         * 参数2:object 占位符位置 可以设置如何类型的数据,避免了我们拼接和类型更加丰富
         */
        preparedStatement.setObject(1,account);
        preparedStatement.setObject(2,password);
​
        //7、发送SQL语句,并获取返回结果
        //括号里无需再输入sql,因为它已经知道语句,以及语句动态值,自动拼接好了
        ResultSet resultSet = preparedStatement.executeQuery();
        //8、结果集解析(判断是否登录成功)
//        while(resultSet.next()){
//            int id = resultSet.getInt("id");
//            String account1 = resultSet.getString("account");
//            String password1 = resultSet.getString("password");
//            String nickname = resultSet.getString("nickname");
//            System.out.println("["+id+"]---["+account1+"]---["+password1+"]---["+nickname+"]");
//        }
        if(resultSet.next()){
            System.out.println("登录成功!");
        }else {
            System.out.println("登录失败!");
        }
        //9、关闭资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}

2、其中的重点:

2.1、sql语句的编写,占位符的作用,以及给占位符赋值

 /* preparedStatement
         *      1、编写SQL语句结果  不包含动态值部分的语句,动态值部分使用占位符 ? 替代  注意:? 只能替代动态值
         *      2、创建preparedStatement,并且传入动态值
         *      3、动态值 占位符 赋值 ? 单独赋值即可
         *      4、发送SQL语句即可,并获取返回结果
         */
        //创建SQL语句
        String sql="select * from t_user where account = ? and password = ?;";
        //创建预编译的preparedStatement对象,并设置SQL语句结果
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //单独的占位符进行赋值
        /**
         * 参数1:index 占位符的位置,从左往右数,从1开始  账号 ? 1
         * 参数2:object 占位符位置 可以设置如何类型的数据,避免了我们拼接和类型更加丰富
         */
        preparedStatement.setObject(1,account);
        preparedStatement.setObject(2,password);

2.2、关于preparedStatement.executeQuery( )内为何不用再写sql

//括号里无需再输入sql
ResultSet resultSet = preparedStatement.executeQuery();
PreparedStatement.executeQuery() 方法在创建 PreparedStatement 实例时就已经将 SQL 语句传递给了实例并进行了预编译(也就是将 SQL 语句转化为可执行的格式),因此在调用 PreparedStatement.executeQuery() 方法时无需再次传递 SQL 语句。

在 JDBC 中使用 Statement 执行 SQL语句的方法是 statement.executeQuery(sql) 或 statement.executeUpdate(sql)(其中 sql 参数表示要执行的 SQL 语句),这两个方法都会直接执行传入的 SQL 语句。

相比之下,PreparedStatement.executeQuery() 方法在创建 PreparedStatement 实例时就已经将 SQL 语句传递给了实例并进行了预编译(也就是将 SQL 语句转化为可执行的格式),因此在调用 PreparedStatement.executeQuery() 方法时无需再次传递 SQL 语句。

简单来说,Statement.executeQuery(sql) 在执行 SQL 语句前需要显式地传递 SQL 语句,而 PreparedStatement.executeQuery() 在创建 PreparedStatement 实例时就已经完成了预编译并将 SQL 语句传递给了实例。因此这里需要使用 SQL 语句作为参数来访问数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值