`

详解class.forName()链接数据库

阅读更多
public static Connection getConn() {
		Connection conn = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bbs", "root" , "root");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
是不是对Class.forName(String url)陌生啊?
根据字面的意思初步的理解可能是:为某个名字创建一个类!
好吧!让我们慢慢来认识一些class.forname .
在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法。通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此,单单使用Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象。 
    这里有必要提一下就是Class下的newInstance()和new有什么区别?,首先,newInstance( )是一个方法,而new是一个关键字,其次,Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用 new关键字生成对象没有这个限制。 
好,到此为止,我们总结如下: 
    Class.forName("")返回的是类 
    Class.forName("").newInstance()返回的是object 
T
newInstance() 
          创建此 Class 对象所表示的类的一个新实例。

有数据库开发经验朋友会发现,为什么在我们加载数据库驱动包的时候有的却没有调用newInstance( )方法呢?即有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);而有一些:Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢? 
    刚才提到,Class.forName("");的作用是要求JVM查找并加载指定的类,如果在类中有静态初始化器的话,JVM必然会执行该类的静态代码段。而在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的Driver类的代码都必须类似如下: 
   public class MyJDBCDriver implements Driver { 
    static { 
      DriverManager.registerDriver(new MyJDBCDriver()); //这样就将Driver和DriverManager相互关联起来了,即是:Driver向DriverManager注册了,就像我们新生报到一样。
在加载某一 Driver 类时,它应该(new)创建自己的实例并向 DriverManager(register)注册该实例
   } 
   } 
  既然在静态初始化器的中已经进行了注册,所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了。 
java.sql 
接口 Driver
________________________________________
public interface Driver
每个驱动程序类必须实现的接口。 
Java SQL 框架允许多个数据库驱动程序。 
每个驱动程序都应该提供一个实现 Driver 接口的类。 
DriverManager 会试着加载尽可能多的它可以找到的驱动程序,然后,对于任何给定连接请求,它会让每个驱动程序依次试着连接到目标 URL。 
强烈建议每个 Driver 类应该是小型的并且是单独的,这样就可以在不必引入大量支持代码的情况下加载和查询 Driver 类。 
在加载某一 Driver 类时,它应该创建自己的实例并向 DriverManager 注册该实例。这意味着用户可以通过调用以下程序加载和注册一个驱动程序 
   Class.forName("foo.bah.Driver")


分享到:
评论

相关推荐

    JDBC详解HTML-JDBC.pp

    <2>.Class.forName(driver).newInstance() <3>.new driver() 2>.取得数据库连接(Connect to the DataBase) <1>.用DriverManager取数据库连接 Connection cn = DriverManager.getConnection(url,uid,pwd); <2>....

    Java开发中连接数据库的方法和详解

     在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现。  例如:  try{  //加载MySql的驱动类  Class.forName(...

    JDBC 连接MySQL实例详解

    Class.forName(“com.mysql.jdbc.Driver”); Class.forName(“com.mysql.jdbc.Driver”).newInstance(); JDBC URL 定义驱动程序与数据源之间的连接 标准语法: <protocol>:<subprotocol>: MySQL的JDBC URL格式:...

    J2EE应用开发详解

    29 3.2.2 Class.forName()加载类的实例 30 3.2.3 loadClass获得类的实例 31 3.3 操作类的字段 31 3.3.1 获取对象的属性 31 3.4 操作类的方法 34 3.4.1 运行时调用对象的方法 34 3.4.2 无参构造函数 36 3.4.3 带参...

    spring chm文档

    Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright...

    jpivot学习总结.doc

    <Level name="地区" uniqueMembers="true" nameColumn="ORGENTITYNAME" column="ORGENTITYID" parentColumn="ORGENTITYPARENT" nullParentValue="null"> <Table name="ZY_ORG_CLOSURE"/> 3. ...

    SAP屠夫作品汇总

    Step 1.Define valuation class for those non-material 599 Step 2.Define PO Account Assignment Categories 602 Step 3. Assign account to VBR 604 Step 4.Where we define valuation class 604 2.Q&A 605 1.How...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【反射】反射中,Class.forName和classloader的区别 42 【JVM】JAVA编译原理和JVM原理 42 【JVM】Java内存模型 44 【JVM】jvm内存模型 45 主内存与工作内存 45 内存间交互操作 46 重排序 48 【JVM】内存泄漏 49 ...

    arcgis工具

    要链接到一个文档,单击Link to a Document,并输入文档路径名。 单击Tools工具栏中的Hyperlink工具,并单击图上某一个要素即可实现。 使用一个属性字段作为超链 在内容表中右击包含一个超链接字段的图层,然后...

    java 编写文件上传类简单易用

    二、各过程详解 A)填写表单并提交 通过表单提交数据的方法有两种,一种是 GET 方法,另一种是 POST 方法,前者通常用于提交少量的数据,而在上传文件或大量数据时,应该选用 POST 方法。在 HTML 代码中,在 <...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    7.2.3 方法名(Method Name) 159 7.2.4 参数列表(Parameter List) 159 7.2.5 方法体(Method Body) 160 7.2.6 方法串串烧 160 7.3 方法的参数:让汽车加速 161 7.3.1 方法的参数:让汽车可以加速 161 ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    7.2.3 方法名(Method Name) 159 7.2.4 参数列表(Parameter List) 159 7.2.5 方法体(Method Body) 160 7.2.6 方法串串烧 160 7.3 方法的参数:让汽车加速 161 7.3.1 方法的参数:让汽车可以加速 161 ...

    python入门到高级全栈工程师培训 第3期 附课件代码

    05 模块的执行以及__name__ 06 关于模块的介绍 07 time时间模块 08 random模块 第22章 01 模块的补充 02 sys修改环境变量 03 BASEDIR的介绍 04 os模块的介绍 05 sys模块的介绍 06 json模块 07 pickle模块 08 ...

Global site tag (gtag.js) - Google Analytics