为什么需要JDBC
我们使用IO流,实现了数据的持久化,但是数据的格式和存储,不方便查看和管理
MYSQL数据库使用了行和列来进行数据的存储,JDBC就是java中用来操作是数据库的
JDBC的简单例子
import java.sql.DriverManager;
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1. 加载JDBC驱动,以下两种方式皆可,不过1.6之后已经不需要注册驱动了
// Class.forName("com.mysql.cj.jdbc.Driver");
// DriverManager.registerDriver(new Driver());
// 2. 获取链接对象
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/atguigu", "root", "123456");
// 3. 获取执行Sql对象
Statement s = c.createStatement();
String sql = "select emp_id, emp_name, emp_salary, emp_age from t_emp;";
// 4. 获取返回结果对象
ResultSet resultSet = s.executeQuery(sql);
while (resultSet.next()) {
int empId = resultSet.getInt("emp_id");
String empName = resultSet.getString("emp_name");
double empSalary = resultSet.getDouble("emp_salary");
int empAge = resultSet.getInt("emp_age");
System.out.println(empId + " " + empName + " " + empSalary + " " + empAge);
}
// 先开后关
resultSet.close();
s.close();
c.close();
}
Statement引发的SQL注入问题
private static void method2() throws SQLException {
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/atguigu", "root", "123456");
// 3. 获取执行Sql对象
Statement s = c.createStatement();
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
String sql = "select emp_id, emp_name, emp_salary, emp_age from t_emp where emp_name = '" + name + "'";
// 4. 获取返回结果对象
ResultSet resultSet = s.executeQuery(sql);
while (resultSet.next()) {
int empId = resultSet.getInt("emp_id");
String empName = resultSet.getString("emp_name");
double empSalary = resultSet.getDouble("emp_salary");
int empAge = resultSet.getInt("emp_age");
System.out.println(empId + " " + empName + " " + empSalary + " " + empAge);
}
resultSet.close();
s.close();
c.close();
}
有一条数据叫做的名称叫做andy,
andy
但是我们现在这样输入,就会获取到所有的数据:
andy’ or ‘1’ = ‘1
PreparedStatement解决Sql注入问题
private static void method3() throws SQLException {
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/atguigu", "root", "123456");
// 3. 获取执行Sql对象
Scanner scanner = new Scanner(System.in);
System.out.println("请输入名称:");
String name = scanner.nextLine();
PreparedStatement s = c.prepareStatement("select emp_id, emp_name, emp_salary, emp_age from t_emp where emp_name = ?");
// 4. 获取返回结果对象
s.setString(1, name);
ResultSet resultSet = s.executeQuery();
while (resultSet.next()) {
int empId = resultSet.getInt("emp_id");
String empName = resultSet.getString("emp_name");
double empSalary = resultSet.getDouble("emp_salary");
int empAge = resultSet.getInt("emp_age");
System.out.println(empId + " " + empName + " " + empSalary + " " + empAge);
}
resultSet.close();
s.close();
c.close();
}
// andy' or '1' = '1 将不再输出结果
原理:会被当作一个普通值,而不是拼接语句。会默认给每一个?都加上一对单引号。 同时,里面的特殊字符都会添加上转义符号
所以以上内容的SQL结果会变成这样:select emp_id, emp_name, emp_salary, emp_age from t_emp where emp_name = ‘andy' OR '1' = '1’