1、SQL注入问题:
在拼接sql语句时,有一些sql的特殊关键字与字符串的拼接,会造成安全性的问题
输入用户名随便
密码输入:a’ or ‘a’ = 'a
sql : select * from user where username=‘asdfg’ and password =‘a’ or ‘a’ = ‘a’;
2、解决SQL注入问题:
使用PreparedStatement来解决
3、预编译的SQL:
参数使用?作为占位符
4、步骤
1、导入驱动jar包 mysql-connector-java-8.0.16.jar
复制mysql-connector-java-8.0.16.jar到libs目录下
右键–>Add As Library
2、注册驱动
3、获取数据库的连接对象 Connection
4、定义Sql语句
select * from user where username= ? and password = ?;
5、获取执行sql语句的对象 PreparedStatement
Connection.preparedStatement(String sql);
6、给 ? 赋值
方法: setXXX(参数1,参数2)
参数1:?的位置编号,从1开始
参数2:?的值
7、执行sql,接收返回结果,不需要传递sql语句
8、处理结果
9、释放资源
代码示例
public boolean login2(String username, String password) { if (username == null || password == null) { return false; } //连接数据库来判断是否登录成功 Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; //获取连接 try { //获取连接 conn = JDBCUtils2.getConnection(); //2、定义sql String sql = "select * from user where username=? and password =?"; //3、获取执行sql的对象 pstmt = conn.prepareStatement(sql); //给?赋值 pstmt.setString(1,username); pstmt.setString(2,password); //4、执行查询,不需要传递sql rs = pstmt.executeQuery(); //5、判断:判断结果集是否有数据 return rs.next();//如果有下一行,返回true } catch (SQLException e) { e.printStackTrace(); }finally { //释放资源 JDBCUtils2.close(rs, pstmt, conn); } return false; }
使用PreparedStatement实现的登录方法也时写在JDBCDemo9 项目工程里,与main()方法的类同级
测试类
import java.sql.*;import java.util.Scanner;public class JDBCDemo9 {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 JDBCDemo9().login2(username, password); //3、判断结果,输出不同语句 if (flag) { //登录成功 System.out.println("登录成功"); } else { System.out.println("用户名或密码错误"); } }}