JDBC3 - 优化SQL语句

SQL语句优化 statement --> preparedStatement

SQL语句的拼接受限,对于①多条语句②复杂类型无法实现操作,且易受③注入攻击

statement

只适合静态SQL语句,动态SQL语句的实现易受注入攻击

preparedStatement

提前知道语句结构可以避免受到注入攻击

package com.atguigu.api.preparedStatement;

import java.sql.*;
import java.util.Scanner;

/**
 * TODO 使用预编译的statement完成用户登录
 *      1.防止注入攻击
 *      2.演示preparedStatement的使用流程
 */


public class PSUserLoginPart {

    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();

        //PS的数据库流程
        //2.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        //3.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/atguigu?user=root&password=123456");

        /**
         * statement
         *    1.创建statement
         *    2.拼接SQL语句
         *    3.发送SQL语句,并获取返回结果
         *
         * preparedStatement
         *    1.编写SQL语句结构  不包含动态值的语句,动态值部分使用占位符 ? 替代  注意:? 只能替代动态值
         *    2.创建preparedStatement,并传入动态值
         *    3.动态值站位符进行赋值 -- ? 单独赋值即可
         *    4.发送SQL语句,并获取返回结果
         */

        //4.1.编写SQL语句结构
        String sql = "select * from t_user where account = ? and password = ?;";

        //4.2.创建预编译的statement并且设置SQL语句结果
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //4.3.单独占位符进行赋值
        /**
         * 参数1:index 占位符的位置 从左向右数 从1开始
         * 参数2:object 占位符的值,可以设置任何类型的数据,避免拼接,使类型更丰富
         */

        preparedStatement.setObject(1,account);
        preparedStatement.setObject(2,password);

        //4.4.发送SQL语句,并获取返回结果
        // statement.executeQuery(sql) | statement.executeUpdate(sql)
        // preparedStatement.executeQuery() | preparedStatement.executeUpdate()
        // preparedStatement  不需要传入参数,因为已经知道了SQL语句的结构和动态值
        ResultSet resultSet = preparedStatement.executeQuery();

        //5.结果集解析
        if(resultSet.next()){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }

        //6.释放资源
        resultSet.close();
        preparedStatement.close();

    }
}
posted @   LaViez  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示