龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

Java连结数据库内幕[图]

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
Java.sql包中的 java.sql.Driver, jdbc.sql.Connection等提供给程序开发人员统一的开发接口,数据库提供商提供相应的实现,对程序开发人员来讲只要知道这些接口都有哪些方法就可以了。但我们

  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 结构图:
  
  
精彩图集

赞助商链接