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

标题: Java-Web-JDBC(尊师黑马) [打印本页]

作者: 守听    时间: 昨天 00:24
标题: Java-Web-JDBC(尊师黑马)
简介

JDBC 是 Java 提供的一种 API,用于毗连和操纵关系性数据库。它为 Java 提供了一种同一的接口,允许开发者通过一套 Java 代码与不同的数据库进行交互。涉及 SPI 机制,由 Java 语言提供一套标准的 JDBC 接口,由各个数据库服务厂商(MySQL、Oracle 等)做具体实现(驱动)。
其优点是可以随意替换底层的数据库,访问数据库的 Java 代码根本不变。
快速入门

起首必要确保 MySQL 已经下载而且启动服务。
处理查询语句
  1. // 数据库连接参数
  2. String url = "jdbc:mysql://localhost:3306/test";
  3. String username = "your_username";
  4. String password = "your_password";
  5. Connection conn = null;
  6. Statement stmt = null;
  7. ResultSet rs = null;
  8. try {
  9.     // 1. 获取数据库连接
  10.     conn = DriverManager.getConnection(url, username, password);
  11.     // 2. 创建 Statement 对象
  12.     stmt = conn.createStatement();
  13.     // 3. 执行查询语句
  14.     String query = "SELECT * FROM your_table";
  15.     rs = stmt.executeQuery(query);  // 执行查询并返回结果集
  16.     // 4. 处理查询结果
  17.     while (rs.next()) {
  18.         System.out.println("Column 1: " + rs.getString(1));
  19.         System.out.println("Column 2: " + rs.getString(2));
  20.     }
  21. } catch (SQLException e) {
  22.     e.printStackTrace();
  23. } finally {
  24.     try {
  25.         // 5. 关闭资源
  26.         if (rs != null) rs.close();
  27.         if (stmt != null) stmt.close();
  28.         if (conn != null) conn.close();
  29.     } catch (SQLException e) {
  30.         e.printStackTrace();
  31.     }
  32. }
复制代码
API 详解

DriverManager

DriverManager 是用于管理一组数据库驱动的类。它负责选择符合的数据库驱动程序,并建立与数据库的毗连。DriverManager 是 JDBC 毗连池的一部分,它提供了一个简朴的接口来得到数据库毗连。
驱动注册

我们可以查看注册驱动时使用的 Driver 类:

Ctrl B 查看其源码发现,其内部有一个静态代码块中正是调用了 DriverManager 中的注册方法,而这个静态代码块会随着类的加载而加载。

其着实 MySQL 5 的版本之后,可以不显式使用 DeiverManager.register() 方法也能成功注册驱动,即将 Class.forName() 这一行注释掉依然能够运行成功。这是因为 JDBC 4.0 引入了主动加载驱动程序的机制。只要 JDBC 驱动的 JAR 文件存在于类路径中,而且该驱动的 META-INF/services/java.sql.Driver 文件已经设置好,JDBC 驱动就会主动注册到 DriverManager。

获取毗连

通过查看 DriverManager 的源码可以发现其中有一个 getConnection 方法,正是用于获取数据库毗连。

其中必要传入三个参数:

Connection

在 JDBC 中,Connetion 代表了与数据库的毗连。通过 Connection 对象,应用程序可以实行 SQL 查询、更新数据库、管理事务等操纵。
它的功能包罗:
获取数据库毗连


Connection 方法

获取实行 SQL 的对象


事务方法


事务管理演示
先摆设好事务管理的代码:
  1. //1. 注册驱动
  2. Class.forName("com.mysql.jdbc.Driver");
  3. //2. 获取连接
  4. String url = "jdbc:mysql:///test?useSSL=false";
  5. String username = "root";
  6. String password = "1234";
  7. Connection conn = DriverManager.getConnection(url, username, password);
  8. //3. 定义sql
  9. String sql1 = "update account set money = 3000 where id = 1";
  10. String sql2 = "update account set money = 3000 where id = 2";
  11. //4. 获取执行sql的对象 Statement
  12. Statement stmt = conn.createStatement();
  13. //开启事务
  14. conn.setAutoCommit(false);
  15. try {
  16.     //5. 执行sql
  17.     int count1 = stmt.executeUpdate(sql1);//受影响的行数
  18.     //6. 处理结果
  19.     System.out.println(count1 > 0 ? "修改成功" : "修改失败");
  20.     //5. 执行sql
  21.     int count2 = stmt.executeUpdate(sql2);//受影响的行数
  22.     //6. 处理结果
  23.     System.out.println(count2 > 0 ? "修改成功" : "修改失败");
  24. } catch (Exception e) {
  25.     //回滚事务
  26.     conn.rollback();
  27.     System.out.println("出错已回滚");
  28.     e.printStackTrace();
  29. }
  30. //提交事务
  31. conn.commit();
  32. //7.释放资源
  33. stmt.close();
  34. conn.close();
复制代码
此时程序是没有非常的,我们来看实行结果:

如今,在 sql1 的实行结果后面加上一条非常语句:

此时可以看到,IDEA 已经主动将 sql2 的处理语句变灰,提示不会实行下面代码,来看实行结果:

果然,在抛出非常的同时,事务进行了回滚。回滚之后,由于事务的原子性,此时 sql1 对数据库的修改也是不成功的。
Statement

Statement 是 JDBC 中用于实行 SQL 查询、更新和其他数据库操纵的接口。它用于向数据库发送 SQL 语句,并吸收数据库返回的结果。Statement 是 JDBC 最根本的接口之一,通常用于实行简朴的 SQL 语句。
常见方法


常见实现

Statement

用于实行没有参数的静态 SQL 查询。每次实行时都会重新编译 SQL 语句,因此效率较低,尤其是在必要重复实行雷同 SQL 时。
  1. Statement stmt = conn.createStatement();
  2. ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
复制代码
PreparedStatement

用于实行带有参数的预编译 SQL 语句。相比 Statement,它进步了实行效率并避免了 SQL 注入攻击。
  1. String sql = "SELECT * FROM employees WHERE id = ?";
  2. PreparedStatement pstmt = conn.prepareStatement(sql);
  3. pstmt.setInt(1, 1); // 设置参数
  4. ResultSet rs = pstmt.executeQuery();
复制代码
CallableStatement

用于调用存储过程。
  1. String sql = "{call getEmployeeDetails(?)}"; // 存储过程调用
  2. CallableStatement cstmt = conn.prepareCall(sql);
  3. cstmt.setInt(1, 1); // 设置存储过程参数
  4. ResultSet rs = cstmt.executeQuery();
复制代码
ResultSet

在 JDBC 中,ResultSet 是用于表示查询结果的数据布局,它存储从数据库查询返回的数据,并提供方法来访问和处理这些数据。
方法


示例

  1. //1. 注册驱动
  2. Class.forName("com.mysql.jdbc.Driver");
  3. //2. 获取连接
  4. String url = "jdbc:mysql:///test?useSSL=false";
  5. String username = "root";
  6. String password = "1234";
  7. Connection conn = DriverManager.getConnection(url, username, password);
  8. //3. 定义sql
  9. String sql = "select * from account";
  10. //4. 获取执行sql的对象 Statement
  11. Statement stmt = conn.createStatement();
  12. //5.执行sql
  13. ResultSet resultSet = stmt.executeQuery(sql);
  14. //6. 处理结果
  15. while(resultSet.next()){
  16.     int id = resultSet.getInt("id");
  17.     String name = resultSet.getString("name");
  18.     int money = resultSet.getInt("money");
  19.     System.out.println(id + " " + name + " " + money);
  20. }
复制代码
查询结果

PreparedStatement

PreparedStatement 是 JDBC 中用于实行预编译 SQL 查询的接口,它相较于 Statement 更高效、安全。通过 PreparedStatement,SQL 查询在实行前被编译,而且可以多次实行,得当重复实行传入不同参数的雷同的 SQL。
使用


SQL 注入

SQL 注入发生在应用程序没有正确处理用户输入的情况下,攻击者通过注入恶意的 SQL 语句来干扰数据库的正常实行逻辑。通常,注入点存在于拼接 SQL 查询字符串的地方。
假设有一条 sql:
  1. String sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";
复制代码
如果用户输入:username = admin 和 password = ' OR '1' = '1,那么生成的 SQL 查询将酿成:
  1. SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1' = '1'
复制代码
该查询总是返回结果,因为 ‘1’ = ‘1’ 总为真,攻击者通过这种方式绕过了暗码验证。
预编译防止 SQL 注入

PreparedStatement 的一个关键特性是 SQL 查询在实行之前会被预编译,而且用户输入的参数(如用户名、暗码等)不会直接拼接进查询字符串中,而是通过参数占位符 传递给数据库。数据库引擎会将这些占位符与传入的参数分别处理,避免了直接在查询中插入用户提供的恶意 SQL 代码。
防止 SQL 注入的重点在于实行之前的编译以及 占位符,对应的参数值会根据其数据范例安全地传递到数据库,不会被当作 SQL 代码实行。
数据库毗连池

数据库毗连池是一种能够复用毗连来进步数据库访问效率的技能,可以看作是一个容器,负责分配、管理数据库毗连。它通过创建一组数据库毗连并在多个请求之间共享这些毗连,避免了频仍的建立和关闭数据库毗连所带来的性能开销。

工作原理

数据库毗连池的根本思想是事先创建一定数量的数据库毗连,将这些毗连保存在池中。当应用程序必要访问数据库时,它从毗连池中获取一个毗连,实行完操纵后,将毗连返回毗连池,而不是直接关闭毗连。这样,下次必要数据库毗连时,应用程序可以直接从池中获取,而不必要重新建立毗连。
如果新请求到来时毗连池毗连已经用完怎么办?

毗连实现

DataSource 是 sun 公司提供的数据库毗连池标准接口,由第三方来实现次接口。
常见的数据库毗连池:

Druid 演示


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




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