ToB企服应用市场:ToB评测及商务社交产业平台

标题: JDBC p2 JDBC API [打印本页]

作者: 自由的羽毛    时间: 2023-7-26 17:07
标题: JDBC p2 JDBC API
JDBC API

获取数据库连接5种方式

代码演示:
  1. package com.hspedu.jdbc;
  2. import com.mysql.jdbc.Driver;
  3. import org.junit.jupiter.api.Test;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.IOException;
  7. import java.sql.Connection;
  8. import java.sql.DriverManager;
  9. import java.sql.SQLException;
  10. import java.util.Properties;
  11. /**
  12. * 分析java连接mysql的5种方式
  13. */
  14. public class JdbcConn {
  15.     //方式1
  16.     @Test
  17.     public void connect01() throws SQLException {
  18.         Driver driver = new Driver();
  19.         String url = "jdbc:mysql://localhost:3306/jdbc_learning";
  20.         Properties properties = new Properties();
  21.         properties.setProperty("user", "root");//用户名
  22.         properties.setProperty("password", "root");//密码
  23.         Connection connection = driver.connect(url, properties);
  24.         System.out.println("第一种方式" + connection);
  25.         connection.close();
  26.     }
  27.     //方式2
  28.     @Test
  29.     public void connect02() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
  30.         //使用反射加载Driver类,动态加载,减少依赖性,更加灵活
  31.         Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
  32.         Driver driver = (Driver) aClass.newInstance();
  33.         String url = "jdbc:mysql://localhost:3306/jdbc_learning";
  34.         Properties properties = new Properties();
  35.         properties.setProperty("user", "root");//用户名
  36.         properties.setProperty("password", "root");//密码
  37.         Connection connection = driver.connect(url, properties);
  38.         System.out.println("第二种方式" + connection);
  39.         connection.close();
  40.     }
  41.     //方式3 使用DriverManager 替代 Driver 进行统一管理,有了更好的扩展性
  42.     @Test
  43.     public void connect03() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
  44.         //使用反射加载Driver类
  45.         Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
  46.         Driver driver = (Driver) aClass.newInstance();
  47.         String url = "jdbc:mysql://localhost:3306/jdbc_learning";
  48.         String user = "root";
  49.         String password = "root";
  50.         DriverManager.registerDriver(driver);//注册Driver驱动,DriverManager是Java自带的类
  51.         Connection connection = DriverManager.getConnection(url, user, password);
  52.         System.out.println("第三种方式" + connection);
  53.     }
  54.     //方式4 使用 Class.forName 自动完成注册驱动,简化代码
  55.     //这种方式推荐使用,使用最多
  56.     @Test
  57.     public void connect04() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
  58.         //使用反射加载Driver类
  59.         //在加载 Driver类时,完成注册
  60.         /*
  61.             源码:1. 静态代码块,在类加载时,会执行一次
  62.                  2. 因此注册driver的工作在底层已经完成了
  63.             static {
  64.                         try {
  65.                             DriverManager.registerDriver(new Driver());
  66.                         } catch (SQLException var1) {
  67.                             throw new RuntimeException("Can't register driver!");
  68.                         }
  69.                     }
  70.          */
  71.         //1.mysqL驱动5.1.6可以无需CLass.forName("com.mysql.jdbc.Driver");
  72.         //2.从jdk1.5以后使用了jdbc4,不再需要显示调用class.forName()注册驱动而是自动调用驱动
  73.         //jar包下META-INF\services\java.sql.Driver文本中的类名称去注册
  74.         //3.建议还是写上CLass.forName("com.mysql.jdbc.Driver"),更加明确
  75.         Class.forName("com.mysql.jdbc.Driver");//内部有一段静态代码会默认自动注册
  76.         String url = "jdbc:mysql://localhost:3306/jdbc_learning";
  77.         String user = "root";
  78.         String password = "root";
  79.         Connection connection = DriverManager.getConnection(url, user, password);
  80.         System.out.println("第四种方式" + connection);
  81.     }
  82.     //方式5 在方式4的基础上改进,增加配置文件,让mysql连接更灵活,最推荐使用
  83.     @Test
  84.     public void connect05() throws IOException, ClassNotFoundException, SQLException {
  85.         //通过Properties对象获取配置文件的信息
  86.         Properties properties = new Properties();
  87.         properties.load(new FileInputStream("src\\mysql.properties"));
  88.         //获取相关的值
  89.         String user = properties.getProperty("user");
  90.         String password = properties.getProperty("password");
  91.         String driver = properties.getProperty("driver");
  92.         String url = properties.getProperty("url");
  93.         Class.forName(driver);//建议写上
  94.         Connection connection = DriverManager.getConnection(url, user, password);
  95.         System.out.println("第五种方式" + connection);
  96.     }
  97. }
复制代码
配置文件mysql.properties:
  1. user=root
  2. password=zyl
  3. url=jdbc:mysql://localhost:3306/jdbc_learning
  4. driver=com.mysql.jdbc.Driver
复制代码
ResultSet[结果集]


  1.   
  2.   
  3. ## Statement对象
  4. - **基本介绍**
  5.   1. Statement对象,用于执行静态SQL语句并返回其生成的结果的对象。
  6.   2. 在连接建立之后,需要对数据库进行访问,执行命名或是SQL语句,可以通过
  7.      - Statement [存在SQL注入]
  8.      - ==PreparedStatement==(预处理)
  9.      - CallableStatement(存储过程)
  10.   3. Statement对象执行SQL语句存在==SQL注入==的风险
  11.      - **SQL注入**是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,恶意攻击数据库。
  12.      - 要防范 SQL注入,只要用 **PreparedStatement**(从Statement扩展而来)取代 Statement 就可以了。
  13. **MySQL代码:**
  14. ​```mysql
  15. -- 演示sql注入
  16. -- 创建一张表
  17. CREATE TABLE admin ( -- 管理员表
  18. `name` VARCHAR(32) NOT NULL UNIQUE,
  19. pwd VARCHAR(32) NOT NULL DEFAULT '') CHARACTER SET utf8;
  20. -- 添加数据
  21. INSERT INTO admin VALUES('jac', '123');
  22. -- 查找某个管理员是否存在
  23. SELECT *
  24. FROM admin
  25. WHERE `name` = 'tom' AND pwd = '123';
  26. -- SQL注入
  27. -- 输入用户名 1' or
  28. -- 输入密码 为 or '1' = '1
  29. -- SELECT *
  30. -- FROM admin
  31. -- WHERE `name` = '' AND pwd = '';
  32. SELECT *
  33. FROM admin
  34. WHERE `name` = '1' or' AND pwd = 'or '1' = '1';
复制代码
Java代码:
  1. package com.hspedu.jdbc.statement_;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. import java.sql.*;
  6. import java.util.Properties;
  7. import java.util.Scanner;
  8. /**
  9. * @author: 86199
  10. * @date: 2023/6/15 22:24
  11. * Description: 演示 SQL注入的问题
  12. */
  13. public class Statement_ {
  14.     public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
  15.         Scanner scanner = new Scanner(System.in);
  16.         //让用户输入管理员用户名和密码
  17.         System.out.print("请输入管理员名字:");
  18.         String admin_name = scanner.nextLine();
  19.         System.out.print("请输入管理员密码:");
  20.         String admin_pwd = scanner.nextLine();
  21.         //通过Properties对象获取配置文件的信息
  22.         Properties properties = new Properties();
  23.         properties.load(new FileInputStream("src\\mysql.properties"));
  24.         //获取相关的值
  25.         String user = properties.getProperty("user");
  26.         String password = properties.getProperty("password");
  27.         String driver = properties.getProperty("driver");
  28.         String url = properties.getProperty("url");
  29.         //1. 注册驱动
  30.         Class.forName(driver);//建议写上
  31.         //2. 得到连接
  32.         Connection connection = DriverManager.getConnection(url, user, password);
  33.         //3. 得到Statement
  34.         Statement statement = connection.createStatement();
  35.         //组织sql语句
  36.         String sql = "SELECT name, pwd FROM admin where name =  '"
  37.                 + admin_name + "' and pwd = '" + admin_pwd + "';";
  38.         ResultSet resultSet = statement.executeQuery(sql);
  39.         if (resultSet.next()) {//如果查询到一条记录,说明该管理员存在
  40.             System.out.println("恭喜,登录成功");
  41.         }else{
  42.             System.out.println("对不起,登录失败");
  43.         }
  44.         resultSet.close();
  45.         statement.close();
  46.         connection.close();
  47.     }
  48. }
  49. //运行
  50. /*
  51. 请输入管理员名字:1' or
  52. 请输入管理员密码:or '1' = '1
  53. 恭喜,登录成功
  54. */
复制代码
预处理(查询和修改)

  1. package com.hspedu.jdbc.preparedstatement_;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. import java.sql.*;
  6. import java.util.Properties;
  7. import java.util.Scanner;
  8. /**
  9. * @author: 86199
  10. * @date: 2023/7/17 20:43
  11. * Description: 演示PreparedStatement使用
  12. */
  13. public class PreparedStatement_ {
  14.     public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
  15.         Scanner scanner = new Scanner(System.in);
  16.         //让用户输入管理员用户名和密码
  17.         System.out.print("请输入管理员名字:");
  18.         String admin_name = scanner.nextLine();
  19.         System.out.print("请输入管理员密码:");
  20.         String admin_pwd = scanner.nextLine();
  21.         //通过Properties对象获取配置文件的信息
  22.         Properties properties = new Properties();
  23.         properties.load(new FileInputStream("src\\mysql.properties"));
  24.         //获取相关的值
  25.         String user = properties.getProperty("user");
  26.         String password = properties.getProperty("password");
  27.         String driver = properties.getProperty("driver");
  28.         String url = properties.getProperty("url");
  29.         //1. 注册驱动
  30.         Class.forName(driver);//建议写上
  31.         //2. 得到连接
  32.         Connection connection = DriverManager.getConnection(url, user, password);
  33.         //sql中的?就相当于占位符
  34.         String sql = "SELECT name, pwd FROM admin where name =  ? and pwd = ? ;";
  35.         //3. 得到PreparedStatement,这里的statement是实现了PreparedStatement接口的实现类的对象
  36.         PreparedStatement statement = connection.prepareStatement(sql);
  37.         //给 ? 赋值
  38.         statement.setString(1, admin_name);
  39.         statement.setString(2, admin_pwd);
  40.         //执行sql语句,如果执行的是dml语句要用executeUpdate()
  41.         ResultSet resultSet = statement.executeQuery();//()中不能再写sql语句,不然执行的就是带?的,填了sql语句就是调用了父类Statement的方法了
  42.         if (resultSet.next()) {//如果查询到一条记录,说明该管理员存在
  43.             System.out.println("恭喜,登录成功");
  44.         }else{
  45.             System.out.println("对不起,登录失败");
  46.         }
  47.         //关闭链接
  48.         resultSet.close();
  49.         statement.close();
  50.         connection.close();
  51.     }
  52. }
  53. //运行
  54. /*
  55. 请输入管理员名字:1' or
  56. 请输入管理员密码:or '1' = '1
  57. 对不起,登录失败
  58. */
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4