Java连结数据库内幕

王朝java/jsp·作者佚名  2008-05-19
宽屏版  字体: |||超大  

java.sql包中的 java.sql.Driver, jdbc.sql.Connection等提供给程序开发人员统一的开发接口,数据库提供商提供相应的实现,对程序开发人员来讲只要知道这些接口都有哪些方法就可以了。但我们可以深入一些看看到底这里面都做了那些事, 同时也可以学习其中的编程模式(如Interface模式等)。

1、 Class.forName(String classname) 的源码为:

public final

class Class implements java.io.Serializable {

...

public static Class forName(String className)

throws ClassNotFoundException {

return forName0(className, true, ClassLoader.getCallerClassLoader());

}

...

}

关于forName0 请自己查看jdk source.

的是把指定的Class装载到JVM中来。(注重class的装载、初始化过程)在装载过程中将执行被装载类的static块(如下)

2 sun的JdbcOdbcDriver 源码:

public class JdbcOdbcDriver extends JdbcOdbcObject

implements JdbcOdbcDriverInterface

{

...

/**

* connect to DB

*/

public synchronized Connection connect(String s, PRoperties properties)

throws SQLException

{

if(JdbcOdbcObject.isTracing())

JdbcOdbcObject.trace("*Driver.connect (" + s + ")");

if(!acceptsURL(s))

return null;

if(hDbc != 0)

{

disconnect(hDbc);

closeConnection(hDbc);

hDbc = 0;

}

if(!initialize())

{

return null;

}

else

{

JdbcOdbcConnection jdbcodbcconnection = new JdbcOdbcConnection(OdbcApi, hEnv, this);jdbcodbcconnection.initialize(getSubName(s), properties, DriverManager.getLoginTimeout());jdbcodbcconnection.setURL(s);

return

jdbcodbcconnection;

}

}

static

{

if(JdbcOdbcObject.isTracing())

JdbcOdbcObject.trace("JdbcOdbcDriver class loaded");

JdbcOdbcDriver jdbcodbcdriver = new JdbcOdbcDriver();

try

{

DriverManager.registerDriver(jdbcodbcdriver);

}

catch(SQLException sqlexception)

{

if(JdbcOdbcObject.isTracing())

JdbcOdbcObject.trace("Unable to register driver");

}

}

}

public interface JdbcOdbcDriverInterface

extends Driver

{

...

}

3 连接过程

jdbc.sql.Connection con = DriverManager.getConnection("jdbc:odbc:pubs","sa","");

public class DriverManager {

public static synchronized Connection getConnection(String url,

String user, String passWord) throws SQLException {

java.util.Properties info = new java.util.Properties();

// Gets the classloader of the code that called this method, may

// be null.

ClassLoader callerCL = DriverManager.getCallerClassLoader();

if (user != null) {

info.put("user", user);

}

if (password != null) {

info.put("password", password);

}

return

(getConnection(url, info, callerCL));

}

private static synchronized Connection getConnection(String url,java.util.Properties info, ClassLoader callerCL) throws SQLException

{

...

Connection result = di.driver.connect(url, info);

...

}

}

4 结构图:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有