PreparedStatement和Statement区别:
PreparedState:预编译对象,执行都是占位符号?,可以有效防止sql注入(不存在字符串拼接)
sql就执行静态的sql语句,可以发送不同的参数进行赋值,执行sql效率相对大于Statement
Statement:普通的执行对象,每次指定的都是静态的sql,存在硬编码(将sql语句写死了),而且存在字符串拼接。
可以造成sql注入,不安全
执行sql效率低,每次执行exectueUpdate()或者是execteQuery(String sql)都要发送sql。
代码演示(Statement):
package practice_02;
import JdbcUtils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
/**
* @author Kuke
* @date 2021/11/6 16:09
* 使用Statement对象操作数据库,模拟用户登录操作
* 键盘录入,录入的数据需要和查询到的用户名和密码进行对比,一致,提示"登录成功" ;
* 弊端:Statement:1 执行静态sql语句,写死了---存在字符串拼接
* 2 select * from user where username = 'java' and passward = 'a'or'a'='a' ;
* 就会造成SQL注入,密码不匹配的情况下依然能登录成功。
*/
public class StatementTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in) ;
System.out.println("请输入用户名:");
String username = sc.nextLine() ;
System.out.println("请输入密码;");
String passward = sc.nextLine() ;
Boolean flag = isLogin(username,passward) ;
if (flag){
System.out.println("登陆成功");
}else{
System.out.println("登陆失败,请重新输入。");
}
}
private static Boolean isLogin(String username, String passward) {
Connection cont = null ;
Statement stmt = null ;
ResultSet rs = null ;
try {
cont =JdbcUtils.getConnection() ;
String sql = "select * from user where username='"+username+"'and passward='"+passward+"';";
System.out.println(sql);
stmt = cont.createStatement();
rs = stmt.executeQuery(sql) ;
return rs.next() ;
} catch (SQLException e) {
e.printStackTrace();
}
return false ;
}
}
代码演示:利用preparedStatememt模拟登录
package practice_02;
import JdbcUtils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
/**
* @author Kuke
* @date 2021/11/6 17:27
*/
//测试类
public class PreparedStatementTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in) ;
System.out.println("请您输入用户名:");
String username = sc.nextLine() ;
System.out.println("请您输入密码:");
String passward = sc.nextLine() ;
Boolean flag = isLogin(username,passward) ;
if (flag){
System.out.println("登录成功!!");
}else{
System.out.println("登陆失败,请重新登录。");
}
}
private static Boolean isLogin(String username, String passward) {
Connection cont = null ;
PreparedStatement stmt = null ;
ResultSet rs = null ;
try {
cont = JdbcUtils.getConnection() ;//获取连接对象。
String sql = "select * from user where username = ? and passward=?" ;
stmt= cont.prepareStatement(sql) ;//预编译对象执行sql语句。
stmt.setString(1,username);
stmt.setString(2,passward);
rs = stmt.executeQuery() ;
return rs.next() ;
} catch (SQLException e) {
e.printStackTrace();
}
return false ;
}
}