up:: 标准的JDBC范例 本篇博客主要内容:分析JDBC的第1,第2步骤;


1.下载MySQL驱动

要完成对数据库的操作,其本质是JDBC通过对应数据库的驱动程序完成与数据库的交互操作;

JDBC是一个标准的接口,即定义了一套规范;

每一个数据库的厂商都要根据JDBC的要求开发一系列的驱动程序,来完成与数据库的交互操作。

So,这些JDBC的驱动程序如何获取?去数据库厂商的官网获取;以获取MySQL的驱动程序为例:

因为,是java开发,所以自然下载JDBC的那一个;


2.将驱动添加到工程中(或者说是替换旧的驱动)


3.JDBC驱动程序分析

(3.1)Class.forName(dbDriver)部分:加载驱动类

只有加载了JDBC的驱动类以后,JDBC才知道要使用指定的驱动类对对应的数据库进行操作,通过这个驱动类去操作对应的数据库;

不同数据库的JDBC驱动类(加载驱动类的时候使用)不同:


(3.2):Connection对象

Connection connection = DriverManager.getConnection(dbURL,dbUsername,dbPassword)部分:Connection对象

DriverManager:设备管理器;提供了getConnection()静态方法;

【Connection connection = DriverManager.getConnection(dbURL,dbUsername,dbPassword);】即getConnection()方法返回的对象是一个Connection接口;所有JDBC默认提供的一定是接口,具体的实现交由厂商的驱动程序来完成。

不同数据库的连接字符串(创建数据库连接的时候使用)不同:

当成功创建了数据连接这个Connection对象以后,就可以基于这个对象对数据库进行增删改查的操作了。


Connection对象:

Connection对象 对应于数据库的物理网络连接,对应着Java程序和数据库之间通信的网络桥梁。

如下图:

● 在实际中,会单独部署一台MySQL数据库,每一个JDBC应用通过网络远程的访问这个数据库;JDBC应用就相当于是一个客户端,MySQL数据库是一个服务的提供者,这是典型的C/S架构。

● 客户端服务器模式下,要进行网络通信肯定是基于TCP/IP协议,在这个协议基础之上,由JDBC提供了一个接口对其进行了对应,这个接口就是Connection,而Connection接口的具体实现着就是MySQL的厂商来实现的,即MySQL的驱动程序中就实现如何进行数据传输和数据的加密。这便是Connection对象的作用所在。

● 作为每一个JDBC应用程序,其可建立多个TCP/IP连接,其可以在客户机上建立多条与服务器通信的Connection对象;如下面的JDBC应用1就建立了两个数据库的连接,即在一个客户机上建立了多个Connection对象; 在实际开发中,建立多少个连接是由实际的项目决定的,比如访问量大的项目,JDBC的Connection连接数的总量就要大一点,在后面连接池的部分会详细介绍。


MySQL连接字符串:

连接字符串是JDBC提供的一个格式化的字符串;具体的格式是由厂商自己定义的。

常见的参数如下:

● useSSL:SSL代表安全套接层,其作用是在网络传输过程中使用非对称加密的方式对数据进行加密传输。开发的时候一般在局域网中,可以设为false;但如果放到线上,因为线上对安全性要求更高,也会去申请响应的SSL证书,所以在线上建议设为true;

● useUnicode:在绝大多数包含中文的数据库应用中,useUnicode都要设置true,代表使用Unicode的编码传输数据,只有使用Unicode的编码传输数据时,才不会产生中文乱码问题;

● characterEncoding:到底是使用utf-8还是utf-16哪种具体的编码方式?

● serverTimezone:设置服务器的时区;计算器表达时间的方式是基于格林尼治时间的,格林尼治时间和中国时间差了8个小时,为了保证在进行数据存储时不会因为时区问题产生八个小时误差,这儿需要设置时区,指定在数据存储和提取的时候按照亚洲上海的时间进行。

● allowPublicKeyRetrieval:允许从客户端获取公钥加密传输。在数据传输过程中,密码等敏感数据是需要加密的,自然MySQL中的数据也需要加密;

注:如果MySQL数据库设置的默认时区就是【Asia/Shanghai】的话,在连接字符串中,serverTimezone就可以省略掉不写;如果allowPublicKeyRetrieval在服务器端也是默认开启的话,在连接字符串中也是可以省略不写的;但初学阶段,这五个参数都写上吧。

(3.3)3.1和3.2部分的演示:【加载驱动类】和【创建数据库连接】演示

创建一个ConnectionSample类:用于演示;

    package com.imooc.jdbc.sample;
 
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
 
    public class ConnectionSample {
        public static void main(String[] args) {
            try {
                Class.forName("com.mysql.cj.jdbc.Driver");
                String url = "jdbc:mysql://localhost:3306/imooc?useSSL=false&useUincode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
                // 在开发测试中,可以使用root账户,但在实际一定不要对外开放root账户,因为root账户的权利太大了,万一泄露,系统中所有的数据都会暴露;
                // 账户的密码最好也要设置的复杂一点,防止被破解;
                Connection conn = DriverManager.getConnection(url, "root", "12345");
                System.out.println(conn);
            } catch (ClassNotFoundException e) {  // ClassNotFoundException:JDBC驱动不存的时候抛出的异常;
                e.printStackTrace();
            } catch (SQLException e) {  // SQLException:所有与JDBC操作失败 的异常都归纳到了SQLException中;
                e.printStackTrace();  // 具体的SQL的错误情况,需要在打印的错误信息中查看;
            }
        }
    }
 

几点说明:

(1)其中在添加try-catch的时候技巧:

首先选中需要套进try-catch块的代码,然后如下:

(2)实际正常运行效果:

(3)【ClassNotFoundException】驱动没有引入的异常错误信息:

比如,首先把驱动包给移除掉,这就相当于当前工程没有使用驱动:

(4)用户名或者密码错误时的异常错误信息:

(5)IP地址或者端口号写错了,异常错误信息: