设为首页 加入收藏

TOP

再说JDBC(一)
2015-07-24 10:48:51 来源: 作者: 【 】 浏览:1
Tags:再说 JDBC

上篇文章《再说Java EE》说明了一下什么是规范,有什么作用,这篇文章来细说一下JDBC。

JDBC

JDBC(Java Database Connection)也是Java EE中的一个规范,所谓规范是一组接口,如JDBC接口包含在java.sql及javax.sql包中,其中java.sql属于JavaSE,javax.sql属于JavaEE,部分如下图:

\

以上来自jdk中的src/java/sql。

因为提倡面向接口编程,所以建议仅使用JDBC规范中的类,规范与实现的关系如下:

\

使用

核心API

JDBC中核心的API有: DriverManager:工厂类,用来生产Driver对象Driver:驱动程序对象的接口Connection:数据库连接对象Statement:执行静态的SQL语句的接口Resultset:结果集对象的接口

操作流程

加载数据库驱动创建数据库连接执行SQL语句,得到结果集对结果集进行CRUD处理释放资源

如图:

\

源码分析

java.sql下有48个类,javax.sql下有45个类,展开分析不太现实,本文仅分析两个类,DriverManager和Driver。不知大家注意过这个问题没有,JDBC是接口,数据库驱动是实现,那么你编写的项目是如何找到实现的呢?

控制台输出

为了可以看到驱动加载过程中输出的日志,在加载驱动Class.forName("com.mysql.jdbc.Driver")之前,加上一句:

    DriverManager.setLogWriter(new java.io.PrintWriter(System.out));
即可在控制台中看到输出。

加载驱动

驱动使用很简单,将数据库驱动放到项目的lib中,在代码中写入:

    Class.forName("com.mysql.jdbc.Driver");
如果使用框架,如Hebernate配置文件中写入:?
    com.mysql.jdbc.Driver
很明显,这两种方式都是使用反射加载驱动程序,我们来看一下驱动程序Driver的源代码,以mysql-connector-java-3.1.13为例:
package com.mysql.jdbc;

import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
	//
	// Register ourselves with the DriverManager
	//
	static {
		try {
			java.sql.DriverManager.registerDriver(new Driver());
		} catch (SQLException E) {
			throw new RuntimeException("Can't register driver!");
		}
	}

	/**
	 * Construct a new driver and register it with DriverManager
	 * @throws SQLException
	 *             if a database error occurs.
	 */
	public Driver() throws SQLException {
		// Required for Class.forName().newInstance()
	}
}
核心代码就是那段静态代码块(static{}的意思是在类加载时执行一次,并且仅此一次),可以看到静态代码断的意思是将此Driver类实例化后注册到JDBC的java.sql.DriverManager类中,所以再来看一下JDBC的DriverManager.registerDriver:
/**
     * Registers the given driver with the DriverManager.
     * A newly-loaded driver class should call
     * the method registerDriver to make itself
     * known to the DriverManager.
     *
     * @param driver the new JDBC Driver that is to be registered with the
     *               DriverManager
     * @exception SQLException if a database access error occurs
     */
    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);
	
	/* update the read copy of drivers vector */
	readDrivers = (java.util.Vector) writeDrivers.clone();

    }
即可将com.mysql.jdbc.Driver添加到DriverManager的成员变量readDrivers中,以后获取数据库连接需要这个变量的帮助。

看上面的代码发现,还调用了initialize(),查看initialize()的源码看到它调用loadInitialDrivers(),这个函数的主要作用是加载JDBC默认驱动,registerDriver执行完,控制台的输出语句为:

JdbcOdbcDriver class loaded
registerDriver: driver[className=sun.jdbc.odbc.JdbcOdbcDriver,sun.jdbc.odbc.JdbcOdbcDriver@134e4fb]
DriverManager.initialize: jdbc.drivers = null
JDBC DriverManager initialized
registerDriver: driver[className=com.mysql.jdbc.Driver,com.mysql.jdbc.Driver@157c2bd]
可以看到先加载JdbcOdbcDriver,再加载我们加入的MySQL的driver。

获取链接

加载驱动完毕后,如何获取连接,继续看DriverManager的getConnection():?
    //  Worker method called by the public getConnect
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇MongoDB学习笔记一ID自增长 下一篇mysqlupdate修改多条数据

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)
·透彻理解 C 语言指针 (2025-12-26 00:22:52)
·C语言指针详解 (经典 (2025-12-26 00:22:49)
·C 指针 | 菜鸟教程 (2025-12-26 00:22:46)