`
444878909
  • 浏览: 645974 次
文章分类
社区版块
存档分类
最新评论

JDBC学习之-Connection(一)

 
阅读更多

JDBC是作为连接数据库的渠道之一,封装了一些与数据库交互的接口。看了一些源码,现在就来探寻一下JDBC的原理。

JDK中给了几个接口比如说Connection,Statement,ResultSet。这些都是在用JDBC中比较常用的接口,这些接口定义了与数据库的交互规则。具体的实现都由具体的类库或者厂商实现。目前比较常用的数据库有Mysql,Oracle,Sql Server。这些具体的数据库所实现的通信协议都会有差异。而JDBC就需要屏蔽这些差异,对外提供一个统一而且简单的接口。对于使用者而言,他只要关心如何创立连接,而不需要关心里面的具体通信协议。如果看源码就会知道其内部都是用TCP/IP通信协议进行通信,如果自己要实现一个JDBC这样的API的话则需要了解具体的数据库的通信协议。但是这些都不是程序员需要关心的事情。他们更加关心偏业务的事情。比如我一条SQL语句简单的提交就可以实现对数据库的增删改查,如何用已有的接口实现事务的回滚。

好了,废话不多讲。先看看一个重量级的接口Connection。顾名思议,连接,和数据库交互最基本的就是要和数据库建立连接。这个对象并非我们简单的new出来,而是由一个叫做DriverManager的管理者给我们创建好的。先上传一张Connection创建的时序图,时序图中完整的描述出一个Connection的创建。


Connection conn = DriverManager.getConnection(url,user,password);
面一行代码就是一条非常常用的建立连接的方法。这里问题就出来了,我们拿到的是Connection接口,而具体的Connection实现类又由谁来创建呢?

	static {
		try {
			java.sql.DriverManager.registerDriver(new Driver());
		} catch (SQLException E) {
			throw new RuntimeException("Can't register driver!");
		}
	}
上面这段代码是com.mysql.jdbc.Driver里面一段静态注册的代码。这段代码的意图很明显,在DriverManager里面注册一个具体的Driver类(PS:里面的new Driver()正是com.mysql.jdbc.Driver)。

	for (int i = 0; i < drivers.size(); i++) {
	    DriverInfo di = (DriverInfo)drivers.elementAt(i);
      
	    // If the caller does not have permission to load the driver then 
	    // skip it.
	    if ( getCallerClass(callerCL, di.driverClassName ) != di.driverClass ) {
		println("    skipping: " + di);
		continue;
	    }
	    try {
		println("    trying " + di);
		Connection result = di.driver.connect(url, info);
		if (result != null) {
		    // Success!
		    println("getConnection returning " + di);
		    return (result);
		}
	    } catch (SQLException ex) {
		if (reason == null) {
		    reason = ex;
		}
	    }
	}

上面这段代码DriverManager里面获取Connection的一个片断,其他的都不用关心只要关心一行代码:Connection result = di.driver.connect(url, info);上面我已经说过了,这里di.driver就是具体的Driver类。

我们再看看NonRegisteringDriver(Driver正是继承于它)这个类的方法。其他的也不是现在需要关心的,里面Connection newConn = com.mysql.jdbc.ConnectionImpl.getInstance(host(props), port(props), props, database(props), url);正是核心所在,当然ConnectionImpl里面做了很多操作,比如说Socket之类的等等。有兴趣的可以看源码。

	public java.sql.Connection connect(String url, Properties info)
			throws SQLException {
		if (url != null) {
			if (StringUtils.startsWithIgnoreCase(url, LOADBALANCE_URL_PREFIX)) {
				return connectLoadBalanced(url, info);
			} else if (StringUtils.startsWithIgnoreCase(url,
					REPLICATION_URL_PREFIX)) {
				return connectReplicationConnection(url, info);
			}
		}

		Properties props = null;

		if ((props = parseURL(url, info)) == null) {
			return null;
		}

		try {
			Connection newConn = com.mysql.jdbc.ConnectionImpl.getInstance(
					host(props), port(props), props, database(props), url);//这里终于可以看到具体的Connection实现类。

			return newConn;
		} catch (SQLException sqlEx) {
			// Don't wrap SQLExceptions, throw
			// them un-changed.
			throw sqlEx;
		} catch (Exception ex) {
			SQLException sqlEx = SQLError.createSQLException(Messages
					.getString("NonRegisteringDriver.17") //$NON-NLS-1$
					+ ex.toString()
					+ Messages.getString("NonRegisteringDriver.18"), //$NON-NLS-1$
					SQLError.SQL_STATE_UNABLE_TO_CONNECT_TO_DATASOURCE);
			
			sqlEx.initCause(ex);
			
			throw sqlEx;
		}
	}

一个比较粗略的Connection就这样创建好了。这里屏蔽了很多的细节,只是一些主干的代码。有兴趣的可以看看具体的源码,里面Connection是如何建立连接的,Connection又有哪些其他的功能都可以去研究。


分享到:
评论

相关推荐

    js学习.txt

    &lt;/jdbc-connection-pool-params&gt; &lt;jdbc-data-source-params&gt; &lt;jndi-name&gt;dfdatasource&lt;/jndi-name&gt; &lt;global-transactions-protocol&gt;OnePhaseCommit&lt;/global-transactions-protocol&gt; &lt;/jdbc-data-source-params&gt;...

    spring-jdbc.rar源码 学习分析用

    spring-jdbc.rar源码 学习分析用,了解jdbc内部原理,connection事务关系很有用

    JDBC学习资料

    4、掌握JDBC中几个重要类的使用:Connection、Statement、ResultSet;5、理解JDBC操作数据库的一般步骤;6、掌握SQLException的异常处理;7、理解数据库事务、JDBC对事务的支持、以及JDBC事务的原理和如何使用JDBC事务...

    JAVA学习笔记最新ppt版20

    JAVA学习笔记最新ppt版20 - JDBC 入门 在本章节中,我们将学习 JDBC 的基本概念和使用方法,以及如何使用 JDBC 连接数据库和进行数据操作。 一、 JDBC 简介 JDBC(Java Database Connectivity)是一种 Java API,...

    Access_JDBC30 无使用次数限制 - 破解

    仅供学习研究使用,切勿用于商业 示例代码 d:/empty.mdb 为access的mdb文件路径 public static void main(String[] args) throws SQLException, ClassNotFoundException { String url ="jdbc:access:/d:/empty.mdb...

    Java对JDBC连接池的实现

    这是我写的一个对JDBC连接池的实现,高手见了可不要笑啊!!!! 程序是在linux下用Eclipse下编写的. 用Jude进行建模,数据库使用了mysql. 程序自带了MySql的Connection连接驱动类,你也可以使用别的驱动类和数据库, 在src/...

    jdbc连接数据库的方式2

    下面是使用JDBC连接MySql的一个小的教程 1、查找驱动程序 MySQL目前提供的java驱动程序为Connection/J,可以从MySQL官方网站下载,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驱动程序为纯java驱动...

    自己封装的JDBC工具类源码

    最近刚学习了JDBC,最后封装了一段简单的工具类,主要功能有: 1、执行sql语句返回单条查询结果; 2、执行查询语句sql返回结果集; 3、执行数据的插入,修改,删除; 4、执行批处理; 5、调用存储过程; 6、...

    JSP通过JDBC访问数据库

    是一个最简单,也是学习jsp必须会的一个入门实验----通过jdbc连接数据库。 采用jsp+access数据库实现,同时使用javabean通过jdbc连接数据库。运行结果将显示从数据库查询出的图书。里面包含了javabean的源代码及解释...

    使用phpstudy联系学习JDBC

    使用的是Eclipse编辑器联系的,实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接、...

    JAVA/JSP学习系列之五(JDBC-ODBC翻页例子)

    一、运行前准备 建议了一个MS SQLServer7数据库 DNS,名称为:Test_DB 数据库中有一个表:guestbook字段为:name(varchar),email(varchar),body(text) 数据库用户为sa 密码空,可以自己修改的。 二、代码 &lt;&#37;@...

    Java数据库连接JDBCPPT学习教案.pptx

    Java数据库连接JDBC学习教案 本文档是关于Java数据库连接JDBC的学习教案,总共38页,涵盖了数据库管理系统、SQL语言、ODBC、JDBC等基础知识,并提供了详细的实践指导。 数据库管理系统(Database Management ...

    JDBC课堂笔记.md

    mysql的jar包及学习方法, 1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar 1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下 2.右键--&gt;Add As Library 2. 注册驱动 3. 获取数据库连接...

    JDBC相关单元测试及通用的Dao

    jdbc详细测试用例,包括connection ,statement,preparedstatement,resultset,BeanUtils,DBUtils,数据库连接池dbcp,cp03的单元测试,及dao层的统一封装,适合项目开发人员学习和项目中使用。

    JSP2.0技术手册pdf(带示例源码).zip

    JavaServer Faces(JSF)技术以及Java Web Services技术的学习 目录 第一章 安装执行环境 1-1 安装 J2SDK 1.4.2 1-2 安装 Tomcat 5.0.16 1-3 安装 JSPBook 站台范例 1-4 安装 Ant 1.6 第二章 Servlet 2.4 简介 2-1...

    用JDBC管理数据库连接

    (Java Database Connection(JDBC)) 从 Java 应用程序内部建立和管理数据库连接所涉及的不同概念。 它主要定位于想要理解从 Java 应用程序内部使用数据库的内幕的开发者。 本教程假定读者熟悉 Java 编程...

    java程序是怎么操作数据库的,可以以常用据库为例,求详细解答,最好能举例。

    JDBC技术事实上是一种能通过JAVA语言访问任何结构化数据库的应用程序接口(API)(Sun这样说的,我也不知道是不是真的),而且现在的JDBC 3.0据Sun说也能访问Execel等电子表格程序! JDBC对于数据库的访问有四种方式,...

    Java创建和关闭数据库连接的方法附代码.rar

    Java使用JDBC创建和关闭数据库连接的方法附代码,学习和熟悉一下JDBC的用法,创建一个数据库连接,并关闭或断开这个连接,面向java初学者。Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); //加载...

    java 数据库编程

    pdf 学习资料:java 数据库编程及jdbc 连接解决 JAVA连接数据库的方式有多种,根据所需要的不同数据库驱动分,分为四种: 1:1类驱动。这就是JDBC-ODBC桥的方式。但这种方式不适合程序的重用与维护,不推荐使用。...

    计算机程序设计(Java)-教案--单元十--数据库编程技术.docx.docx

    工程描述 :・利用本章将要学习的Java数据库编程技术,编程开发一个"学生信息管理小工具"; 教学方法 :・问题导引法:通过给学生提出实际编程中出现的问题来引入教学内容,使学生在主动分析、讨论和解决问题的过程中...

Global site tag (gtag.js) - Google Analytics