JDBC数据库连接

准备

准备对应数据库版本的连接jar包,下载后进行导入

地址:https://dev.mysql.com/downloads/connector/j/

步骤

  1. 注册驱动

    1. Class.forName("com.mysql.jdbc.Driver");//适用于mysql5.x版本
    2. Class.forName("com.mysql.cj.jdbc.Driver");//适用于mysql8.x版本
  2. 创建连接
    使用DriverManager.getConnection()方法来创建一个Connection对象,它代表一个数据库的物理连接,

    1. //协议名 //IP地址:端口号 //库名 //字符集 //时区
    2. String url = "jdbc:mysql://localhost:3306/cgb2106?characterEncoding=utf8";
    3. Connection c = DriverManager.getConnection(url, "root", "root");//三个参数分别为链接地址,用户名,密码
  3. 获取传输器
    需要使用一个类型为StatementPreparedStatement的对象,并提交一个SQL语句到数据库执行查询。

    1. Statement s = c.createStatement();
  4. 进行查询
    执行SQL—-executeQuery()执行查询的SQL
    若要执行一个SQL语句:UPDATEINSERTDELETE语句,那么需要下面的代码片段:

    1. ResultSet r = s.executeQuery("select * from dept");
    1. stmt = conn.createStatement();
    2. String sql;
    3. sql = "DELETE FROM Employees";
    4. ResultSet rs = stmt.executeUpdate(sql);
  5. 处理结果集
    next()方法判断当前行有无数据,有数据就返回true

    1. while (r.next()){
    2. String a = r.getString(1);//获取第一列的数据
    3. String b = r.getString(2);//获取第二列的数据
    4. String d = r.getString(3);//获取第三列的数据
    5. // String dname = r.getString("dname");
    6. // String deptno = r.getString("deptno");
    7. // String loc = r.getString("loc");//获取指定字段的值
    8. // System.out.println("deptno:" + deptno + ",dname:" + dname + ",loc:" + loc);
    9. System.out.println(a + b + d);
    10. }
  6. 清理环境资源

    1. r.close();//关闭结果集
    2. s.close();//关闭传输器
    3. c.close();//关闭连接

示例代码

  1. package cn.tedu.jdbc;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. public class TestJDBC {
  7. public static void main(String[] args) throws Exception {
  8. //1.注册驱动 Driver.class
  9. Class.forName("com.mysql.jdbc.Driver");
  10. //2.获取连接(用户名、密码、端口号、库名)
  11. //协议名 //IP地址:端口号 //库名
  12. String url = "jdbc:mysql://localhost:3306/cgb2106?characterEncoding=utf8";
  13. Connection c = DriverManager.getConnection(url, "root", "root");
  14. //3.获取传输器
  15. Statement s = c.createStatement();
  16. //4.执行SQL---executeQuery()执行查询的SQL
  17. ResultSet r = s.executeQuery("select * from dept");
  18. /*
  19. 5.处理结果集
  20. next()方法判断当前行有无数据,有数据就返回true
  21. */
  22. while (r.next()){
  23. String a = r.getString(1);//获取第一列的数据
  24. String b = r.getString(2);//获取第二列的数据
  25. String d = r.getString(3);//获取第三列的数据
  26. // String dname = r.getString("dname");
  27. // String deptno = r.getString("deptno");
  28. // String loc = r.getString("loc");//获取指定字段的值
  29. // System.out.println("deptno:" + deptno + ",dname:" + dname + ",loc:" + loc);
  30. System.out.println(a + b + d);
  31. }
  32. //6.释放资源
  33. r.close();//关闭结果集
  34. s.close();//关闭传输器
  35. c.close();//关闭连接
  36. }
  37. }

SQL注入(SQL攻击)

用户输入非法字符“#”或者“—空格”导致后面的SQL语句失效

因为”#”与”—空格”在SQL语句中为注释,会使后面的SQL语句失效

示例代码

  1. package cn.tedu.jdbc;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. import java.util.Scanner;
  7. public class JDBCAttack {
  8. public static void main(String[] args) throws Exception {
  9. //1.注册驱动 Driver.class
  10. Class.forName("com.mysql.cj.jdbc.Driver");
  11. String url = "jdbc:mysql://localhost:3306/cgb2106?characterEncoding=utf8";
  12. Connection conn = DriverManager.getConnection(url, "root", "root");
  13. Statement s = conn.createStatement();
  14. String user = new Scanner(System.in).nextLine();
  15. String pwd = new Scanner(System.in).nextLine();
  16. String sql ="select name,password from user where name='"+user+"' and password='"+pwd+"'";
  17. ResultSet r = s.executeQuery(sql);
  18. if(r.next()){
  19. System.out.println("登录成功~");
  20. }else{
  21. System.out.println("登录失败~");
  22. }
  23. //6.释放资源
  24. r.close();//关闭结果集
  25. s.close();//关闭传输器
  26. conn.close();//关闭连接
  27. }
  28. }

SQL注入解决方案

使用prepareStatement()对象来使用SQL语句进行数据操作,使用?作为占位符,将要查询的字段使用setString()方法进行设置。

  1. sql = "select * from teachers where tname=?";//参数使用问号
  2. PreparedStatement stat = cn.prepareStatement(sql);//对象换掉
  3. stat.setString(1, condition);//对应参数类型,第几个问号
  4. ResultSet rs = stat.executeQuery();//去掉sql参数

示例代码

  1. private static void toSolve() {
  2. //1.注册驱动 Driver.class
  3. try {
  4. Class.forName("com.mysql.cj.jdbc.Driver");
  5. String url = "jdbc:mysql://localhost:3306/cgb2106?characterEncoding=utf8";
  6. Connection conn = DriverManager.getConnection(url, "root", "root");
  7. Statement s = conn.createStatement();
  8. String user = new Scanner(System.in).nextLine();
  9. String pwd = new Scanner(System.in).nextLine();
  10. //获取传输器
  11. String sql = "select name,password from user where name = ? and password = ?";//?为占位符,sql骨架
  12. PreparedStatement ps = conn.prepareStatement(sql);
  13. ps.setString(1, user);
  14. ps.setString(2, pwd);
  15. ResultSet result = ps.executeQuery();
  16. if (result.next()){
  17. System.out.println("成功");
  18. } else {
  19. System.out.println("失败");
  20. }
  21. result.close();
  22. ps.close();
  23. conn.close();
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }