PreparedStatement

 

jdbc六部曲:1.导包 2.加载驱动 3.创建连接 4.创建状态参数 5.执行sql 6.关闭

        String className="com.mysql.jdbc.Driver";
        String url="jdbc:mysql://localhost:3306/atm?useSSL=false";
        String user="hh";
        String pwd="123456";
        String sql="select * from balance where username='"+username+"'";

        Connection conn=null;
        Statement stat=null;
        ResultSet rs=null;
        try {
            Class.forName(className);//2
            conn= DriverManager.getConnection(url,user,pwd);//3
            stat=conn.createStatement();//4
            rs=stat.executeQuery(sql);//5
}catch (Exception e) {
            e.printStackTrace();
        }finally {//6
            try {
                if (rs != null) {
                    rs.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                if(stat!=null){
                    stat.close();
                }

            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                if(conn!=null){
                    conn.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

上面代码状态参数是Statement,以后不建议用它了 ,原因如下

跟字符串拼接有关
1.SQL注入
  所谓的SQL注入
  意思就是通过SQL命令 拼接其他的字符串
  让其他的那些字符串来改变原有SQL语句的执行
  最终达到欺骗服务器的效果
  里面拼接的其他字符 肯定是SQL语法认可的合法的
  select * from atm where aname = 'xxx' and apassword = 'xxx' 【or '1' = '1'】

2.问题产生的原因
  1.判断不严谨导致的
  2.SQL语句问题 允许拼接字符串 认为用户很不安全
  3.可以利用PreparedStatement来处理SQL

Statement                     PreparedStatement
普通的状态参数            预处理状态参数
创建时不需要SQL         创建时就需要预先加载SQL语句
此时没有执行               此时没有执行 但 底层预先处理SQL需要查询的结果 性能高
            可以利用动态化进行参数的处理 利用?代替 数据类型及值
PreparedStatement好处 1.增强SQL可读性 2.可以参数动态化 3.防止SQL注入 4.提高执行性能

 String className="com.mysql.jdbc.Driver";
        String url="jdbc:mysql://localhost:3306/atm?useSSL=false";
        String user="hh";
        String pwd="123456";
        String sql="select * from balance where username= ?";

        Connection conn=null;
        PreparedStatement pstat=null;
        ResultSet rs=null;
        try {
            Class.forName(className);
            conn= DriverManager.getConnection(url,user,pwd);
            pstat=conn.prepareStatement(sql);//sql语句预处理
       
pstat.setString(1,username);//1代表sql语句中第1个?,以此类推
            rs=pstat.executeQuery();//这里就不传sql了
            if(rs.next()){
             
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (rs != null) {
                    rs.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                if(pstat!=null){
                    pstat.close();
                }

            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                if(conn!=null){
                    conn.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

 

posted on 2021-03-11 10:51  刀锋93  阅读(180)  评论(0编辑  收藏  举报

导航