一道JDBC菜

来源:互联网 发布:iphone怎么切换数据 编辑:程序博客网 时间:2024/06/10 07:09

Author:zfive5(zhaozidong)

Email :zfive5@yahoo.com.cn

 

这段时间除了工作以外,一直在看java,再加上过年放假等原由,感觉是到写一篇blog的时候了,就拿jdbc来烧烧看看,关于jdbc的文章很多,所以不想写成“怎么用式”的大米白面(必吃,但不能老吃只吃),前些天在csdn上看过一篇 ejb文章颇受启发,更加坚定了我的想法。

    关于jdbc的使用流程大致这样:

Class.forName("……").newInstance();
String url="….";
String user="…";
String password="…";
Connection conn= DriverManager.getConnection(url,user,password);

//以下操作数据库没有什么可写的,google一搜就可以了出来n页。

……

    Class.forName(String className) 完成的是DriverManager..registerDriver()功能,这在org.gjt.mm.mysql.Driver类(在mysqljdbc驱动程序中可以找到)的可以找到线索。

 

public class Driver extends com.mysql.jdbc.Driver {

   ……

    public Driver() throws SQLException {

        super();

    }

}

 

public class Driver extends NonRegisteringDriver implements java.sql.Driver {

   

    static {

        try {

            //这就是关键调用,生成一个实例,然后调用registerDriver()

            java.sql.DriverManager.registerDriver(new Driver());

        } catch (SQLException E) {

            throw new RuntimeException("Can't register driver!");

        }

    }

    ……

    public Driver() throws SQLException {

        // Required for Class.forName().newInstance()

    }

}

 

    那么DriverManager.registerDriver()完成又什么功能呢? 往下看了.

    public static synchronized void registerDriver(java.sql.Driver driver)

    throws SQLException {

    ……

    //driver(前面生成的驱动实例)保存到一个全局的VectorSingthon,以备将来通过约定的数据库连接串返回此jdbc驱动实例。

    DriverInfo di = new DriverInfo();

    di.driver = driver;

    di.driverClass = driver.getClass();

    di.driverClassName = di.driverClass.getName();

    drivers.addElement(di);

   ……

    }                            

 

 

看看DriverManager.getConnection()函数的实现getConnectionString string,String srring,String string函数实际上是对getConnectionStringProperties infoClassLoader callerCL)的一层包装,在这里直接看此函数就可以了。

   Connection.getConnection(String url, Properties info, callerCL){

    ......

    //函数核心部分代码,就是比较连接串,返回driver实例,然后调用这个driverconnect返回一个数据连接对象,以后在可以通过这个对象进行数据库操作了,使用StatementPerparedStatementCallableStatementResultset接口可以此数据库连接对象得到具体的实现,在所有的jdbc驱动里,这些接口也需要具体实现。

    SQLException reason = null;

    for (int i = 0; i < drivers.size(); i++) {

        DriverInfo di = (DriverInfo)drivers.elementAt(i);

        if ( getCallerClass(callerCL, di.driverClassName ) != di.driverClass ) {

        continue;

        }

        try {

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

        if (result != null) {

            // Success!

            return (result);

        }

        } catch (SQLException ex) {

        if (reason == null) {

            reason = ex;

        }

        }

    }

  //没有找到一个匹配的driver,返回一个sqlexception异常

……

}

    看到这里你是否清楚jdbc驱动的实现机制了,你是否想写个驱动呢?ok,我们完全可以写xml的jdbc驱动,只要实现java.sql.Driverjava.sql.Connection接口中的部分功能就可以写出这个简易版的jdbc驱动(要是写一个完全的驱动我是不会去写的,要实现的方法太多,这里不要鄙视呀,不信你可以去试试看)。

到这时想起了一本java书上描述php操作数据库方法不统一的话来,此时觉得php完全可以参照jdbc的样式规格,设计一套所谓的“pdbc”出来!

对了在jdbc中我看到了模式-工厂方法模式的运用。

 

DriverManager

 registerDriver()

 

Driver ------------------------- Connection

 connect()                         |

|                                  |

XXX_Driver()                       XXX_Connection

 connect()

 

DriverManager.

  getConnection ()

 

javasdk框架设计师们真是不简单!模式思想运用这么淋漓尽致。

 

实现不同,使用统一!

 

妙哉!

原创粉丝点击