数据库——占位符的使用

    xiaoxiao2023-11-25  181

    使用占位符的好处

    1 避开了SQL语句注入的风险

            SQL注入风险:使用Statement接口操作的sql语句需要使用字符串拼接的方式实现,这样的方式可能存在sql注入的安全风险并且拼接字符串比较麻烦的

    2 传入字符串参数时无需用再用单引号包裹

    观察如下两段代码: 代码一:不使用占位符

    public class JdbcTest { public static void main(String[] args) { // 调用selectLogin(String name, String password)方法时,若在传入的password参数后面拼接一个"OR"字符串和一个返回值为true的字符串表达式,则无论"OR"前面的字符串是否满足条件,都能成功查询到myuser数据表中username字段名下name的所有信息 selectLogin("'smith'", "'sddsaf' OR 1=1"); //传入字符串参数时需将字符串用单引号包裹 } public static boolean selectLogin(String name, String password) { Connection conn = getConnection(); // getconnection():自定义的连接数据库的方法 try { // 当传入的参数较多时,字符串的拼接会比较麻烦 String sql = "SELECT *FROM myuser WHERE username=" + name + " AND password=" + password; System.out.println(sql); PreparedStatement pst = conn.prepareStatement(sql); ResultSet rst = pst.executeQuery(); // 返回一个查询结果集 if (rst.next()) { // 当rst.next()返回true时,说明查询成功 System.out.println("查询成功"); } else { System.out.println("用户名或密码不正确"); } } catch (SQLException e) { e.printStackTrace(); } finally { close(conn); } return false; } } 此时传入错误的参数也能成功

    代码一:使用占位符“?”来代替SQL语句中需要传入的字符串参数

    public static void selectLogin2(String name,String password) { Connection conn = getConnection(); try { // 使用占位符“?”来代替 String sql = "SELECT *FROM myuser WHERE username=? AND password=?" ; PreparedStatement pst = conn.prepareStatement(sql); pst.setString(1, name); // 给占位符赋值 pst.setString(2, password); // 给占位符赋值 ResultSet rst = pst.executeQuery(); if (rst.next()) { System.out.println("登陆成功"); } else { System.out.println("用户名或密码不正确"); } } catch (SQLException e) { e.printStackTrace(); } finally { close(conn); } } 当使用占位符之后,只有输入了正确的参数,才能查询成功
    最新回复(0)