使用JDBC时Class.forName()的作用

使用JDBC时,我们都会很自然得使用下列语句:

Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
String user = "";
String psw = "";
Connection con = DriverManager.getConnection(url,user,psw);

为什么说很自然呢,因为无论是网上还是书本教程上得例子都是这样的,而且程序也确实正常运行了,于是大家也就心安理得的找葫芦画瓢下去了。

一定要有这一句吗?不是的,我们完全可以用这样一句代替它:

com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();
//or:
//new com.mysql.jdbc.Driver();
String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
String user = "";
String psw = "";
Connection con = DriverManager.getConnection(url,user,psw);

大家可能都看出个大概来了,我们只需要在调用DriverManager的getConnection方法之前,保证相应的Driver类已经被加载到jvm中,并且完成了类的初始化工作就行了,而具体是怎样实现这个功能却是没有讲究的。上面两种方法都可以实现这个功能,因此程序可以正常运行。注意了,如果我们进行如下操作,程序是不能正常运行的,因为这样仅仅使Driver类被装载到jvm中,却没有进行相应的初始化工作。

com.mysql.jdbc.Driver driver = null;
//or:
ClassLoader cl = new ClassLoader();
cl.loadClass("com.mysql.jdbc.Driver");

我们都知道JDBC是使用Bridge模式进行设计的,DriverManager就是其中的Abstraction,java.sql.Driver是Implementor,com.mysql.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

哦,原来是com.mysql.jdbc.Driver在装载完后自动帮我们完成了这一步骤。源代码是这样的:

package com.mysql.jdbc

public class Driver extends NonRegisteringDriver implements java.sql.Driver ...{
// ~ Static fields/initializers
// --------------------------------------------- //
// Register ourselves with the DriverManager
//
static ...{
  t ry ...{
       java.sql.DriverManager.registerDriver(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()
}
}

时间: 2024-09-13 10:50:02

使用JDBC时Class.forName()的作用的相关文章

jdbc中class.forname的作用_java

使用JDBC时,我们都会很自然得使用下列语句: 复制代码 代码如下: Class.forName("com.mysql.jdbc.Driver");   String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";   String user = "";   String psw = "";   Connectio

java中Class.forName的作用浅谈_java

Class.forName(xxx.xx.xx) 返回的是一个类 一.首先你要明白在java里面任何class都要装载在虚拟机上才能运行. 1. forName这句话就是装载类用的(new是根据加载到内存中的类创建一个实例,要分清楚).   至于什么时候用,可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?     A a = (A)Class.forName("pacage.A").newInstance();        这和          

sql server-在eclipse链接Jdbc时,出现的问题怎么解决?

问题描述 在eclipse链接Jdbc时,出现的问题怎么解决? package com.task22; import java.sql.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBC { public void gets

注释-SQL注入时+--+的意思和作用?

问题描述 SQL注入时+--+的意思和作用? 在学习dvwa中的sql注入时,教程中有条语句http://localhost/DVWA-1.0.8/vulnerabilities/sqli/?id=1' and length(char(113,114))=2+--+ &Submit=Submit#.该句中的+--+的意思和作用?把它去掉之后,注入会失败,去掉两个+后,注释符号--失效.请大神来解答一下!!! 解决方案 +是拼接字符串的: --是SQL的注释标记,关键在于这个东西,后面的一切字符串

java-创建线程对象时,integer 的作用是什么?

问题描述 创建线程对象时,integer 的作用是什么? public class TestSale { public static void main(String[] args) { *SaleTicket a=new SaleTicket((Integer)100);* (new Thread(a,"售票厅1")).start(); (new Thread(a,"售票厅2")).start(); (new Thread(a,"售票厅3"))

驱动程序-set_bit函数的参数为BTN_0时是起到什么作用的,set_bit都有哪些参数,谢谢

问题描述 set_bit函数的参数为BTN_0时是起到什么作用的,set_bit都有哪些参数,谢谢 set_bit函数的参数为BTN_0时是起到什么作用的,set_bit都有哪些参数,在什么情况下用的,谢谢 解决方案 set_bit()set_bit()__set_bit() 解决方案二: 这里有个参考资料

修改参数时scope参数值的作用

修改参数 可以通过alter system或者导入导出来更改spfile的内容 从oracle9i开始,alter system命令增加了一个新的选项scope,scope参数有3个可选值:memory,spfile和both memory:只改变当前实例运行,重新启动数据库后失效 spfile:只改变spfile的设置,不改变当前实例运行,重新启动数据库后生效 both:同时改变实例及spfile,当前更改立即生效,重新启动数据库后仍然有效. 针对rac环境,alter system还可以指定

登陆网站时验证码有什么作用

  其实验证码有效防止某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,腾讯的QQ社区),我们利用比较简易的方式实现了这个功能. 虽然登陆麻烦一点,但是对社区还来说这个功能还是很有必要,也很重要.但还是提醒大家主要保护自己的密码,尽量使用混杂了数字.字母.符号在内的6位以上密码,不要使用诸如1234之类的简单密码或者与用户名相同.类似的密码. 不要因为只是来iclub问问问题,就随意设置密码,保护你自己的密码也是保护

sql server-jsp使用jdbc技术连接SQL Server2014时出现了一个问题,怎么解决?无法连接数据库

问题描述 jsp使用jdbc技术连接SQL Server2014时出现了一个问题,怎么解决?无法连接数据库 java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver 解决方案 SQL Server 连接JDBC时出现的问题jdbc连接sql server数据库问题分析jsp连接不上sql server数据库的问题分析 解决方案二: 下面是index.jsp首页. <%@ page language