使用占位符的好处
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);
}
}
当使用占位符之后,只有输入了正确的参数,才能查询成功