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又有哪些其他的功能都可以去研究。
分享到:
相关推荐
</jdbc-connection-pool-params> <jdbc-data-source-params> <jndi-name>dfdatasource</jndi-name> <global-transactions-protocol>OnePhaseCommit</global-transactions-protocol> </jdbc-data-source-params>...
spring-jdbc.rar源码 学习分析用,了解jdbc内部原理,connection事务关系很有用
4、掌握JDBC中几个重要类的使用:Connection、Statement、ResultSet;5、理解JDBC操作数据库的一般步骤;6、掌握SQLException的异常处理;7、理解数据库事务、JDBC对事务的支持、以及JDBC事务的原理和如何使用JDBC事务...
JAVA学习笔记最新ppt版20 - JDBC 入门 在本章节中,我们将学习 JDBC 的基本概念和使用方法,以及如何使用 JDBC 连接数据库和进行数据操作。 一、 JDBC 简介 JDBC(Java Database Connectivity)是一种 Java API,...
仅供学习研究使用,切勿用于商业 示例代码 d:/empty.mdb 为access的mdb文件路径 public static void main(String[] args) throws SQLException, ClassNotFoundException { String url ="jdbc:access:/d:/empty.mdb...
这是我写的一个对JDBC连接池的实现,高手见了可不要笑啊!!!! 程序是在linux下用Eclipse下编写的. 用Jude进行建模,数据库使用了mysql. 程序自带了MySql的Connection连接驱动类,你也可以使用别的驱动类和数据库, 在src/...
下面是使用JDBC连接MySql的一个小的教程 1、查找驱动程序 MySQL目前提供的java驱动程序为Connection/J,可以从MySQL官方网站下载,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驱动程序为纯java驱动...
最近刚学习了JDBC,最后封装了一段简单的工具类,主要功能有: 1、执行sql语句返回单条查询结果; 2、执行查询语句sql返回结果集; 3、执行数据的插入,修改,删除; 4、执行批处理; 5、调用存储过程; 6、...
是一个最简单,也是学习jsp必须会的一个入门实验----通过jdbc连接数据库。 采用jsp+access数据库实现,同时使用javabean通过jdbc连接数据库。运行结果将显示从数据库查询出的图书。里面包含了javabean的源代码及解释...
使用的是Eclipse编辑器联系的,实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接、...
一、运行前准备 建议了一个MS SQLServer7数据库 DNS,名称为:Test_DB 数据库中有一个表:guestbook字段为:name(varchar),email(varchar),body(text) 数据库用户为sa 密码空,可以自己修改的。 二、代码 <%@...
Java数据库连接JDBC学习教案 本文档是关于Java数据库连接JDBC的学习教案,总共38页,涵盖了数据库管理系统、SQL语言、ODBC、JDBC等基础知识,并提供了详细的实践指导。 数据库管理系统(Database Management ...
mysql的jar包及学习方法, 1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar 1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下 2.右键-->Add As Library 2. 注册驱动 3. 获取数据库连接...
jdbc详细测试用例,包括connection ,statement,preparedstatement,resultset,BeanUtils,DBUtils,数据库连接池dbcp,cp03的单元测试,及dao层的统一封装,适合项目开发人员学习和项目中使用。
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...
(Java Database Connection(JDBC)) 从 Java 应用程序内部建立和管理数据库连接所涉及的不同概念。 它主要定位于想要理解从 Java 应用程序内部使用数据库的内幕的开发者。 本教程假定读者熟悉 Java 编程...
JDBC技术事实上是一种能通过JAVA语言访问任何结构化数据库的应用程序接口(API)(Sun这样说的,我也不知道是不是真的),而且现在的JDBC 3.0据Sun说也能访问Execel等电子表格程序! JDBC对于数据库的访问有四种方式,...
Java使用JDBC创建和关闭数据库连接的方法附代码,学习和熟悉一下JDBC的用法,创建一个数据库连接,并关闭或断开这个连接,面向java初学者。Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); //加载...
pdf 学习资料:java 数据库编程及jdbc 连接解决 JAVA连接数据库的方式有多种,根据所需要的不同数据库驱动分,分为四种: 1:1类驱动。这就是JDBC-ODBC桥的方式。但这种方式不适合程序的重用与维护,不推荐使用。...
工程描述 :・利用本章将要学习的Java数据库编程技术,编程开发一个"学生信息管理小工具"; 教学方法 :・问题导引法:通过给学生提出实际编程中出现的问题来引入教学内容,使学生在主动分析、讨论和解决问题的过程中...