一道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类(在mysql的jdbc驱动程序中可以找到)的可以找到线索。
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()函数的实现,getConnection(String string,String srring,String string) 函数实际上是对getConnection(String,Properties info,ClassLoader callerCL)的一层包装,在这里直接看此函数就可以了。
Connection.getConnection(String url, Properties info, callerCL){
......
//函数核心部分代码,就是比较连接串,返回driver实例,然后调用这个driver的connect返回一个数据连接对象,以后在可以通过这个对象进行数据库操作了,使用Statement、PerparedStatement、CallableStatement和Resultset接口可以此数据库连接对象得到具体的实现,在所有的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.Driver和java.sql.Connection接口中的部分功能就可以写出这个简易版的jdbc驱动(要是写一个完全的驱动我是不会去写的,要实现的方法太多,这里不要鄙视呀,不信你可以去试试看)。
到这时想起了一本java书上描述php操作数据库方法不统一的话来,此时觉得php完全可以参照jdbc的样式规格,设计一套所谓的“pdbc”出来!
对了在jdbc中我看到了模式-工厂方法模式的运用。
DriverManager
registerDriver()
Driver ------------------------- Connection
connect() |
| |
XXX_Driver() XXX_Connection
connect()
DriverManager.
getConnection ()
javasdk框架设计师们真是不简单!模式思想运用这么淋漓尽致。
实现不同,使用统一!
妙哉!
- 一道JDBC菜
- 每天一道菜--香菜炒毛肚
- Cooking Mama 一道菜走到底
- jdbc
- JDBC
- jdbc
- JDBC
- jdbc
- JDBC
- JDBC
- JDBC
- JDBC
- JDBC
- JDBC
- JDBC
- JDBC
- JDBC
- jdbc
- 关于23种设计模式的有趣见解(转)
- 在Struts中reset方法有什么作用(转)
- 桌面管理类及窗口、控件类
- VC小知识总结!(精品收集)
- vc使用ADO操作数据库总结 选择自 CDrea 的 Blog
- 一道JDBC菜
- C++ 栈类实力 代码分析
- (转)得不到和已失去
- (转)上辈子谁是那个埋你的人
- (转)与佛的对话
- (翻)两对夫妇
- (转)一位台湾校长的讲话——如何做人
- 关于23种设计模式的有趣见解(转)
- 国家税务总局关于调整个人取得全年一次性奖金等计算征收个人所得税方法问题的通知(20050101)