图解Java连接数据库内幕

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

  111

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值