2022.7.13

PreparedStatement

  • 作用

    1. 预编译(性能更高)SQL语句并执行:预防SQL注入问题(将敏感字符进行转义,例如将'变成')

    ①获取PreparedStatement对象

    //SQL语句中的参数值,用?占位符替代
    String sql="select *from tb_user where username=?and password=?;
    //通过Connection对象获取,并传入对应的SQL语句
    PreparedStatement pstmt=conn.prepareStatement(sql);

    ②设置参数值

    PrepareStatement对象:setXxx(参数1,参数2):给?赋值 Xxx:数据类型;如setInt(参数1,参数2)

    参数:

    参数1:?的位置编号,从1开始

    参数2:?的值

    public void testPreparedStatement()throws Exception{
        String url="jdbc:mysql:///db1?useSSL=false";
        String username="root";
        String password="1234";
        Coonection conn=DriverManager.getConnection(url,username,password);
        //接收用户输入 用户名和密码
        String name="zhangsan";
        String pwd="qweqw";
        String sql="select *from tb_user where username=?and password=?;
        获取stmt对象
        PreparedStatement pstmt=conn.preparedStatement();
        //设置?的值
        pstmt.setString(parameterindex:1,name);
        pstmt.setString(parameterindex:2,pwd);
        //执行SQL
        ResultSet rs=pstmt.executeQuery();  
        //判断登录是否成功
        if(rs.next()){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }
        //释放资源
        rs.close();
        pstmt.close();
        conn.close();
    }

    ③执行SQL

    executeUpdate(); 不需要再传递SQL,因为第一步获取对象时已经将SQL传进来了。

  • SQL注入

    • SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法(例如在密码框输入代码以进入服务器)

public void testResultSet()throws Exception{
    String url="jdbc:mysql:///db1?useSSL=false";
    String username="张三";
    String password="123";
    Coonection conn=DriverManager.getConnection(url,username,password);
    //接收用户输入 用户名和密码
    String name="";
    String pwd="";
    String sql="select *from tb_user where username='"+name+"'and password='"+pwd+"';
    获取stmt对象
    Statement stmt=conn.createStatement();
    //执行SQL
    ResultSet rs=stmt.executeQuery(sql);
    //判断登录是否成功
    if(rs.next()){
        System.out.println("登录成功");
    }else{
        System.out.println("登录失败");
    }
    //释放资源
    rs.close();
    stmt.close();
    conn.close();
}
//演示SQL注入
public void testLogin_Inject() throws Exception{
    String url="jdbc:mysql:///db1?useSSL=false";
    String username="张三";
    String password="'or'1'='1";
    //这样之后SQL语句
    //select *from tb_user where username='"+name+"'and password='"+pwd+"';
    //就变成
    //select *from tb_user where username='张三'and password=''or'1'='1';
}

PreparedStatement原理

①PreparedStatement预编译功能开启:将useServerPrepStmts=true加到url的后面

②配置MySQL执行日志(重启mysql服务后生效)

在my.ini文件中添加:

log-output=FILE
general-log=1
general_log_file="D:\mysql.log"
slow-query-log=1
slow_query_log_file="D:\mysql_slow.log"
long_query_time=2
  1. 在获取PreparedStatement对象时,将SQL语句发送给MySQL服务器进行检查,编译(这些步骤很耗时)

  2. 执行时就不用再进行这些步骤了,速度更快

  3. 如果SQL模板一样,则只需要进行一次检查、编译

jar包的启动

在cmd里输入:java -jar然后要启动的jar包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值