一道JDBC菜

Author:zfive5(zhaozidong)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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(前面生成的驱动实例)保存到一个全局的Vector中(Singthon,以备将来通过约定的数据库连接串返回此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框架设计师们真是不简单!模式思想运用这么淋漓尽致。

实现不同,使用统一!

妙哉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值