- Statement接口实现登录(不重要)
public class StatementLoginDemo {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//提示输入
System.out.println("请输入用户名");
String username = scan.next();
System.out.println("请输入密码");
String password = scan.next();
try(Connection conn = DBUtils.getConn()){
//定义Statement
Statement st = conn.createStatement();
//定义sql
String sql = "select count(*) from user where username='"+username+"'and password='"+password+"';";
//执行sql
ResultSet rs = st.executeQuery(sql);
while (rs.next()){
//如果查询是1登录成功
//如果查询是0登录失败
int count = rs.getInt(1);
if (count>0){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
user表中的数据
-
SQL注入
但是这样拼接字符串安全性极低,如果有用户恶意拼串sql语句即可登录成功。
sql注入攻击 -
PreparedStatement接口(预编译状态通道)
在Statement接口的基础上做了改进
优点:
1. 代码简介,不易出错,不需要把参数拼接SQL语句里面
2. 可以避免SQL注入问题,因为在创建SQL执行对象时就已经将SQL语句逻辑锁死,不会被用户输入内容影响。
3. 预编译机制,第二次运行已经编译好的sql语句,运行速度快。
public class PreparedStatementLoginDemo {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//提示输入
System.out.println("请输入用户名");
String username = scan.next();
System.out.println("请输入密码");
String password = scan.next();
try(Connection conn = DBUtils.getConn()){
String sql = "select count(*) from user where username=? and password=?";
PreparedStatement ps = conn.prepareStatement(sql);
//sql中的?需要编译写代码来为它赋值
ps.setString(1,username);
ps.setString(2,password);
//执行sql
ResultSet rs = ps.executeQuery();
while (rs.next()){
int count = rs.getInt(1);
if(count>0){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
- ps.setString(1,username);代表第一个问号,赋值给username