一,jdbc连接驱动器的注册加载
Class.forName("com.mysql.jdbc.Driver");
当以上类被装载时执行以下程序
package com.mysql.jdbc; import java.sql.SQLException; public class Driver extends NonRegisteringDriver implements java.sql.Driver { //执行这个静态代码块 static { try {//注册mysql实现的驱动类 java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } public Driver() throws SQLException { // Required for Class.forName().newInstance() } }
进入java.sql.DriverManager.registerDirver(new Driver());中的功能实现
public static synchronized void registerDriver(java.sql.Driver driver) throws SQLException { if (!initialized) { //初始化动作在下面作详解 initialize(); } //用来存储驱动器信息 DriverInfo di = new DriverInfo(); di.driver = driver; di.driverClass = driver.getClass(); di.driverClassName = di.driverClass.getName(); // Not Required -- drivers.addElement(di); //用于加入驱动的集合 writeDrivers.addElement(di); println("registerDriver: " + di); /* 用于读取驱动的集合 */ readDrivers = (java.util.Vector) writeDrivers.clone(); //用以上两个集合达到读写分离的状态,由 Vector 的 iterator 和 listIterator 方法所返回的迭代器是快速失败的 }
二,驱动器的初始化操作
static void initialize() { if (initialized) { return; } //private static boolean initialized = false;静态全局变量,只初始化一次 initialized = true; loadInitialDrivers(); println("JDBC DriverManager initialized"); }
实现初始化操作
private static void loadInitialDrivers() { String drivers; try {//得到系统属性jdbc.drivers对应驱动的驱动名称,使用了JAVA的安全许可 drivers = (String) java.security.AccessController.doPrivileged( new sun.security.action.GetPropertyAction("jdbc.drivers")); } catch (Exception ex) { drivers = null; } // If the driver is packaged as a Service Provider, // load it. // Get all the drivers through the classloader // exposed as a java.sql.Driver.class service. DriverService ds = new DriverService(); // Have all the privileges to get all the // implementation of java.sql.Driver java.security.AccessController.doPrivileged(ds); println("DriverManager.initialize: jdbc.drivers = " + drivers); if (drivers == null) { return; } while (drivers.length() != 0) { int x = drivers.indexOf(':'); String driver; if (x < 0) { driver = drivers; drivers = ""; } else { driver = drivers.substring(0, x); drivers = drivers.substring(x+1); } if (driver.length() == 0) { continue; } try { println("DriverManager.Initialize: loading " + driver); Class.forName(driver, true, ClassLoader.getSystemClassLoader()); } catch (Exception ex) { println("DriverManager.Initialize: load failed: " + ex); } } }
以上初始化代码分析
内部类对象,创建此对象时,它会从系统服务中加载驱动
DriverService ds = new DriverService();
代码如下:
class DriverService implements java.security.PrivilegedAction {
Iterator ps = null; public DriverService() {}; public Object run() { //从系统服务中加载驱动 ps = Service.providers(java.sql.Driver.class); /* Load these drivers, so that they can be instantiated. * It may be the case that the driver class may not be there * i.e. there may be a packaged driver with the service class * as implementation of java.sql.Driver but the actual class * may be missing. In that case a sun.misc.ServiceConfigurationError * will be thrown at runtime by the VM trying to locate * and load the service. * * Adding a try catch block to catch those runtime errors * if driver not available in classpath but it's * packaged as service and that service is there in classpath. */ try { while (ps.hasNext()) { ps.next();//遍历所有的驱动 } // end while } catch(Throwable t) { // Do nothing } return null; } //end run }
//使用特权去获取ds java.security.AccessController.doPrivileged(ds);
相关推荐
MySQL Connector/J是官方提供的JDBC驱动程序,它的源代码能帮助开发者深入理解数据库连接、数据传输以及SQL语句在Java中的执行过程。 首先,我们来看看JDBC的概念。JDBC是Java平台上的一个标准接口,由Sun ...
在“mysql-driver:mysql jdbc驱动源码阅读”这个主题中,我们将深入探讨该驱动的工作原理、关键组件以及源码分析。 1. **JDBC驱动类型**: JDBC驱动分为四种类型:Type 1、Type 2、Type 3 和 Type 4。MySQL ...
关于源码分析,MySQL JDBC驱动的源代码可以提供深入理解数据库连接的工作原理、事务处理、批处理以及错误处理机制等。对于开发者来说,阅读源码有助于优化性能,解决特定问题,或者为自定义功能提供灵感。 在工具...
压缩包中的“mysql-connector-java-5.1.18--源码”文件是MySQL的JDBC驱动源代码,通过阅读这些源代码,开发者可以深入了解JDBC驱动的工作原理,以及它是如何与MySQL服务器通信的。此外,这也有助于解决在使用过程中...
这是一个Java Archive(JAR)文件,包含了MySQL JDBC驱动的所有必要类和资源,使得Java应用程序能够通过标准的JDBC接口与MySQL数据库进行通信。JDBC(Java Database Connectivity)是Java平台上的一个标准API,它...
这通常通过`Class.forName()`方法完成,例如`Class.forName("com.mysql.jdbc.Driver")`来加载MySQL的JDBC驱动。 2. **建立连接**:使用`DriverManager.getConnection()`方法创建到数据库的连接。参数通常包括数据库...
标题中的“jdbc连接数据库:oracle/derby/mysql”是指使用Java Database Connectivity (JDBC) API来与三种不同的数据库...同时,了解并分析JDBC驱动源码有助于深入理解数据库操作的底层机制,提升开发和问题排查能力。
Eclipse JDBC连接数据库源码分析 在Java编程中,JDBC(Java Database Connectivity)是用于与各种数据库进行交互的一组接口和类。本资源“eclipse-jdbc连接数据库源码”提供了一系列关于如何使用Eclipse IDE进行...
本源码示例着重讲解如何利用JDBC进行分页查询,以避免一次性加载所有数据导致的性能瓶颈。 首先,我们需要了解分页查询的基本概念。分页查询是将数据库中的数据按一定的数量(如每页10条)分割,每次只查询一部分,...
1. **DriverManager**: 这是Java数据库连接的入口点,负责管理所有的JDBC驱动。当Java应用通过`Class.forName()`加载了MySQL的驱动后,`DriverManager`会注册这个驱动,并根据用户提供的URL、用户名和密码建立到...
1. **加载并注册JDBC驱动**:首先需要加载特定数据库厂商提供的JDBC驱动类,并将其注册到JDBC驱动管理器中。 2. **获取数据库连接**:通过DriverManager.getConnection()方法,使用正确的URL、用户名和密码来获取...
通过分析这个【MySQL网上购物源码】项目,你可以全面学习到Web开发中的许多核心概念和技术,为成为一名合格的JavaWeb开发者奠定坚实的基础。同时,不断实践和理解这些知识,你的编程技能将会得到显著提升。
4. **连接MySQL**:在JSP中,首先需要加载MySQL的JDBC驱动,然后通过`DriverManager.getConnection()`方法建立到数据库的连接。连接字符串通常包含数据库URL、用户名和密码。 5. **创建数据库**:使用JDBC,可以...
JDBC源码分析** 深入源码可以帮助理解JDBC的工作原理。例如,`DriverManager.getConnection()`方法如何查找并注册合适的数据库驱动,以及如何通过URL和凭证建立连接。同时,了解Statement和ResultSet的实现,有助...
JDBC(Java Database Connectivity)是Java语言中用来与数据库交互的标准API,它为开发者提供了一种标准的方式来访问各种类型的数据库,如MySQL、Oracle、SQL Server等。JDBC由一组接口和类组成,这些接口和类定义了...
4. **lib** 文件夹:存放项目所需的库文件,如MySQL的JDBC驱动。 5. **css** 和 **js** 文件夹:存放样式表和JavaScript文件,用于页面的样式和交互效果。 对于初学者来说,这个项目提供了一个很好的实践机会,可以...
使用JDBC访问数据库需要首先加载JDBC驱动,然后创建一个Connection,最后使用PreparedStatement执行数据库访问操作。JDBC是一种标准的数据库访问API,提供了基本的数据库访问能力,但是需要开发者手动管理数据库连接...
2. 在Java项目中引入MySQL的JDBC驱动包(例如mysql-connector-java-8.0.16.jar),创建相应的包结构。 3. 定义`Student`实体类,用于表示学生信息。 4. 设计`StudentDao`接口,定义数据库操作方法,如`...
MySQL Connector/J作为MySQL的JDBC驱动,它实现了JDBC规范,使得Java开发者无需关心底层数据库的具体实现,只需按照JDBC的编程模型编写代码,即可与MySQL数据库进行通信。 二、MySQL Connector/J 5.1.18特性 1. ...