问题:前一篇(Java数据库连接(一))中步骤三,获得sql语句连接对象时,不能有效的预防sql注入,导致存在数据安全问题。
什么是sql注入?
解决办法:使用 PreparedStatement
【使用 PreparedStatement 预编译(防止SQL注入)】
// 使用占位符
String sql = “select * from user where username = ? and password = ?”;
// 使用 preparedStatement 进行预编译
PreparedStatement ptmt = conn.preparedStatement(sql);
// 给SQL占位符设置值
// 占位符,下标从1开始
ptmt.setString(1, “Jss”);
ptmt.setString(2, “1234”);
// 执行操作,此时不需要再传递 sql,因为上面已经预编译过了
ptmt.executeQuery();
【PreparedStatement 执行修改】
// 使用 executeUpdate(),其中返回值是 int,指的是多少条数据发生了变动。
ptmt.executeUpdate();
【PreparedStatement 执行查询】
ptmt.executeQuery();
代码操作
package DatabaseConnection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
public class practiceTwo {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//步骤1:注册数据驱动
Class.forName("com.mysql.jdbc.Driver");
//步骤2:获取数据库连接
String url = "jdbc:mysql://localhost:3306/student_information";
String user = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, user, password);
//System.out.println(conn);
//步骤3:获得sql语句执行对象
Statement stmt = conn.createStatement();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要查询的人的性别:");
String sex = scanner.nextLine();
System.out.println("请输入要查询的系别:");
String sdept = scanner.nextLine();
//步骤4:准备sql语句
//使用createStatement不能预防sql注入
/*请输入要查询的人的性别:
女
请输入要查询的系别:
就是不介绍说 'or '1=1*/
String sql = "select *from student where Ssex = '"+sex+"' and Sdept = '"+sdept+"'";
//步骤5:执行sql语句
ResultSet rs = stmt.executeQuery(sql);
//步骤6:处理获取到的结果
while(rs.next()) {
System.out.println(rs.getString("Sno") + "\t" + rs.getString("Sname") + "\t" + rs.getString("Ssex") + "\t"
+ rs.getInt("Sage") + "\t" + rs.getString("Sdept") + "\t" + rs.getString("S_entrance"));
}
rs.close();
stmt.close();
scanner.close();
conn.close();
}
}