Sql Server2000数据库连接
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
//mydb为数据库
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
 以上是sql2000的JDBC连接,Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();是显示加载该驱动类并生成一个实例,但是这个实例并没有指定一个变量名,而且也没有看到这个实例在后面的代码中用到,为什么要生成这个实例呢?

解决方案 »

  1.   

    A a = (A)Class.forName("pacage.A").newInstance(); 
    这和你 
    A a = new A(); 
    是一样的效果。newInstance: 弱类型。低效率。只能调用无参构造。 
    new: 强类型。相对高效。能调用任何public构造。
      

  2.   

    Class.forname()是利用反射的方法加载了一个类,对于上述代码来说是加载了一个驱动类,类被加载后可以根据加载此类的类加载器获取到此类的引用。
    此操作由DriverManager类封装了,你如果想搞清楚可以看下
    DriverManager类的源代码
    private static synchronized Connection getConnection(
    String url, java.util.Properties info, ClassLoader callerCL) throws SQLException {

            /*
     * When callerCl is null, we should check the application's
     * (which is invoking this class indirectly)
     * classloader, so that the JDBC driver class outside rt.jar
     * can be loaded from here.
     */
    if(callerCL == null) {
        callerCL = Thread.currentThread().getContextClassLoader();
    }    
      
    if(url == null) {
        throw new SQLException("The url cannot be null", "08001");
    }
        
    println("DriverManager.getConnection(\"" + url + "\")");
        
    if (!initialized) {
        initialize();
    } // Walk through the loaded drivers attempting to make a connection.
    // Remember the first exception that gets raised so we can reraise it.
    SQLException reason = null;
    for (int i = 0; i < drivers.size(); i++) {
        DriverInfo di = (DriverInfo)drivers.elementAt(i);
          
        // If the caller does not have permission to load the driver then 
        // skip it.
        if ( getCallerClass(callerCL, di.driverClassName ) != di.driverClass ) {
    println("    skipping: " + di);
    continue;
        }
        try {
    println("    trying " + di);
    Connection result = di.driver.connect(url, info);
    if (result != null) {
        // Success!
        println("getConnection returning " + di);
        return (result);
    }
        } catch (SQLException ex) {
    if (reason == null) {
        reason = ex;
    }
        }
    }
      

  3.   

    newInstance()应该是没用的
    Driver都是在static{
    }
    中进行第一次加载,并向DriverManager注册自己的信息。
      

  4.   

    java采用了运行时反射机制,你只需照要求的写,生不生成实例都不重要好像,系统会自动实例化一个对象的。
      

  5.   

    // 是这么用的
    Class c = Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();还有Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver")这个是加载这个类,创建它的实例的用处,你查看Class类!
      

  6.   

    其实是有的driver用Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver")这样的方法加载后无法正确辨识url,加上.newInstance();就OK了。
    MS的jdbc driver好像没有这个问题。
      

  7.   

    加载驱动时,后面加个 .newInstance() 纯粹是多此一举,没有丝毫用处,还浪费时间。
      

  8.   

    不用 .newInstance()也没有问题啊。
      

  9.   

    同意16楼的看法,在这里使用.newInstance()是没有意义的。再说了SQLServerDriver类是实现了java.sql.Driver接口,开发数据库驱动程序必须实现这个接口,当你调用DriverManager.getConnection()方法时内部才会用到。
      

  10.   

    呵呵,看下获得class的三种方式就明白了
      

  11.   

    貌似就是,创建一个Class对象表示的类的新的实例,没参数表示实例化这个类,如果没有初始化,就初始化它·········
      

  12.   

    在应用中,不加newInstance()也可以运行的
      

  13.   

    Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver")
    不需要.newInstance();方法
    这个方法将返回一个实例
      

  14.   

     public static Class<?> forName(String className) 
                    throws ClassNotFoundException {
            return forName0(className, true, ClassLoader.getCallerClassLoader());
        }
    //以上是Class类的部分代码.你看看吧,它是一个静态的
      

  15.   

    我在连接的时候也没有用.newInstance() 觉得有点多余
      

  16.   

    Class.forName() 返回的是一个类, .newInstance() 后才创建一个对象。
     Class.forName()的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段
    在JDBC驱动中,有一块静态代码,也叫静态初始化块,它执行的时间是当class调入到内存中就执行(你可以想像成,当类调用到内存后就执行一个方法)。所以很多人把jdbc driver调入到内存中,再实例化对象是没有意义的。
      

  17.   

    newInstance 会创建一个多余的driver实例
      

  18.   

    这里的newInstance() 没有任何用处的。
    根据JDBC规范,数据库驱动应该在static里,向DriverManager注册自己。
    加载那个类只是为了注册驱动,生成它的实例并没有任何作用。
      

  19.   

    烂书坑人用的 别处无用
    System.setDriver好像也可以注册
      

  20.   

    可以不使用.newInstance();的吧。
    package jdbc;
    import java.sql.*;
    /**
     * <p>Title: </p>
     *
     * <p>Description: </p>
     *
     * <p>Copyright: Copyright (c) 2008</p>
     *
     * <p>Company: </p>
     *
     * @author not attributable
     * @version 1.0
     */
    public class dbconnectTest {        /**
             * @param args
             */
            public static void main(String[] args) {                // 定义数据库驱动程序
                    String DBDRIVER = "com.microsoft.jdbc.sqlserver.SQLServerDriver" ;
                    // 定义数据库连接地址
                    String DBURL = "jdbc:microsoft:sqlserver://172.29.1.134;DatabaseName=061110227" ;
                    // 定义数据库连接对象,属于java.sql包中的接口
                    Connection conn = null ;
                    // 定义Statement对象,用于操作数据库
                    Statement stmt = null ;
                    // 定义一字符串变量,用于保存SQL语句
                    String sql = null ;
                    //定义一个结果集以存放检索的结果
                    ResultSet r = null;                // 1、加载驱动程序
                    try
                    {
                            Class.forName(DBDRIVER) ;
                    }
                    catch(Exception e)
                    {
                            // 此处使用out.print是处于演示目的,在实际开发中所有的错误消息,
                            //绝对不能够通过System.out.print打印,否则会存在安全问题
                            System.out.println("数据库驱动程序加载失败!!!") ;
                    }                // 2、连接数据库
                    try
                    {
                            conn = DriverManager.getConnection(DBURL,"sa","123456") ;
                    }
                    catch(Exception e)
                    {
                            System.out.println("数据库连接失败!!!") ;
                    }                // 3、操作数据库
                    // 通过Connection对象实例化Statement对象
                    int ID;
                    String gongyingshangID;
                    String zhigongID;
                    String dinggoudanID;
                    String date;
                    int amount;
                    try
                    {
                            stmt = conn.createStatement() ;
                            // 为sql变量赋值
                            // 插入语句
                            sql = "select * from 订购单" ;
                            r = stmt.executeQuery(sql);
                            while (r.next())
                            {
                                    ID = r.getInt(1);
                                    gongyingshangID = r.getString(2);
                                    zhigongID = r.getString(3);
                                    dinggoudanID = r.getString(4);
                                    date = r.getString(5);
                                    amount = r.getInt(6);
                                    System.out.println(ID+"\t"+gongyingshangID+"\t"+zhigongID+"\t"+dinggoudanID+"\t"+date+"\t"+amount);
                            }                }
                    catch(Exception e)
                    {
                            System.out.println("操作数据库失败!!!") ;
                    }                // 4、关闭数据库
                    try
                    {
                            // 关闭操作
                            stmt.close() ;
                            // 关闭连接
                            conn.close() ;
                    }
                    catch(Exception e)
                    {
                            System.out.println("数据库关闭失败!!!") ;
                    }
            }}
     
      

  21.   

    多去看看java的基本知识就可以了,不过在真正开发中,没有人会去这样取得数据库连接,都是用连接池啊。
    在java开发中,很难区分那个是高手,那个是庸才,在linux中却非常容易区分。
      

  22.   

    有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);而有一些:Class.forName(xxx.xx.xx)。newInstance(),为什么会有这两种写法呢?
    Class.forName(xxx.xx.xx) 返回的是一个类,.newInstance() 后才创建一个对象.
    Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段.  在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的Driver类的代码都必须类似如下:public class MyJDBCDriver implements Driver {
        static {
            DriverManager.registerDriver(new MyJDBCDriver());
        }
    }所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了.
        在JDBC驱动中,有一块静态代码,也叫静态初始化块,它执行的时间是当class调入到内存中就执行(你可以想像成,当类调用到内存后就执行一个方法)。所以很多人把jdbc driver调入到内存中,再实例化对象是没有意义的。
      

  23.   

    找了点资料
    其实Class.forName()的作用在此处只是为了注册驱动程序;
    因为在java中只有注册了的程序才可以使用
    除了这种方法外还有其他两种方式:
    1
      在DOS下运行时加如运行参数 java -D jdbc.Drivers=com.microsoft.jdbc.sqlserver.SQLServerDriver 程序的名字
    2.在java程序中使用数据库驱动程序的位置之上加入System.setProperty("jdbc.Drivers","com.microsoft.jdbc.sqlserver.SQLServerDriver");就像你说的没有声明一个对象来引用它.
    至于newInstance() 我也不是很清楚不过看楼上的诸位解释应该如48楼说的吧