0


【MySQL 学习】深入探索JDBC(Java与数据库连接的桥梁)

📃个人主页:island1314

🔥个人专栏:MySQL学习

⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞


🚀引言

🔥在Java编程世界中,数据库操作是不可避免的一部分,无论是开发企业级应用还是简单的数据管理系统,都需要与数据库进行交互。而 JDBC(Java Database Connectivity)正是Java提供的一套用于连接和访问数据库的API(应用程序接口)。通过JDBC,Java程序能够执行 SQL(Structured Query Language)语句,实现数据的查询、更新、插入和删除等操作。

1. JDBC 的介绍

☘️1.1 基本概念

🔥JDBC(Java Database Connectivity)是Java的一个标准扩展,是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范。这个APIjava.sql.、javax.sql. 包中的一些类和接口组成。为Java开发人员操作数据库提供了一个标准的API,用于访问数据库。这意味着,只要数据库支持JDBC,那么任何Java程序都可以通过这套API与数据库进行交互,而无需担心底层数据库的具体实现细节。

🍀1.2 工作原理

JDBC访问数据库层次结构:

💢JDBC的工作原理可以概括为以下几个步骤:

① 加载和注册JDBC驱动:通过

Class.forName()

方法加载JDBC驱动,并将其注册到

DriverManager

中。(注:这个mysql5之后可以省略注册驱动的步骤。在jar包中,存在一个java.sql.Driver配置文件,文件中指定了com.mysql.jdbc.Driver,我们下面主要使用的是 DataSource 来建立数据库连接)

Class.forName("com.mysql.cj.jdbc.Driver");

② 建立数据库连接:使用

DriverManager.getConnection()

方法,根据提供的数据库URL、用户名和密码等信息,建立与数据库的连接。

Connection conn = DriverManager.getConnection(url, user, password);

③ 执行SQL语句:通过

Connection

对象创建

Statement

PreparedStatement

对象,然后使用这些对象执行SQL语句,根据类型不同,可以使用不同的方法。

Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM table_name"); // 查询
int rowsAffected = stmt.executeUpdate("INSERT INTO table_name VALUES (...)"); // 插入

④ 处理查询结果:如果执行的是查询操作,结果将存储在

ResultSet

对象中,那么可以通过

ResultSet

对象遍历查询结果。

while (rs.next()) {
    System.out.println(rs.getString("column_name"));
}

⑤ 事务管理:JDBC 允许进行手动事务控制。可以设置自动提交为

false

,并在需要时提交或回滚事务 (这个暂时不涉及)

conn.setAutoCommit(false); // 关闭自动提交
// 执行多条 SQL 语句
conn.commit(); // 提交
// 或者
conn.rollback(); // 回滚

⑥ 关闭连接:操作完成后,需要关闭

ResultSet

Statement

Connection

对象,以释放数据库资源。

rs.close();
stmt.close();
conn.close();

🌿1.3 JDBC 的优缺点

🌈JDBC的优点
  1. 标准化:JDBC提供了一套标准接口,使得开发者能够以一致的方式与各种数据库交互。这降低了对不同数据库产品的依赖,增强了应用程序的可移植性和可维护性。
  2. 平台无关性:由于JDBC是Java技术的一部分,因此它继承了Java“一次编写,到处运行”的特性,可以在任何支持Java的平台上使用。
  3. 增强的开发效率:JDBC简化了数据库访问的复杂性,开发者可以通过简单的API调用来执行SQL命令,减少了代码量和出错的机会。
  4. 丰富的功能:JDBC支持多种数据库操作,包括查询、更新、事务处理等,同时还提供了对高级功能的支持,如存储过程调用、结果集的滚动和更新等。
  5. 安全性:通过使用预编译的SQL语句(PreparedStatement),可以有效防止SQL注入攻击,提高了应用程序的安全性。
  6. 广泛的应用支持:JDBC支持多种数据库管理系统(DBMS),如MySQL、Oracle、SQL Server、PostgreSQL等,这意味着开发者可以使用一套技能访问多种数据库。
  7. 社区支持:由于JDBC已经存在了很长时间并且被广泛采用,所以围绕它有一个庞大的开发者社区。当遇到问题时,容易找到解决方案或寻求帮助。
  8. 与框架的兼容性:很多流行的Java框架(如Spring、Hibernate等)都内置了对JDBC的支持,了解JDBC可以让人更好地理解和使用这些框架。
🌈JDBC的缺点
  1. 连接管理复杂:在JDBC中,每次用户请求都需要向数据库获取连接,而数据库连接的创建和销毁过程相对耗时且资源消耗大。尤其是在高并发场景下,频繁的创建和销毁连接会成为性能瓶颈。虽然可以通过连接池技术来优化,但实现和维护连接池也需要额外的开销。
  2. 代码冗余:在JDBC中,处理数据库连接、关闭、异常处理等代码经常需要重复编写,这增加了代码的冗余性和维护难度。
  3. SQL语句分散:在JDBC中,SQL语句通常直接嵌入到Java代码中,这可能导致SQL语句与业务逻辑代码紧密耦合,难以维护。特别是在大型项目中,SQL语句的分散可能使得项目的管理和维护变得更加困难。
  4. 灵活性不足:虽然JDBC提供了执行SQL语句的能力,但在处理复杂查询和动态SQL时,其灵活性可能不如一些更高级的ORM(对象关系映射)框架。此外,JDBC中的参数传递方式(如使用占位符)也可能在一定程度上限制了其灵活性。
  5. 性能开销:在某些情况下,由于JDBC直接与数据库交互,没有中间层进行优化,因此可能会带来一定的性能开销。当然,这种开销通常可以通过合理的数据库设计和查询优化来减轻。

2. 如何使用 JDBC

下面我们以 IDEA 这个应用为例

2.1 下载驱动包

方法一:

1.打开 MySQL 官网:https://www.mysql.com/ mysql官网
2.点击 downloads,把页面滚动到最下面,点击 MySQL Community (GPL) Downloads


3.点击 Connector/J


4.点击 General Availability(GA) Releases,在 Select Operating System 下拉列表选择 Platform Independ

方法二:

1.从中央仓库 /https://mvnrepository.com/ 下载MySQL 的 jdbc 驱动包(jar)
2.点击 搜索框,搜索 MySQL,打开 -j

  1. 选择对应版本的驱动包,比如MySQL 是 5,驱动包也用 5 系列。

2.2 导入驱动包

将mysql的驱动包放在模块下的lib(自己创建并命名的文件夹)目录下,并将该jar添加为库文件。

2.3 建立数据库连接

public class JDBCDemo01 {
    public static void main(String[] args) throws Exception{
        -- 1.导入jar包
        -- 2.加载JDBC驱动程序:反射,这样调用初始化com.mysql.jdbc.Driver类,即将该类加载到JVM方法区,并执行该类的静态方法块、静态属性。
        Class.forName("com.mysql.jdbc.Driver");

        -- 3.获取连接 (连接的数据库名是db2,第二个第三个参数是连接数据库的用户名密码)
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?
user=root&password=root&useUnicode=true&characterEncoding=UTF-8","root","123456");
        
        //MySQL数据连接的URL参数格式如下:
//jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值        
            
        -- 4.获取执行者对象 (statement:表现,声明,跟程序意思不匹配)
        Statement stat = conn.createStatement();

        -- 5.执行sql语句,并且接收结果
        String sql = "SELECT * FROM user";
        ResultSet rs = stat.executeQuery(sql); //execute执行,query:查询,resultset:结果集

        -- 6.处理结果
        while(rs.next()) {
            System.out.println(rs.getInt("id") + "\t" + rs.getString("name"));
        }

        -- 7.释放资源
        conn.close();
        stat.close();
        conn.close();
    }
} 

3. JDBC 常用接口和类

🥝3.1 JDBC API

💢在Java JDBC编程中对数据库的操作均使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全解耦的。所以掌握Java JDBC API (位于 java.sql 包下) 即可掌握Java数据库编程。

🥑3.2 数据库连接Connection

Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:

  • 一种是通过DriverManager(驱动管理类)的静态方法获取:
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);
  • 一种是通过DataSource(数据源)对象获取。实际应用中会使用DataSource对象。
DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("root");
Connection connection = ds.getConnection();

以上两种方式的区别是:

  1. DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接。
  2. DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Conncetion连接对象回收。

🍉3.3 Statement对象

Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象

💢实际开发中最常用的是PreparedStatement对象,以下对其的总结:

💢主要掌握两种执行SQL的方法:

  1. executeQuery() 方法执行后返回单个结果集的,通常用于select语句
  2. executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句

🍋‍🟩3.4 ResultSet对象

  • ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问。
  • ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。

🔥3.5 典例

public class Demo1 {    
    public static void main(String[] args) throws SQLException {

        //URL语法格式如下
        //jdbc:mysql:是固定的写法,后面跟主机名localhost,3306是默认的MySQL端口号
        //serverTimezone=UTC是指定时区时间为世界统一时间  // 这个需要带上
        //useUnicode=true是指是否使用Unicode字符集,赋值为true
        //characterEncoding=utf-8是指定字符编码格式为UTF8
        //Connection conn=null;
        //Connection接口代表Java程序和数据库的连接对象,只有获得该连接对象后,才能访问数据库,并操作数据表

        // 1、先创建DataSource
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf-8&useUnicode=false"); // 向下转型
    
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");

        // 2. 建立和数据库服务器之间的连接,连接好了之后,才能进行后续的 请求 -- 响应 交互
       Connection connection = dataSource.getConnection();

       // 3. 构造 sql (代码中的  sql 不需要写 ;)
        //String sql = "insert into student values(1, '张三')";
        String sql = "delete from student where id = 1";
        PreparedStatement statement = connection.prepareStatement(sql);

        // 4. 把 sql 发给 服务器,返回值是一个整数,表示影响到的行数。
        int n = statement.executeUpdate();
        System.out.println("n = " + n);

        // 5. 执行完毕之后,最后一个步骤,关闭连接,释放资源。 注:是后获取到的资源,先释放
        statement.close();
        connection.close();
    }
}

4. 使用案例

假如存在一个名叫 test 的数据库,其有一个 student 这样的表,如下:

select * from student;
+------+-----------+
| id   | name      |
+------+-----------+
|  100 | 李四      |
|    2 |           |
|   23 |           |
|    3 |           |
|    2 | zhangsan  |
+------+-----------+

我们想要通过 jdbc 代码来查询 student 表中 id = 2 的行,使用如下:

import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Demo2 {
    public static void main(String[] args)throws SQLException {
        // 1. 创建DataSource
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf-8&useUnicode=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");

        // 2. 建立连接
        Connection connection = dataSource.getConnection();

        // 3. 构造 sql
        String sql = "select * from student where id = 2";
        PreparedStatement statement = connection.prepareStatement(sql);

        // 4. 执行sql (和 demo1 不同)
        // Resulset 就表示查询的 结果集合(临时表)
        ResultSet resultSet = statement.executeQuery(); //返回的是结果集合

        // 5, 遍历结果集合
        // 通过 next 方法 就可以获取到临时表的每一行数据,如果获取到最后一行之后,再进行 next 返回 false,循环结束
        while(resultSet.next()){
            // 针对这一行进行处理
            // 取出列的数据
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println("id = " + id + ", name = " + name);
        }

        // 6. 释放资源
        resultSet.close();;
        statement.close();
        connection.close();
    }
}

//结果显示如下:
id = 2, name = 
id = 2, name = zhangsan

📖总结

💢由上面我们学习到了 驱动包的导入,以及了解到了JDBC(Java Database Connectivity)作为Java提供的一套用于数据库连接的API,允许Java程序通过SQL语句与数据库进行交互,实现数据的增删改查等操作。JDBC简化了数据库访问的复杂性,提高了Java程序的可移植性和灵活性。

💞 💞 💞那么本篇到此就结束,希望我的这篇博客可以给你提供有益的参考和启示,感谢大家支持!!!祝大家天天开心

标签: sql 数据库

本文转载自: https://blog.csdn.net/island1314/article/details/142422945
版权归原作者 IsLand1314~ 所有, 如有侵权,请联系我们删除。

“【MySQL 学习】深入探索JDBC(Java与数据库连接的桥梁)”的评论:

还没有评论