*
jdbc Connection接口中的方法prepareStatement与createStatement的区别*
不废话直接上代码
在这里插public class createStatementDenRu {
public static void main(String[] args) throws SQLException {
// ;驱动加链接
Connection cn = JDBCgonju.LJie();
// 获得小火车
Statement st = cn.createStatement();
Scanner sc = new Scanner(System.in);
System.out.println("请输入账号");
String n1 = sc.next();
System.out.println("请输入密码");
String n2 = sc.next();
// mysql 语句,字符串拼接
String sql = "SELECT * FROM user WHERE NAME='"+n1+"' AND PASSWORD='"+n2+"';";
// 执行
ResultSet rs = st.executeQuery(sql);
if (rs.next()){
System.out.println("密码正确,登入成功");
}else {
System.out.println("登入失败");
}
JDBCgonju.close(cn,st,rs);
}
}
入代码片
上面是一个我Java键盘输入账号密码然后通过jdbc向我的数据库查询是否有此账号密码,下面是我数据库
当我用Connection中的createStatement方法时,我发现mysql只能用字符串拼接,开始没有什么问题,可是后来发现一个问题,那就是SQL注入攻击
请输入账号
aabbcc
请输入密码
12’OR’1’='1
密码正确,登入成功
我的账号随便输入的,数据库里面没有,但是登入成功了,前面输入了什么不要紧,最重要的是最后输入的OR 1=1 这个是永远成立的,所以登入成功了,这就是createStatement的bug。
现在就引入了 Connection接口的另外一种方法prepareStatement
public class prepareStatement_DenRu {
public static void main(String[] args) throws Exception {
// 驱动加链接
Connection cn = JDBCgonju.LJie();
String sql = "SELECT * FROM user WHERE NAME=? AND PASSWORD=?;";
// 获得安全货车
PreparedStatement ps = cn.prepareStatement(sql);
Scanner sc = new Scanner(System.in);
System.out.println("请输入账号");
String n1 = sc.next();
System.out.println("请输入密码");
String n2 = sc.next();
ps.setString(1, n1);
ps.setString(2, n2);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
System.out.println("登入成功");
JDBCgonju.close(cn, ps, rs);
} else {
System.out.println("登入失败,请重新输入");
}
}
}
这里我们就不是用的字符串拼接,而是首先让PreparedStatement去解析这个SQL语句,不知道的值用问号来占位,后面再给问号赋值,这样就避免了SQL语句的注入攻击。