首页 > 学院 > 开发设计 > 正文

Java连结数据库内幕

2019-11-18 12:39:52
字体:
来源:转载
供稿:网友

  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 结构图:
  Java连结数据库内幕

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表