MySQL数据库 JDBC 无注入攻击bug
PreparedStatement
JDBC对数据库表进行增删改查操作
- 导入jar包
- 注册驱动 告诉jvm 我们使用哪种驱动程序
Class.forName("com.mysql.jdbc.Driver");
- 获得连接对象 Connection
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名称","用户名","密码")
- 获得预编译执行者对象 Statement接口的子接口preparedStatement用于执行SQL语句 把SQL语句发送到数据库执行PreparedStatement pst = conn.prepareStatement()
- 执行SQL语句 返回结果
int row=pst.executeUpdate(sql语句);----→增删改
ResultSet rs=pst.executeQuery(sql语句);----→查
1.其中SQL语句 可以使用占位符
2.设置?占位符的实际数据 pst.setObject(下标,用户名);
3.执行SQL语句
- 处理结果 (打印行数、遍历结果集)
遍历结果集:while(rs.naxt()){
rs.getXxx("字段名1");
...
rs.getXxx("字段名n");
}
- 释放资源
package cn.kgc.jdbc;
import cn.kgc.utilsjdbc.UtilsJDBC;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class Login02 {
/**
* 解决用户使用SQL语句注入攻击数据库
* 用Statement接口的子接口
* java.sql.PrepareStatement extends Statement接口 表示预编译的SQL语句的对象
* 如何使用:
* 1.获取PrepareStatement对象 conn.prepareStatement(String sql)
* 其中SQL语句 可以使用占位符
* 2.设置?占位符的实际数据
* 3.执行SQL语句
*/
public static void main(String[] args) throws SQLException {
//1.使用Scanner获取用户输入的用户名和密码
Scanner input = new Scanner(System.in);
System.out.print("请输入用户名:");
String username = input.nextLine();
System.out.print("请输入密码:");
String password = input.nextLine();
//2.使用JDBC技术操作数据库
Connection conn = UtilsJDBC.getConnection();
String sql="select * from users where username=? and password=?;";
//3.获取预编译执行对象 并且传入SQL语句
PreparedStatement pst = conn.prepareStatement(sql);
pst.setObject(1,username);
pst.setObject(2,password);
//4.执行SQL 获取结果
ResultSet rs = pst.executeQuery();
//5.处理结果
if (rs.next()){
//有结果 登陆成功
System.out.println("登录成功"+rs.getString("username")+" "+rs.getString("password"));
}else{
System.out.println("用户和密码不匹配");
}
//6.释放资源
UtilsJDBC.close(rs,pst,conn);
}
}