使用PreparedStatement的好处:
- 不再使用 + 拼接sql语句,减少语法错误,语义性强
- 将模板sql(固定的部分)和参数部分进行了分离,提高维护性
- 有效的解决了sql注入问题
注入问题:比如下面的例子,使用Statement,用户输入username时,可能会输入一些特殊符号,尤其是双引号、单引号,系统将这些符号拼接到sql语句中,可能会导致sql语句出错,进而导致程序报错。 - 大大减少了编译次数,效率高
比如下面例子中的登录验证。
使用Statement,如果有10个人进行登录验证,程序就需要编译执行10次。
PreparedStatement叫做预编译,模板一样,只会编译一次
public class TextPrepareStatement {
//使用Statement实现登录
public void testStatement() throws Exception{
//-------------用户输入部分---------------
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = input.next();
System.out.println("请输入密码:");
String pwd = input.next();
//-------------连接数据库步骤-------------
Properties info = new Properties();
info.load(new FileInputStream("src\\jdbc.properties"));
String user = info.getProperty("name");
String password = info.getProperty("password");
String driver = info.getProperty("driver");
String url = info.getProperty("url");
//1. 加载驱动
Class.forName(driver);
//2. 获取连接
Connection connection = DriverManager.getConnection(url, user, password);
//3. 执行查询
String sql = "SELECT COUNT(*) FROM admin WHERE username='"+username+"' AND PASSWORD='"+pwd+"'";
Statement statement = connection.createStatement();
ResultSet set = statement.executeQuery(sql);
if(set.next()) {
int count = set.getInt(1);
System.out.println(count>0?"Login Success!":"Login Failure!");
}
//4. 关闭连接
set.close();
statement.close();
connection.close();
}
//使用PreparedStatement实现登录
public void testPreparedStatement() throws Exception{
//-------------用户输入部分---------------
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = input.next();
System.out.println("请输入密码:");
String pwd = input.next();
//-------------连接数据库步骤-------------
Properties info = new Properties();
info.load(new FileInputStream("src\\jdbc.properties"));
String user = info.getProperty("name");
String password = info.getProperty("password");
String driver = info.getProperty("driver");
String url = info.getProperty("url");
//1. 加载驱动
Class.forName(driver);
//2. 获取连接
Connection connection = DriverManager.getConnection(url, user, password);
//3. 执行查询
//3.1 编写sql
String sql = "SELECT COUNT(*) FROM admin WHERE username=? AND PASSWORD=?";
//3.2 获取PreparedStatement命令对象
PreparedStatement statement = connection.prepareStatement(sql);
//3.3 设置占位符的值
statement.setString(1, username);
statement.setString(2, pwd);
//3.4 执行sql命令
// int update = statement.executeUpdate(); //执行增删改,返回受影响的行数
ResultSet set = statement.executeQuery(); //执行查询,返回结果集
if(set.next()) {
int count = set.getInt(1);
System.out.println(count>0?"login success!":"login failure!");
}
//4. 关闭连接
set.close();
statement.close();
connection.close();
}
}