isterDriver(sql.jdbc.Driver());
缺点:由sql.jdbc.Driver()可以知道,这里需要创建一个类的实例。创建类的实例就需要在java文件中将该类通过import导入,否则就会报错,即采用这种方式,程序在编译的时候不能脱离驱动类包,为程序切换到其他数据库带来麻烦。实际上这个地方还做了一次无用功,Driver类中本身已经含有静态块将instance放入驱动列表中。(详细说明可以参照mysql的Driver类)
public class Driver extends NonRegisteringDriver implements java.sql.Driver { // ~ Static fields/initializers // --------------------------------------------- // // Register ourselves with the DriverManager // static { try { java.isterDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } // ~ Constructors // ----------------------------------------------------------- /** * Construct a new driver and register it with DriverManager * * @throws SQLException * if a database error occurs. */ public Driver() throws SQLException { // Required for Class.forName().newInstance() } }
由上可见,在创建Driver类的时候,其实已经调用一次registerDriver方法了、
2,System.setProperty(”jdbc.drivers“,”sql.jdbc.Driver“);
可以脱离驱动包编译,可以同时设置多个驱动,多个驱动之间使用冒号分隔。
3,Class.forName(“sql.jdbc.Driver”);
=================================================================================
使用JDBC时,我们都会很自然得使用下列语句:
java 代码
1.Class.forName("sql.jdbc.Driver");
2.String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
3.String user = "";
4.String psw = "";
java的jdbc连接数据库5.Connection con = Connection(url,user,psw);
为什么说很自然呢,因为无论是网上还是书本教程上得例子都是这样的,而且程序也确实正常运行了,于是大家也就心安理得的葫芦画瓢下去了。
一定要有这一句吗?不是的,我们完全可以用这样一句代替它:
java 代码
2.//or:
3.//sql.jdbc.Driver();
4.String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
5.String user = "";
6.String psw = "";
7.Connection con = Connection(url,user,psw);
8.
大家可能都看出个大概来了,我们只需要在调用DriverManager的getConnection方法之前,保证相应的Driver类已经被加载到jvm中,并且完成了类的初始化工作就行了,而具体是怎样实现这个功能却是没有讲究的。上面两种方法都可以实现这个功能,因此程序可以正常
运行。注意了,如果我们进行如下操作,程序是不能正常运行的,因为这样仅仅使Driver类被装载到jvm中,却没有进行相应的初始化工作。
java 代码
2.//or:
3.ClassLoader cl = new ClassLoader(); ====================错误
4.cl.loadClass("sql.jdbc.Driver");
我们都知道JDBC是使用Bridge模式进行设计的,DriverManager就是其中的Abstraction,java.sql.Driver是Implementor,sql.jdbc.Driver是Implementor的一个具体实现(请参考GOF的Bridge模式的描述)。大家注意了,前一个Driver是一个接口,后者却是一个类,它实现了前面的Driver接口。
Bridge模式中,Abstraction(DriverManager)是要拥有一个Implementor(Driver)的引用的,但是我们在使用过程中,并没有将Driver对象注册到DriverManager中去啊,这是怎么回事呢?jdk文档对Driver的描述中有这么一句:
When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager
哦,原来是sql.jdbc.Driver在装载完后自动帮我们完成了这一步骤。源代码是这样的:
java 代码
1.sql.jdbc
2.
3.public class Driver extends NonRegisteringDriver implements java.sql.Driver {
4. // ~ Static fields/initializers
5. // --------------------------------------------- //
6. // Register ourselves with the DriverManager
7. //
8. static {
9. t ry {
10. java.isterDriver(new Driver());
11. } catch (SQLException E) {
12. throw new RuntimeException("Can't register driver!");
13. }
14. }
15.// ~ Constructors
16. // -----------------------------------------------------------
17./**
18. * Construct a new driver and register it with DriverManager
19. *
20. * @throws SQLException
21. * if a database error occurs.
22. */
23. public Driver() throws SQLException {
24. // Required for Class.forName().newInstance()
25. }
26.}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论