JDBC 拾枝杂谈—入门篇(通俗易懂)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: JDBC 第一节 拾枝杂谈 带你快速入门!

目录

一、前言

二、JDBC介绍

       1.基本概述 :

       2.基本原理 :

三、JDBC模拟

       1.模拟接口 :

       2.模拟实现类 :

       3.模拟测试类 :

       4.模拟扩展 :

四、JDBC入门

       1.编写JDBC程序的核心四部曲 : (全文背诵)

       2.准备工作 :

               ①导入jar包

               ②创建测试表

       3.代码演示 :

五、总结


一、前言

    • 开门见山,6.6日开始我们正式进入JDBC的学习,该系列博文适合有一定Java基础MySQL基础的小伙伴儿们,感谢各位阅读本篇博文的佬们🌹🌹!
    • 第一节内容,up主要和大家分享一下JDBC的基本原理,JDBC的简单模拟,以及第一个JDBC程序的演示
    • 关于注意事项,还是老规矩——代码中的注释也很重要;不要眼高手低;点击文章的侧边栏目录或者文章开头的目录可以进行跳转。
    • 良工不示人以朴,所有文章都会适时补充完善。大家如果有问题都可以在评论区进行交流或者私信up。感谢阅读!

    二、JDBC介绍

          1.基本概述 :

           JDBC全称"Java DataBase Connectivity",直译Java数据库连接;JDBC是Java提供的一套用于数据库访问的应用程序API,由一组接口和类构成(主要位于java.sql和javax.sql包下),Java程序⚪只需要面向这套接口编程即可

           JDBC为访问不同的数据库提供的标准统一的接口,并且为使用者屏蔽了细节问题。Java人使用JDBC,可以连接任何提供了JDBC驱动程序的DBS(数据库操作系统),从而完成对DB(数据库)的各种操作。

          2.基本原理 :

                   在MySQL系列博文中我们说到——使用Java程序来操作DBMS(数据库管理系统),是访问DBMS最常用的途径,没有之一。那么,请大家思考一个问题——Java程序是如何操作数据库的?

                   直接访问?显然不太现实。因为Java目前是Oracle旗下的产品,如果我们想通过Java程序来访问DB2数据库(IBM旗下),或者是SQL Server数据库(微软旗下),由于不同公司旗下的DBMS底层结构不完全相同,所以大概率你是无法通过Java程序直接访问的。

                   那么,假设,即便可以直接访问,为了访问不同公司的数据库产品,我们就需要在Java程序中定义不同的方法,如下图所示 :

    image.gif编辑

                   明眼人一看就懂,瞎🐓⑧扯🥚。我们面向对象学了那么久,基本的思想还是有的。如果不同的数据库都要定义不同的方法来访问,显然不利于Java程序的管理。

                   那么,新的问题来了——怎么办?(🐔:哎哟,你干嘛~)(bushi)

                   幸好,比我们🐂🖊一千倍的人多了去。这些个🐂B人聚在一起,时间一长自然想出了牛逼方法——在Java中规定一套接口规范,并让不同的数据库厂商去实现这组接口,程序员只需要在Java程序中调用接口的方法即可(接口的多态)

                   当然,由于不同的数据库底层结构不同,它们在实现这组接口时,具体的实现方式肯定会有差异,但是大方向上均遵循接口定义的规范。牛逼方法的实现如下图所示 :

    image.gif编辑

                   上图中,“实现接口的一组类”称为驱动类,也简称为驱动,会打包到一个.jar文件中。例如,MySQL驱动如下 :

    image.gif编辑

                   若DBMS发生了更新,只需要更新用于连接的jar包即可,利于维护。


    三、JDBC模拟

           1.模拟接口 :

           时隔多日,终于要再次使用IDEA。我们新建一个项目JDBC_Demo,并新建一个模拟规范的接口Jdbc_Simulation代码如下 :

    package introduction.simulation;
    /**
     * @author : Cyan_RA9
     * @version : 21.0
     */
    public interface Jdbc_Simulation {
        //开启连接
        public Object linking();
        //数据库的"CRUD"
        public void crud();
        //关闭连接
        public void close();
    }

    image.gif

          2.模拟实现类 :

                   以Jdbc_To_MySQL类为模拟的实现类,实现Jdbc_Simulation接口,代码如下 :

    package introduction.simulation;
    /**
     * @author : Cyan_RA9
     * @version : 21.0
     */
    public class Jdbc_To_MySQL implements Jdbc_Simulation{
        @Override
        public Object linking() {
            System.out.println("连接到MySQL数据库");
            return null;
        }
        @Override
        public void crud() {
            System.out.println("执行MySQL的增删查改");
        }
        @Override
        public void close() {
            System.out.println("关闭MySQL连接");
        }
    }

    image.gif

          3.模拟测试类 :

                   以Test_Jdbc类为测试类,在测试类中通过接口的多态,调用实现类的方法Test_Jdbc类代码如下 :

    package introduction.simulation;
    public class Test_Jdbc {
        public static void main(String[] args) {
            Jdbc_Simulation js = new Jdbc_To_MySQL();
            js.linking();
            js.crud();
            js.close();
        }
    }

    image.gif

                   运行结果 :

    image.gif编辑

          4.模拟扩展 :

                   若我们还想进行Oracle数据库的连接,同样可以进行模拟,只需要重新定义一个类去实现Jdbc_Simulation接口,然后更改测试类中的调用逻辑即可。我们定义一个Jdbc_To_Oracle类,代码如下 :

    package introduction.simulation;
    /**
     * @author : Cyan_RA9
     * @version : 21.0
     */
    public class Jdbc_To_Oracle implements Jdbc_Simulation{
        @Override
        public Object linking() {
            System.out.println("连接到Oracle数据库");
            return null;
        }
        @Override
        public void crud() {
            System.out.println("执行Oracle的增删查改");
        }
        @Override
        public void close() {
            System.out.println("关闭Oracle连接");
        }
    }

    image.gif

                   对于调用类,扩展更加方便。某些情况下,都不需要去定义新的类,直接更改接口多态中new出的实现类对象即可,底层会根据动态绑定机制自动调用相应的方法

                   测试类Test_Jdbc代码如下 :

    package introduction.simulation;
    public class Test_Jdbc {
        public static void main(String[] args) {
            //操作MySQL数据库
            Jdbc_Simulation js = new Jdbc_To_MySQL();
            js.linking();
            js.crud();
            js.close();
            System.out.println("====================================");
            //操作Oracle数据库
            Jdbc_Simulation js2 = new Jdbc_To_Oracle();
            js2.linking();
            js2.crud();
            js2.close();
        }
    }

    image.gif

                   运行结果 :

    image.gif编辑

                   OK,经过这个小小的模拟,我们可以较为明显地感受到——接口编程带来的好处——极大地丰富了程序的可扩展性和可维护性,即统一调用的问题

                   当然,在实际情况中,实现JDBC要比这复杂的多,但是逻辑上是一致的。


    四、JDBC入门

           1.编写JDBC程序的核心四部曲 : (全文背诵

                    注册驱动——加载Driver类

                    获取连接——得到Connection

                    执行SQL——发送crud相关的SQL给MySQL执行,如果是查询操作会返回结果。

                    释放资源——关闭相关连接

           2.准备工作 :

                   ①导入jar包

                   首先,在IDEA的项目下新建一个目录libs,如下图所示 :

    image.gif编辑

    image.gif编辑

                   接着,将MySQL中Connector_J包下的mysql-connector-j-8.0.33.jar文件拷贝到libs目录下,如下图所示 :

    image.gif编辑

                   右键该jar文件,选择"Add as Library...",如下图所示 :

    image.gif编辑

                   出现提示框后,点击OK即可。加入成功后可以看到内容显示,如下图所示 :

    image.gif编辑

                   ②创建测试表

                   在MySQL中新建一个jdbc_ex数据库,用于存放jdbc的测试内容。在jdbc_ex数据库下新建一个学生表stus,代码如下 :

    CREATE TABLE IF NOT EXISTS `stus`(
        `id` MEDIUMINT PRIMARY KEY AUTO_INCREMENT,
        `name` VARCHAR(64) NOT NULL DEFAULT '',
        `sex` CHAR(16) NOT NULL DEFAULT 'female',
        `score` DECIMAL(5,1) NOT NULL DEFAULT 0.0
    ) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;
    SELECT * FROM stus;

    image.gif

    image.gif编辑

           3.代码演示 :

                   up以Jdbc_1类作为演示类,代码如下 : 注释很重要

    package introduction.example;
    import com.mysql.cj.jdbc.Driver;    //注意,高版本要用cj包下的jdbc.Driver;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    public class Jdbc_1 {
        public static void main(String[] args) throws SQLException {
    //JDBC核心四部曲 :
        //1.注册驱动
            /*
                使用“new com.mysql.cj.jdbc.Driver().var”来获取Driver对象,
                会自动导包。
             */
            Driver driver = new Driver();
        //2.获取连接
            String url = "jdbc:mysql://localhost:3306/jdbc_ex";
            /*
                1° jdbc:mysql://,固定格式,表示协议,通过JDBC的方式连接到MySQL;
                2° localhost表示本机,此处也可以是IP地址;
                3° 3306表示MySQL默认的监听端口;
                4° jdbc_ex表示具体要连接的MySQL DBMS的数据库;
                5° JDBC连接MySQL的本质就是Socket套接字连接。
             */
            //将登录用户的用户名和密码放入Properties对象(key的格式固定,value按实际情况)
            Properties properties = new Properties();
            properties.setProperty("user","root");
            properties.setProperty("password","RA9_Cyan");
            //正式获取连接
            Connection connect = driver.connect(url, properties);
        //3.执行SQL
            String sql = "INSERT INTO stus " +
                                "VALUES" +
                                "(NULL,'Cyan', 'male', 420)," +
                                "(NULL,'Ice', 'male', 419);";
            Statement statement = connect.createStatement();
            int i = statement.executeUpdate(sql);
            /*
                1° 使用Connection对象的createStatement()方法可以获取到Statement对象,
                    Statement对象用于执行静态SQL,并返回其生成的结果对象;
                2° Statement类的executeUpdate方法可以执行传入的sql语句,
                    若执行的SQL为DML,其返回结果i表示影响的行数。Affected rows : i,
             */
            System.out.println(i > 0 ? "Successfully" : "Failed");
        //4.释放资源
            statement.close();
            connect.close();
        }
    }

    image.gif

                   运行结果 :

    image.gif编辑

                   在Navicat中查询jdbc_ex数据库中的stus表,查看执行效果,如下图所示 :

    image.gif编辑

                   This isn't the end. 继续,修改要执行的SQL语句, 测试Update和Delete,如下所示 :

    /*
                !!! :
                注意,如果像up这样换行,表名后必须加空格。
             */
            String sql = "UPDATE stus " +
                                "SET `name` = 'Five', sex = 'female'" +
                                "WHERE id = 2;";

    image.gif

                   运行结果 :

    image.gif编辑

    image.gif编辑

                   最后再来测试一下DELETE语句,如下 :

    String sql = "DELETE FROM stus " +
                                "WHERE `name` = 'Cyan';";

    image.gif

                   运行效果 :  

    image.gif编辑

    image.gif编辑


    五、总结

      • 🆗,以上就是JDBC——第一小节的全部内容了。大家能搞清楚JDBC的原理,以及JDBC程序编写的核心四部曲就足够了。
      • 下一小节内容是JDBC——API,我们不见不散。感谢阅读!

             System.out.println("END--------------------------------------------------------------------------");

      相关实践学习
      如何快速连接云数据库RDS MySQL
      本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
      全面了解阿里云能为你做什么
      阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
      目录
      相关文章
      |
      SQL druid Java
      JDBC BasicDAO详解(通俗易懂)
      JDBC 第七节 详解BasicDAO 通俗易懂!
      162 0
      |
      SQL 安全 Java
      JDBC Apache—DBUtils 详解(通俗易懂)
      JDBC 第六节 ApacheDBUtils详解!
      399 0
      |
      监控 druid Java
      JDBC 连接池 详解(通俗易懂)
      JDBC 第五节 详解连接池 通俗易懂!
      564 0
      |
      SQL Java 关系型数据库
      JDBC 事务和批处理 详解(通俗易懂)
      JDBC 第四节 事务和批处理详解!
      325 0
      |
      SQL Java 数据库连接
      JDBC Utils 详解(通俗易懂)
      JDBC 第三节 Utils工具类详解!
      113 0
      |
      SQL 存储 Java
      JDBC API 万字详解(通俗易懂)
      JDBC 第二节 详解API 通俗易懂!
      415 0
      |
      2月前
      |
      Java 关系型数据库 MySQL
      mysql5.7 jdbc驱动
      遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
      485 1
      |
      2月前
      |
      SQL 分布式计算 关系型数据库
      Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
      Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
      110 0
      |
      2月前
      |
      SQL 分布式计算 关系型数据库
      Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
      Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
      51 0
      |
      2月前
      |
      SQL 分布式计算 关系型数据库
      Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
      Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
      60 0