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

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-demo:二进制详解系列(二)------ jdbc-mysql的使用和分析-mysql

    用于注册驱动,是获取Connection对象的入口Driver数据库驱动,用于获取Connection对象Connection数据库连接,用于获取Statement对象,管理事务Statement sql执行器,用于执行sql ResultSet结果集,用于封装和操作...

    图书馆管理系统.zip

    第五章 使用手册兼测试过程 主页 5.1登录界面 管理员注册 注册成功 管理员登录 登录成功 Id查询功能 5.2管理员图书后台管理 进入管理 增添图书 删除图书 修改图书信息 查询图书 第六章 课程设计总结 第二章 需求...

    BBS论坛管理系统.zip

    3.1.3 JDBC技术 12 3.1.4 Java EE 的开发工具 12 3.1.5 MySQL 数据库 13 3.2 系统功能模块设计 13 3.3 数据库设计 13 3.3.1 数据库设计概述 13 3.3.2 数据库概念设计 14 3.3.3 数据库表设计 15 3.4 本章小结 18 4 ...

    基于web的自测系统的设计与实现

    对要实现的自测系统作系统分析,给出自测系统的总体框架,从业务角度着重介绍客户端、服务器端的功能划分和流程,进一步阐述了在线自测系统设计与实现过程,包括:用户登录模块,用户注册模块,用户信息修改,出卷和...

    EJ Technologies JProfiler 11.0 x64.rar破解版

    可以有效地查看java运行内存使用情况,并拥有JDBC、JPA和NOSQL数据库分析、内存泄漏分析等实用功能,它可以快速的帮助用户这进行使用的过程中,分析出您的操作错误这存在的错误,以此让开发者进行了解自己的不足之处...

    基于BBS管理系统设计与实现毕业论文

    1.3.3 JDBC技术 3 1.4设备要求 4 第二章 需求分析 5 2.1需求规格 5 2.1.1系统组成 5 2.1.2功能性需求 5 2.1.3非功能性需求 7 2.2开发环境的选择 7 第三章 概要设计 8 3.1总体设计 8 3.2系统结构与程序的关系 10 3.3...

    JSP基于WEB网上论坛设计与实现论文

    1.3.3 JDBC技术 3 1.4设备要求 4 第二章 需求分析 5 2.1需求规格 5 2.1.1系统组成 5 2.1.2功能性需求 5 2.1.3非功能性需求 7 2.2开发环境的选择 7 第三章 概要设计 8 3.1总体设计 8 3.2系统结构与程序的关系 10 3.3...

    SpringCloud精品屋微服务治理版

    MyBatis3DynamicSql、Sharding-Jdbc、Redis、RabbitMq、ElasticSearch、Docker等流行技术,集成了Nacos注册中心/配置中心、Spring Cloud Gateway网关、Spring Boot Admin监控中心、ELK分布式日志分析等基础服务。...

    基于JavaWeb图书管理系统毕业设计软件源码+论文文档资料.zip

    本文介绍了在Java运行环境下开发图书管理信息系统的过程。文章介绍了图书馆管理信息系统的系统分析部分,包括可行性分析、图书借阅流程分析等;系统设计部分主要介绍了系统功能设计和数据库设计及代码设计;系统实现...

    基于JSP+Mysql的银行柜员业务绩效考核系统软件程序源码+数据库+word毕业设计论文文档.zip

    3.3 JDBC 13 3.4 B/S模式分析 14 4、系统分析 16 4.1 系统实现目标 16 4.2 系统体系结构 17 4.3 主控流程图 17 4.4 系统ER图 19 5、系统设计 20 5.1 概要设计 20 5.2 系统结构设计 20 5.3 详细设计 20 5.3.1 管理员...

    电子商务交易系统的设计与实现(附完整代码+毕业论文--答辩最终版)

    本 文阐述了电子商务交易系统详细的设计和实施过程,从功能模块的实现到数据库的应用,从系统的测试与分析到系统的改进与整体性能评估,从界面风格的确定到界面风格的设计与实施,本文一一进行解析。

    Linux部署Tomcat发布项目过程中各种问题及解决方法

    部署项目到项目现场测试环境 JDK1.8 Tomcat8.5 Maven打包好的war Linux—–Centos ...问题分析: .sh可执行文件 当前用户都不具备权限 问题解决: 使用命令:chmod u+x *.sh。在tomcat/bin目录下执行

    期末大作业-基于jsp+servlet+mysql图书管理系统(含项目说明书)

    设计过程中的重点和难点是对整个系统的需求分析和数据库详细设计。 该系统对数据进行保存、修改、删除等管理。为用户提供了一个友好、简单快捷的运行操作平台。该系统对数据进行保存、修改、删除等管理,为用户提供...

    数据库图书管理系统大作业

    设计过程中的重点和难点是对整个系统的需求分析和数据库详细设计。 该系统对数据进行保存、修改、删除等管理。为用户提供了一个友好、简单快捷的运行操作平台。该系统对数据进行保存、修改、删除等管理,为用户提供...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题31.jdbc调用存储过程.mp4 │ Java面试题32.简单说一下你对jdbc的理解.mp4 │ Java面试题33.写一个jdbc的访问oracle的列子.mp4 │ Java面试题34.jdbc中preparedStatement比Statement的好处.mp4 │ Java...

    JavaWeb实战开发

    6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及二进制BLOB类型数据? ? ?7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)? ? ?8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与...

    Eclipse开发入门与项目实践 源代码

    2.2.2 代码编写过程中Eclipse的帮助 26 案例2-2 猜数游戏程序的实现 29 2.2.3 Java程序调试技巧 34 2.2.4 Eclipse中提高工作效率的其他措施 40 案例2-3 人员信息察看程序的实现 40 案例2-4 一对一聊天...

    酒店预订系统毕业设计整套

    5.4 数据库功能设计——函数与存储过程 28 5.5 数据交互AJAX异步刷新技术 32 第6章 系统详细设计 34 6.1 系统全局流程模 34 6.2 登录注册系统 36 6.3 前台主界面 39 6.4 后台资源管理 39 6.5 后台管理员管理 41 6.6 ...

Global site tag (gtag.js) - Google Analytics