/*产生sql注入的原因是由于Statement 传输器在发送sql语句进入数据库时,直接将
sql语句与参数拼接在一起从而会出现sql语句的语义问题
所以这里使用PreparedStatement传输器对象也就是Statement的子对象来操作
因为PreparedStatement 是将sql语句的骨架传入 这样传入参数方便也同时就不会出错。所以防止了sql的注入攻击。
*/
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;
import com.tedu.utill.jdbcUtil;
/**
- 模拟用户登录
- 使用PreparedStatement 对象防止sql注入
*/
public class LoginUser2 {
public static void main(String[] args) {
System.out.println(“请登录…”);
System.out.println(“请输入用户名:”);
Scanner sc = new Scanner(System.in);
String username = sc.nextLine();
System.out.println(“请输入密码:”);
String password = sc.nextLine();
LoginPS(username, password);
}
/**
* 根据用户名密码查询用户信息
*
*/
public static void LoginPS(String username, String password) {
Connection conn = null;
PreparedStatement ps=null;
ResultSet rs = null;
try {
conn = jdbcUtil.getconn();
String sql = "select * from user where "
+ "username=? and password=?";
ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
rs=ps.executeQuery();
//不要使用有参的sql参数因为有参的方法是继承父类的前面已经传递过sql语句。
if (rs.next()) {
System.out.println("恭喜您登录成功!");
} else {
System.out.println("账号或密码错误!");
}
} catch (Exception e) {
// TODO: handle exception
} finally {
jdbcUtil.close(conn, ps, rs);
}
}
}