接着上面一篇文章讲,你们觉得代码写的好吗???上面那个练习其实写的垃圾!!!
假如你的代码放到网站上去了,我们来玩一玩,试试看,我先随便输入个账号,再输入个密码,也能登陆成功!!!
以上操作是不是很危险???
那么这个问题称为SQL注入问题
1.输入用户名随便,输入密码:a’ or ‘a’='a
2.sql:select * from user where username='wedwedewd’and password=‘a’ or ‘a’='a’
当我们把上面sql语句执行查询的时候会发现,它会查出所有的数据。
1.SQL注入问题:在拼接sql时,有一些sql的关键字参与字符串的拼接,会造成安全性问题。
2.解决sql注入问题:使用PreparedStatement对象来解决
预编译的SQL语句:参数使用?作为占位符。、
3.步骤:
1.导入驱动jar包 mysql-connector-java-8.0.19.jar
2.编写代码注册驱动
3.获取数据库的连接对象Connection
4.定义SQL
注意:sql的参数使用?作为占位符
5.获取执行SQL语句的对象Statement PreparedStatement Connection.prepareStatement(String sql)
6.给?赋值:方法setxxx(参数1,参数2)参数1是?的位置编号,从1开始,参数2是?的值
7.执行SQL,接受返回结果,但不需要传递sql语句
8.处理结果
9.释放资源
package com.wcy.demo1.jdbc;
import JDBCUtils.JDBCUtils;
import java.sql.*;
import java.util.Scanner;
/**
* 1.通过键盘输入用户名和密码
* 2.判断用户是否登录成功
*/
public class JdbcDemo8 {
public static void main(String[] args) {
//1.键盘录入,接受用户名和密码
Scanner sc=new Scanner(System.in);
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
//2.调用方法
boolean flag = new JdbcDemo8().login2(username, password);
//3.判断结果输出不同语句
if(flag){
//登陆成功
System.out.println("登陆成功!");
}else{
System.out.println("用户名或密码错误!");
}
}
/**
* 登录方法,使用PreparedStatement实现
*/
public boolean login2(String username,String password){
if(username==null&&password==null){
return false;
}
Connection conn=null;
ResultSet rs=null;
PreparedStatement pstmt=null;
//连接数据库判断是否登录成功
//1.获取连接
try {
conn = JDBCUtils.getConnection();
//2.定义sql
String sql="select * from user where username=? and password=?";
//3.获取执行sql的对象
pstmt = conn.prepareStatement(sql);
//4执行查询,不需要传参
//给?赋值
pstmt.setString(1,username);
pstmt.setString(2,password);
rs = pstmt.executeQuery();
//5.判断
/*if(rs.next()){//如果有下一行,则返回true
return true;
}else {
return false;
}*/
return rs.next();//如果有下一行,则返回true
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JDBCUtils.close(rs,pstmt,conn);
}
return false;
}
}
注意:后期都会使用PreparedStaement对象来完成增删改查的所有操作,原因是可以防止sql注入,效率更高。