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();是显示加载该驱动类并生成一个实例,但是这个实例并没有指定一个变量名,而且也没有看到这个实例在后面的代码中用到,为什么要生成这个实例呢?
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();是显示加载该驱动类并生成一个实例,但是这个实例并没有指定一个变量名,而且也没有看到这个实例在后面的代码中用到,为什么要生成这个实例呢?
这和你
A a = new A();
是一样的效果。newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。
此操作由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;
}
}
}
Driver都是在static{
}
中进行第一次加载,并向DriverManager注册自己的信息。
Class c = Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();还有Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver")这个是加载这个类,创建它的实例的用处,你查看Class类!
MS的jdbc driver好像没有这个问题。
不需要.newInstance();方法
这个方法将返回一个实例
throws ClassNotFoundException {
return forName0(className, true, ClassLoader.getCallerClassLoader());
}
//以上是Class类的部分代码.你看看吧,它是一个静态的
Class.forName()的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段
在JDBC驱动中,有一块静态代码,也叫静态初始化块,它执行的时间是当class调入到内存中就执行(你可以想像成,当类调用到内存后就执行一个方法)。所以很多人把jdbc driver调入到内存中,再实例化对象是没有意义的。
根据JDBC规范,数据库驱动应该在static里,向DriverManager注册自己。
加载那个类只是为了注册驱动,生成它的实例并没有任何作用。
System.setDriver好像也可以注册
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("数据库关闭失败!!!") ;
}
}}
在java开发中,很难区分那个是高手,那个是庸才,在linux中却非常容易区分。
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调入到内存中,再实例化对象是没有意义的。
其实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楼说的吧