/************第一种写法******************/
public class DaoUtil {
private static final String DRIVER="com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String URL="jdbc:sqlserver://localhost:1433;databaseName=newsDB";
private static final String USERNAME="sa";
private static final String PASSWORD="root";

static
{
try{
//加载驱动
Class.forName(DRIVER);
}catch(Exception e){

}
}


public static Connection getConnection(){
try{
Connection conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
return conn;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
}
/************第二种写法******************/
public class DaoUtil {
private static final String DRIVER="com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String URL="jdbc:sqlserver://localhost:1433;databaseName=newsDB";
private static final String USERNAME="sa";
private static final String PASSWORD="root"; public static Connection getConnection(){
try{
                           Class.forName(DRIVER); Connection conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
return conn;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
}

解决方案 »

  1.   


    而静态方法每次调用都会执行,那么用static关键字修饰他还有什么用呢(除了可以直接也用类名称调用比较方便以外),我一直没搞懂,请指点,
      

  2.   


    问题1:
    看第一种写法,依照您说的,那么在多个用户前后调用这个类的方法时候,是不是除了第一个用户要调用static块代码,其他用户是不是不会再调用静态块了(直接用就是)?问题2:
    看第二种写法,依照您说的,静态方法里面加载驱动,又获得连接,调用每次都会重复加载驱动又获得连接,并没有怎么提高程序的效率呀,对么?
      

  3.   

    第一种是每调用getConnection()方法都要加载驱动,而第二种则不是。
      

  4.   

    问题1:
    看第一种写法,依照您说的,那么在多个用户前后调用这个类的方法时候,是不是除了第一个用户要调用static块代码,其他用户是不是不会再调用静态块了(直接用就是)?问题2:
    看第二种写法,依照您说的,静态方法里面加载驱动,又获得连接,调用每次都会重复加载驱动又获得连接,并没有怎么提高程序的效率呀,对么?
      

  5.   

    LZ需要理解静态程序块和静态方法
    第一种,静态程序块,是主动执行的,在该类加载到JVM后,就会执行这段代码,其他程序块是无法调用这段代码的。
    第二种,是被动执行,当其他程序块调用该方法时,就会执行一次方法里面的代码。
    对于性能孰优孰劣,就不用再明说了吧。
      

  6.   


    那我写的第一种方法 与那种用单列模式写的 把Class.forName(DRIVER)放在私有的构造方法里的做法相比,谁更好写呢?或者都一样呢?
      

  7.   

    用第一种吧,只要加载一次就够了。第二种,虽然每次都加载但是 Java 的 ClassLoader 并不会傻到每次都去加载,第二种也是加载一次,接着就不会再加载了,但是第二种增加了很多无畏的调用。
      

  8.   


    我知道第一种方法要好了,不过还想问一下:我写的第一种方法 与那种用单列模式写的 把Class.forName(DRIVER)放在私有的构造方法里的做法相比,谁更好写呢?或者都一样呢?
      

  9.   

    采用第二种。两者效率方面差别几乎为零。
    class.forName会判断是否加载了,并不会需要重复加载,差别只是
    驱动类在 DaoUtil.class 加载时被加载驱动类在 getCon 第一次调用时被加载推荐非 static 块方式而使用函数,是因为 static 块在异常的处理上非常局限。
    并不能被调用者控制异常的处理行为,非常破坏整理设计结果,所以最好不要使用这种写法。
    class.forName 最主要的功能是把驱动类在driverManager中注册,这个是jdbc规范,注册是使用static块,将driver的class对象注册到driverManager中。