zoukankan      html  css  js  c++  java
  • Java -- JDBC学习笔记3、PreparedStatement

    1、SQL注入问题

    1.1、什么是SQL注入?

    用户输入的数据中有SQL关键字或用法并且参与了SQl语句的编译,导致SQL语句编译后的条件含义为true,一直得到正确的结果,这种现象称为SQL注入。

    1.2、如何避免SQL注入?

    由于编写的SQl语句是在用户输入数据,整合后再进行编译。所以、为了避免SQL注入问题,要提前将SQl语句进行编译,参数位置使用占位符,编译完成后,再对占位符填充对应的数据。

    2、PreparedStatement

    PreparedStatement继承了Statement接口,执行SQl语句的方法无异

    2.1、PreparedStatement的应用

    • 作用
      • 预编译SQL语句,效率高
      • 安全,避免SQl注入
      • 可以动态填充数据,执行多个同构的SQL语句(SQL语句相同,参数值不同)

    2.1.1、参数标记

    String querySql = "SELECT Name,LoginName FROM Students where id=?";
    
    PreparedStatement ps = conn.prepareStatement(querySql);
    
    • 注意:JDBC中所有占位符符号都用 表示,为指定参数下标绑定值,赋值的时候编号从1开始,1代表的就是第一个占位符,2就是第二个。

    2.1.2、动态参数绑定

    • ps.setXxx(1,1)
      • 第一个参数是下标
      • 第二个参数是需要填入的值
    String querySql = "SELECT Name,LoginName FROM Students where id=?";
    
    PreparedStatement ps = conn.prepareStatement(querySql);
    
    ps.setInt(1, 1);
    
    • 这样,id = ? 中,? 就会替换为 1

    2.1.3、执行SQL

    执行编译后的SQl查询语句使用ResultSet rs = ps.executeQuery();

    • 注意:括号里边没有SQL语句,因为SQL语句事先已经编译过了

    2.1.4、遍历集合

    while (rs.next())
    {
        //通过列名获取
        String name1 = rs.getString("Name");
        String loginName1 = rs.getString("LoginName");
        System.out.println("姓名:" + name1 + ",登录名:" + loginName1);
    }
    
    • 和statement一样。

    2.1.5、整合代码

    try
            {
                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    
                String url = "jdbc:sqlserver://localhost:1433;databaseName=StudentManage";
    
                Connection conn = DriverManager.getConnection(url, "sa", "sql2012");
    
                String querySql = "SELECT Name,LoginName FROM Students where id=?";
    
                PreparedStatement ps = conn.prepareStatement(querySql);
    
                ps.setInt(1, 1);
    
    
                ResultSet rs = ps.executeQuery();
    
                while (rs.next())
                {
                    //通过列名获取
                    String name1 = rs.getString("Name");
                    String loginName1 = rs.getString("LoginName");
                    System.out.println("姓名:" + name1 + ",登录名:" + loginName1);
                }
    
                rs.close();
                ps.close();
                conn.close();
            }
            catch (ClassNotFoundException e)
            {
                e.printStackTrace();
            }
            catch (SQLException sqlException)
            {
                sqlException.printStackTrace();
            }
    
  • 相关阅读:
    登录验证servlet实现
    IOS开发(68)之捕获点击划屏手势
    jquery实现漂浮在网页右侧的qq在线客服插件
    深切缅怀“5.12”特大地震遇难同胞
    PHP实现微信申请退款流程实例源码
    empty和isset的区别
    ThinkPHP中实现微信支付(jsapi支付)流程
    php中正则表达式详解
    PHP与RBAC设计思路讲解与源码
    一起谈.NET技术,VS2010实践RUP4+1架构模型 狼人:
  • 原文地址:https://www.cnblogs.com/dcy521/p/14726065.html
Copyright © 2011-2022 走看看