`
dyllove98
  • 浏览: 1409351 次
  • 性别: Icon_minigender_1
  • 来自: 济南
博客专栏
73a48ce3-d397-3b94-9f5d-49eb2ab017ab
Eclipse Rcp/R...
浏览量:39184
4322ac12-0ba9-3ac3-a3cf-b2f587fdfd3f
项目管理checkList...
浏览量:80260
4fb6ad91-52a6-307a-9e4f-816b4a7ce416
哲理故事与管理之道
浏览量:133385
社区版块
存档分类
最新评论

JDBC注册过程分析

 
阅读更多

本博客要记录的是如何去使用JDBC去操作数据库的一般过程。

JDBC操作步骤如下:

    1.注册驱动

    2.建立连接

    3.创建语句对象

    4.执行语句

    5.处理结果集

    6.关闭资源

 

看如下代码:

    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package Base;
 
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
 
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
 
public class BaseDriver {
 
    public static void Test() throws SQLException{
        //注册驱动
        DriverManager.registerDriver(new com.mysql.jdbc.Driver());
         
        //建立连接
        Connection conn = (Connection) DriverManager.getConnection("""root","password01!");
         
        //创建语句
        Statement stm = (Statement) conn.createStatement();
         
        //执行语句,获取结果
        ResultSet resultSet = stm.executeQuery("select * from t_user");
         
        //遍历结果集
        while(resultSet.next()){
            System.out.println(resultSet.getObject(0)+"\t"+resultSet.getObject(1)+"\t"+resultSet.getObject(2)+"\t"+resultSet.getObject(3));
        }
         
        //释放资源
        resultSet.close();
        stm.close();
        conn.close();
         
    }
}

    1.注册驱动

        注册驱动的方式有两种:

        a.DriverManager进行注册

        DriverManager.registerDriver(new com.mysql.jdbc.Driver());

        b.使用Class进行注册

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

    

        注册驱动过程到底做了什么事情呢?听我慢慢道来:

            a方式注册驱动主要做了如下工作:

        首先我们先来看一下DriverManager的源代码:

1
2
3
4
5
6
7
8
9
10
11
12
public class DriverManager {
 
 
    // List of registered JDBC drivers
    private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();
    private static volatile int loginTimeout = 0;
    private static volatile java.io.PrintWriter logWriter = null;
    private static volatile java.io.PrintStream logStream = null;
    // Used in println() to synchronize logWriter
    private final static  Object logSync = new Object();
    
}

    上面是通过反编译出来的DriverManager类的部分代码

private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();把驱动注册在一个列表里面。有了数据库的驱动包后,在调用getConnection后,就会在这个驱动注册列表里面去一个一个的找,看是否能够建立连接,如果最后没有找到,那么就会抛出异常。

 

        b.方式注册驱动做了哪些工作:

    同样我们也来看一下源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 /**
     * Returns the {@code Class} object associated with the class or
     * interface with the given string name.  Invoking this method is
     * equivalent to:
     *
     * <blockquote>
     *  {@code Class.forName(className, true, currentLoader)}
     * </blockquote>
     *
     * where {@code currentLoader} denotes the defining class loader of
     * the current class.
     *
     * <p> For example, the following code fragment returns the
     * runtime {@code Class} descriptor for the class named
     * {@code java.lang.Thread}:
     *
     * <blockquote>
     *   {@code Class t = Class.forName("java.lang.Thread")}
     * </blockquote>
     * <p>
     * A call to {@code forName("X")} causes the class named
     * {@code X} to be initialized.
     *
     * @param      className   the fully qualified name of the desired class.
     * @return     the {@code Class} object for the class with the
     *             specified name.
     * @exception LinkageError if the linkage fails
     * @exception ExceptionInInitializerError if the initialization provoked
     *            by this method fails
     * @exception ClassNotFoundException if the class cannot be located
     */
    @CallerSensitive
    public static Class<?> forName(String className)
                throws ClassNotFoundException {
        return forName0(className, true,
                        ClassLoader.getClassLoader(Reflection.getCallerClass()));
    }

根据上面的反编译出来的Class源代码重的ForName的源代码,也是加载在一个驱动列表中,通过遍历驱动列表进行检测是否有符合目标的驱动注册,如果没有则抛出异常。

 

    区别:

        DriverManager.registerDriver(new com.mysql.jdbc.Driver());会在JVM装载类时调用静态代码初始化块,new com.mysql.jdbc.Driver()同时会实例化一个驱动实例,所以这种方式会在驱动注册列表中出现两个相同的MySql的驱动注册项。

        Class.forName("com.mysql.jdbc.Driver");因为forName的参数是字符串类型,在加载类时只会调用静态代码块创建一个实例,驱动注册表中只有一个MySql的驱动注册项。

 

1
2
分享到:
评论
1 楼 freezingsky 2014-12-13  
过程变步骤。哎!

相关推荐

    JDBC 驱动加载过程分析

    通过阅读`JDBC loading 1.pdf`和`JDBC loading 2.pdf`,你可以获得更详细的实践指导和案例分析,进一步掌握Oracle JDBC驱动的加载和使用技巧。记住,理解和优化这个过程对于编写高效的Java数据库应用至关重要。

    JDBC中驱动加载的过程分析(上)

    ### JDBC中驱动加载的过程分析(上) #### 一、Driver接口 在JDBC体系中,`java.sql.Driver`接口扮演着核心角色,它是所有数据库驱动程序必须实现的标准接口。此接口定义了数据库提供商用于与Java应用程序通信的...

    JDBC驱动加载分析

    本文将深入分析JDBC驱动的加载机制,特别是sun提供的JDBC-ODBC桥接驱动的加载过程。 #### JDBC驱动加载原理 JDBC驱动加载是一个关键步骤,它决定了Java应用程序能否成功地与数据库建立连接。在本例中,我们将探讨...

    JDBC中驱动加载的过程分析(下)

    ### JDBC中驱动加载的过程分析(下) 在深入探讨JDBC驱动加载的过程之前,我们先简要回顾一下上文提到的JDBC(Java Database Connectivity)是什么。JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库...

    sharding-JDBC启动流程分析

    **标题:“sharding-JDBC启动流程分析”** 在Java领域,Sharding-JDBC是一个轻量级的数据分片中间件,它适用于已经存在成熟数据库访问层的项目,无需更改原有架构即可实现数据分布式处理。Sharding-JDBC通过在JDBC...

    Jdbc深入分析

    ### Jdbc深入分析 #### 一、JDBC概述与应用场景 **1.1 JDBC概念** JDBC(Java Database Connectivity)是Java中用来对关系型数据库进行访问的一种标准API,它提供了一种统一的方式去访问不同的数据库系统。通过...

    jdbc 源码 oracle 自带jdbc

    1. `Driver`接口:所有JDBC驱动都必须实现这个接口,注册到JDBC DriverManager中,以便于应用程序通过`Class.forName()`加载和使用。 2. `Connection`接口:表示与数据库的会话,通过它执行SQL语句并管理事务。 3....

    JDBC调用存储过程.pdf

    ### JDBC调用存储过程知识点详解 #### 一、引言 在Java开发中,通过Java Database Connectivity (JDBC) 来访问数据库是非常常见的操作。其中,调用存储过程是实现复杂业务逻辑的一种重要方式。存储过程是预编译好...

    JDBC培训资料java连接数据库

    - **注册驱动**:通过`Class.forName()`方法加载特定数据库的JDBC驱动。 - **建立连接**:使用`DriverManager.getConnection()`方法连接到数据库,需提供URL、用户名和密码。 - **创建Statement**:创建一个`...

    老罗 jdbc 源码

    - 驱动注册:在JDBC驱动类的静态初始化块中,通常会调用DriverManager.registerDriver(),将自身注册到DriverManager。 - 连接建立:DriverManager.getConnection()会遍历所有注册的Driver,尝试建立连接。这个...

    Mysql JDBC源码 官网版

    1. `DriverManager`:管理数据库驱动,负责加载和注册JDBC驱动,建立和数据库的连接。 2. `Connection`:代表与数据库的会话,通过该接口可以创建Statement或PreparedStatement对象。 3. `Statement`:用于执行静态...

    clickhouse-jdbc-0.1.50d.zip

    2. 连接Clickhouse:通过`java.sql.DriverManager`类注册JDBC驱动,并建立与Clickhouse服务器的连接。例如: ```java Class.forName("ru.yandex.clickhouse.ClickHouseDriver"); Connection conn = DriverManager...

    sap hana的jdbc驱动包以及测试连接的代码

    // 注册JDBC驱动 Class.forName(driver); // 建立数据库连接 Connection conn = DriverManager.getConnection(url); System.out.println("Connected to SAP HANA database successfully!"); // 关闭连接 ...

    java(jdbc)学习

    深入探讨JDBC的高级主题,包括DbUtils源码分析、Spring对JDBC的封装等,有助于更深层次地理解和掌握JDBC技术。 综上所述,JDBC不仅是Java应用程序与数据库交互的基础,而且通过其丰富的功能和API,为开发者提供了...

    Java使用Jdbc连接Oracle执行简单查询操作示例

    本文详细分析了Java使用Jdbc连接Oracle数据库并执行简单查询操作的过程,并提供了一个简单的Java程序示例。同时,我们还讨论了使用PreparedStatement防止SQL注入的方法。通过本文,读者可以了解Java中Jdbc连接Oracle...

    连接InterSystems cache数据库jdbc或odbc驱动

    - **注册驱动**:在Java程序中,通过`Class.forName()`方法注册JDBC驱动。例如:`Class.forName("com.intersys.jdbc.CacheDriver")`。 - **建立连接**:使用`DriverManager.getConnection()`方法建立到Cache...

    JDBC API教程与参考手册(第三版)前言+目录+第一,二章

    - **作用**:JDBC使得Java程序能够以统一的方式与多种数据库进行交互,大大简化了数据库开发过程。 ##### 安装配置指南 - **下载安装JDBC驱动**:根据所使用的数据库类型(如MySQL、Oracle等),从官方网站下载...

    sharding-jdbc-mybatis.zip

    Sharding-JDBC的规则配置包括数据源配置、分片策略配置、规则注册等,而MyBatis配置则涉及到数据源、Mapper扫描、SqlSessionFactory等内容。 5. **源码分析** 源码中可能包含以下几个关键部分: - `...

    第四课:RPC与JDBC调用拦截1

    #### 1.2 Dubbo执行过程分析 Dubbo架构主要包括以下角色: - Provider:服务提供方,发布服务到注册中心。 - Consumer:服务消费方,通过注册中心获取服务并调用。 - Registry:注册中心,用于服务的注册和发现。 - ...

    达梦数据库驱动Dm7JdbcDriver17

    这行代码会初始化驱动并注册到JDBC驱动管理器。 2. **建立连接**:加载驱动后,可以使用`DriverManager.getConnection()`方法建立到达梦数据库的连接。连接字符串通常包含数据库URL、用户名和密码,如: ```java ...

Global site tag (gtag.js) - Google Analytics