JDBC五种连接方式详解

2023-11-08


前言

        JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。

不同版本驱动连接不同版本数据库       

  • 5.1.7版本的驱动可以连接MySQL 5.7与MySQL 8.0

        5.1.37版本驱动只能连接MySQL 5.7
        连接url为url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8
        驱动名称为driverClass=com.mysql.jdbc.Driver

  • 8.0.11版本的驱动可以连接MySQL 5.7与MySQL 8.0

        连接url为url=jdbc:mysql://localhost:3306/test?                         characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true,必须加上时区参数serverTimezone
        驱动名称为driverClass=com.mysql.cj.jdbc.Driver

本文所用数据库版本为Mysql5.7版本


一、JDBC是什么?

        1.1、JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的 SQL 数据库存取和操作的公共接 (一组 API ),定义了用来访问数据库的标准 Java 类库,( java.sql,javax.sql )使用这些类库可以以一种 的方法、方便地访问数据库资源。
        通俗来讲, jdbc就是一堆接口,jdbc驱动就是这堆接口的实现类。
        1.2、 JDBC 的目标是使 Java 程序员使用 JDBC 可以连接任何 提供了 JDBC 驱动程序 的数据库系统,这样就使得程序员无需 对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
        1.3、如果没有JDBC我们开发过程是这样的:
        
        1.4、有了JDBC我们访问数据库是这样的:

二、JDBC程序编写步骤

1.总流程图如下

         补充:(1)ODBC(Open Database Connectivity,开放式数据库连接),是微软在Windows平台下推出的。使用者在程序中只需要调用ODBC API,由 ODBC 驱动程序将调用转换成为对特定的数据库的调用请求。

        (2)创建Connection对象就是获取数据库连接。

        (3)Statement对象执行sql语句。

        (4)Resultset对象相当于执行完语句以后的结果集。

2.五种连接方式

2.1、数据库连接方式一

@Test
public void testConnection1() {
    try {
        //1.提供java.sql.Driver接口实现类的对象 
        Driver driver = null; 
        driver = new com.mysql.jdbc.Driver(); 

        //2.提供url,指明具体操作的数据 
        String url = "jdbc:mysql://localhost:3306/test"; 

        //3.提供Properties的对象,指明用户名和密码 
        Properties info = new Properties(); 
        info.setProperty("user", "root"); 
        info.setProperty("password", "abc123"); 

        //4.调用driver的connect(),获取连接 
        Connection conn = driver.connect(url, info);
        System.out.println(conn);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

说明:上述代码中显示出现了第三方数据库的API。

2.2、数据库连接方式二

@Test
public void testConnection2() {
    try {
        //1.实例化Driver
        String className = "com.mysql.jdbc.Driver";
        Class clazz = Class.forName(className); 
        Driver driver = (Driver) clazz.newInstance();

        //2.提供url,指明具体操作的数据 
        String url = "jdbc:mysql://localhost:3306/test";

        //3.提供Properties的对象,指明用户名和密码 
        Properties info = new Properties(); 
        info.setProperty("user", "root"); 
        info.setProperty("password", "abc123");

        //4.调用driver的connect(),获取连接 
        Connection conn = driver.connect(url, info); 
        System.out.println(conn);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

说明:相较于方式一,这里使用反射实例化Driver,不在代码中体现第三方数据库的API。体现了面向接口编程思想。

2.3、数据库连接方式三

@Test 
public void testConnection3() { 
    try {
        //1.数据库连接的4个基本要素: 
        String url = "jdbc:mysql://localhost:3306/test"; 
        String user = "root"; 
        String password = "abc123"; 
        String driverName = "com.mysql.jdbc.Driver";

        //2.实例化Driver 
        Class clazz = Class.forName(driverName); 
        Driver driver = (Driver) clazz.newInstance();

        //3.注册驱动 
        DriverManager.registerDriver(driver);    

        //4.获取连接 
        Connection conn = DriverManager.getConnection(url, user, password);                         
        System.out.println(conn);
    } catch (Exception e) {
        e.printStackTrace();
    }

}
说明:使用 DriverManager 实现数据库的连接。体会获取连接必要的 4 个基本要素。

2.4、数据库连接方式四

@Test 
    public void testConnection4() { 
        try {
            //1.数据库连接的4个基本要素: 
            String url = "jdbc:mysql://localhost:3306/test"; 
            String user = "root"; 
            String password = "abc123"; 
            String driverName = "com.mysql.jdbc.Driver"; 

            //2.加载驱动 (①实例化Driver ②注册驱动) 
            Class.forName(driverName); 

            //Driver driver = (Driver) clazz.newInstance(); 
            //3.注册驱动 
            //DriverManager.registerDriver(driver); 
            /*
            可以注释掉上述代码的原因,是因为在mysql的Driver类中声明有: 
            static { 
                try {
                    DriverManager.registerDriver(new Driver()); 
                } catch (SQLException var1) { 
                    throw new RuntimeException("Can't register driver!"); 
                } 
            }
            
            */ 

            //3.获取连接 
            Connection conn = DriverManager.getConnection(url, user, password);                         
            System.out.println(conn); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
说明:不必显式的注册驱动了。因为在 DriverManager 的源码中已经存在静态代码块,实现了驱动的注册。

2.5、数据库连接方式五

@Test 
    public void testConnection5() throws Exception { 
        //1.加载配置文件 
        InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties"); 
        Properties pros = new Properties(); 
        pros.load(is); 
        
        //2.读取配置信息 
        String user = pros.getProperty("user"); 
        String password = pros.getProperty("password"); 
        String url = pros.getProperty("url"); 
        String driverClass = pros.getProperty("driverClass"); 

        //3.加载驱动
        Class.forName(driverClass); 

        //4.获取连接 
        Connection conn = DriverManager.getConnection(url,user,password);                 
        System.out.println(conn); 

    }

其中,配置文件声明在工程的src目录下 [jdbc.properties]

user=root 
password=abc123 
url=jdbc:mysql://localhost:3306/test 
driverClass=com.mysql.jdbc.Driver
说明:使用配置文件的方式保存配置信息,在代码中加载配置文件
 使用配置文件的好处:
         ①实现了代码和数据的分离,如果需要修改配置信息,直接在配置文件中修改,不需要深入代码(解耦)。
        ②如果修改了配置信息,省去重新编译的过程。

总结

这里对文章进行总结:本博客是对最近看的一下JDBC的一些课程进行的总结也算是复习。

如有不正确的地方还请指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDBC五种连接方式详解 的相关文章

  • Emacs 打字骨架对插入也许

    在 Eclipse 中 编辑 Java 代码时 如果我输入一个左括号 我会得到一对括号 如果我然后 输入 第二个括号 它不会插入额外的括号 我如何在 emacs 中得到它 Eclipse 编辑器足够聪明 当我输入闭括号时 它知道我刚刚完成了
  • Java 延迟/等待

    如何将 while 循环延迟到 1 秒间隔 而不减慢其运行的整个代码 计算机的速度到一秒延迟 只是一个小循环 Thread sleep 1000 do nothing for 1000 miliseconds 1 second
  • 将双精度转换为二进制表示形式?

    我尝试将双精度数转换为其二进制表示形式 但使用此Long toBinaryString Double doubleToRawLongBits d 没有帮助 因为我有大量数字 Long 无法存储它们 即2 900 Long toBinaryS
  • 如何在异常处理程序中访问访问请求主体

    我们有一个 Spring Boot 应用程序 我们的控制器期望在我们的端点之一中有一个 XML 文档元素 PostMapping value api v1 do stuff consumes APPLICATION XML VALUE pr
  • Java OR 运算符优先级

    如何在 Java 中以 if 的方式链接条件语句b是假的 不如不检查c If a and c是假的 并且b是真的 确实c会被检查吗 if a b c 我正在寻找 PHP 所拥有的类似功能 但两者之间存在差异OR and 爪哇 如果左操作数是
  • 写入作为 Jar 文件中的资源包含的 Java 属性文件

    有没有办法修改作为资源存储在 Jar 文件中的属性文件中的属性值 这就是我正在尝试处理的场景 我有一个属性文件作为资源存储在我的 Jar 文件中 有一些系统特定的属性 例如路径 我希望能够为我想要运行 Jar 文件的系统更改此设置 最好的解
  • Java 中内存高效的稀疏数组

    关于时间高效的稀疏数组存在一些问题 但我正在寻找内存效率 我需要相当于List
  • 在所有方法调用上允许类型见证有什么意义?

    假设我们有两种方法 如下所示 public static
  • 一起使用 String 和 int 时的 System.out.println 行为 [重复]

    这个问题在这里已经有答案了 考虑下面的代码片段 public class Student public static void main String args int a 3 int b 4 System out println a b
  • HYBRIS - 组件和插槽如何在 JSP 文件中工作?

    最近我正在使用 Hybris 我无法理解这些组件是如何工作的 我知道如何创建和定义一个 如何将它们添加到我想要的页面等 但我不明白如何使用该标签
  • Jackson 中没有注释的多态反序列化

    我有一个CloudEvent
  • Spring 非托管 bean 的依赖注入

    我有一个非托管的 JPA 域类 它是通过实例化的new操作员 UserAccount account new UserAccount userRepository save account In my UserAccount类 我有一个be
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例
  • Android中计算两个时间之间的差异

    我有两个字符串变量 例如 StartTime 和 EndTime 我需要通过用 StartTime 减去 EndTime 来计算 TotalTime StartTime和EndTime的格式如下 StartTime 08 00 AM End
  • 从 Brixton.RC1 开始的 ZuulProxy 未传递授权标头

    从 Spring Cloud 切换时Brixton M5 to Brixton RC1我的 ZuulProxy 不再通过Authorization标头下游到我的代理服务 我的设置中有各种各样的角色 但大多数都相当简单 Authorizati
  • 如何找到 JAR:/home/hadoop/contrib/streaming/hadoop-streaming.jar

    我正在练习有关 Amazon EMR 的复数视角视频教程 我被困住了 因为我收到此错误而无法继续 Not a valid JAR home hadoop contrib streaming hadoop streaming jar 请注意
  • 启动 Firefox 并等待其关闭

    Question 我想启动 Firefox 网络浏览器作为访问特定网站的过程 然后等到它关闭 一种特殊情况是浏览器可能已经打开并正在运行 因为用户可能已经访问过某个网站 在这种情况下 浏览器可能会在现有窗口中打开一个新选项卡 并且新启动的进
  • 在Java中将32bpp图像转换为16bpp图像

    如何使用 Java 库将 32bpp 图像 ARGB 转换为 16bpp 图像 ARGB 出于我的好奇 在像素级别 这种转换有什么作用 如果我有一个保存像素值 包含所有通道 的 int 值 那么在转换发生后该 int 会有什么不同 32 位
  • Swing:如何创建事件并将其分派给组件?

    我需要将一些事件发送到 Swing 中的组件 因此它的处理方式就像任何用户生成的标准 Swing 事件一样 基本上 类似于宏记录器 然后是 JEditorPane 的执行器 但我需要对生成的事件有更多的控制 所以 假设我有一个编辑 我想 捕
  • 只有创建视图层次结构的原始线程才能触摸其视图。在安卓上[重复]

    这个问题在这里已经有答案了 我只是一个初学者 所以请原谅我问一个可能愚蠢的问题 我不明白只有创建视图层次结构的原始线程才能触摸其视图的含义 请有人告诉我为什么会发生此错误以及如何解决此问题 ThankYou 这是我的班级 public cl

随机推荐