Java连接SQL Server数据库的一个简单例子
演示在用java连接SQL Server数据库。用了一个简单的java程序作试验。
第一步:获得jdbc for SQL Server驱动程序
sqljdbc.jar 和 sqljdbc4.jar sqljdbc_auth.dll
为了支持向后兼容以及可能的升级方案,JDBC Driver 2.0 在每个安装包中都包括 2 个 JAR 类库:sqljdbc.jar 和 sqljdbc4.jar。
JAR | 说明 |
---|---|
sqljdbc.jar |
sqljdbc.jar 类库提供对 JDBC 3.0 的支持。 sqljdbc.jar 类库要求使用 5.0 版的 Java 运行时环境 (JRE)。连接到数据库时,在 JRE 6.0 上使用 sqljdbc.jar 会引发异常。 注意: JDBC Driver 2.0 不支持 JRE 1.4。使用 JDBC Driver 2.0 时必须将 JRE 1.4 升级至 JRE 5.0 或更高版本。在某些情况下,您可能需要重新编译应用程序,因为它可能与 JDK 5.0 或更高版本不兼容。有关详细信息,请参阅 Sun Microsystems 网站上的文档。
|
sqljdbc4.jar |
sqljdbc4.jar 类库提供对 JDBC 4.0 的支持。它不仅包括 sqljdbc.jar 的所有功能,还包括新增的 JDBC 4.0 方法。 sqljdbc4.jar 类库要求使用 6.0 或更高版本的 Java 运行时环境 (JRE)。在 JRE 1.4 或 5.0 上使用 sqljdbc4.jar 会引发异常。 注意: 如果应用程序必须在 JRE 6.0 上运行,即使该应用程序不使用 JDBC 4.0 功能,也应使用 sqljdbc4.jar。
|
请注意,尽管驱动程序旨在与所有主要的 Sun 等效 Java 虚拟机一起工作并由这些虚拟机支持,但却是在 Sun JRE 5.0 或更高版本上进行测试的。
注意:JRE6的要选择sqljdbc4.jar
第二步:设置环境变量CLASSPATH
将下载下来的sqljdbc.jar或sqljdbc4.jar放到目录d:\shared\lib下。将环境变量CLASSPATH设置为:D:\shared\lib\sqljdbc.jar
set CLASSPATH=.;d:\shared\lib\sqljdbc.jar;
(注意:第一个“.”,这个代表当前目录。)
第三步:编写一段简单的java程序。
下面的这段程序使用驱动sqljdbc.jar连接SQL Server 2005数据库,并提取master数据库中的用户表的ID和name两列信息。
SQL Server 2005服务器在本机,端口为1433。登录sa的密码为:secret
执行:select id,name,crdate from dbo.sysobjects where type='U' 这条语句返回当前数据库(这可在url中指定!)中的用户表的id和name列。
import java.sql.*;
import java.util.*;public class Conn2SQLServer {
public static void main(String[] args) {
try {
String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //加载JDBC驱动
Class.forName(driverName).newInstance();
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=master";//连接本机SQLServer服务器的master库,端口为默认的1433
String userName = "sa"; //登录账号
String userPwd = "secret"; //密码
Connection conn = DriverManager.getConnection(url, userName,userPwd);
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql = "select id,name,crdate from dbo.sysobjects where type='U'"; // 表
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println("oject_id:"+rs.getString(1)+",oject_name:"+rs.getString(2)); // 取得第一列和第二列的值
}
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
}
将上面这段代码保存到:d:\demo\Conn2SQLServer.java
第四步:编译java源文件为class文件
Java编译器javac.exe的版本为:1.5.0_15
javac.exe Conn2SQLServer.java
第五步:执行java程序连接SQLServer 2005数据库,并显示查询结果
java程序的版本也是:1.5.0_15
java Conn2SQLServer
d:\demo>%jre%\bin\java Conn2SQLServer
oject_id:117575457,oject_name:spt_fallback_db
oject_id:133575514,oject_name:spt_fallback_dev
oject_id:149575571,oject_name:spt_fallback_usg
oject_id:1099150961,oject_name:spt_monitor
oject_id:1115151018,oject_name:spt_values
oject_id:1147151132,oject_name:MSreplication_options
备注:
关于驱动程序的版本:
本例子中java编译器javac的版本为:1.5.0_15,所以使用的jdbc for sqlserver为:sqljdbc.jar。JRE6的话需要使用sqljdbc4.jar!
在java1.5.0_15环境下使用sqljdbc4.jar,报错:Bad version number in .class file
d:\demo>set CLASSPATH=.;d:\shared\lib\sqljdbc4.jar;
d:\demo>%jre%\bin\javac Conn2SQLServer.java
d:\demo>%jre%\bin\java Conn2SQLServer
Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at Conn2SQLServer.main(Conn2SQLServer.java:8)
关于不同驱动程序的连接串:
在SQL Server 2000中加载驱动和URL路径的语句是:
String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
String dbURL = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=master";
而SQL Server 2005中加载驱动和url的语句则为:
String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String dbURL = "jdbc:sqlserver://localhost:1433;DatabaseName=master";
如果写法错误将会找不到驱动.
SQL Server的身份验证方式:
指定的多个 SQL Server 实例
SQL Server 2000 和 SQL Server 2005 允许在每台服务器上安装多个数据库实例。每个实例都由一个专用名称所标识。若要连接到 SQL Server 的命名实例,可以使用命名实例的端口号(首选),也可将实例名指定为 JDBC URL 属性或 datasource 属性。如果未指定实例名属性或端口号属性,则会创建与默认实例的连接。如以下实例所示:
若要使用端口号,请执行下列操作:
jdbc:sqlserver://localhost:1433;integratedSecurity=true;<more properties as required>;
若要使用 JDBC URL 属性,请执行下列操作:
jdbc:sqlserver://localhost;instanceName=instance1;integratedSecurity=true;<more properties as required>;
转义连接 URL 中的值
由于包含特殊字符(如空格、分号和引号),所以必须转义连接 URL 值的某些部分。如果这些字符包含在大括号中,则 JDBC 驱动程序将支持对其进行转义。例如,{;} 将转义分号。转义的值可以包含特殊字符(特别是“=”、“;”、“[]”和空格),但不能包含大括号。应将必须进行转义且包含大括号的值添加到属性集中。注意: 大括号内的空白为常量,不能删除。
本机集成身份验证模式
JDBC 驱动程序支持通过 integratedSecurity 连接字符串属性在 Windows 操作系统上使用“类型 2”集成身份验证。若要使用集成身份验证,请将sqljdbc_auth.dll 文件复制到计算机中 Windows 系统路径下的 JDBC 驱动程序安装目录中。
sqljdbc_auth.dll 文件的安装位置如下:<安装目录>\sqljdbc_<版本>\<语言>\auth\
注意: 如果使用 32 位处理器,请使用 x86 文件夹中的 sqljdbc_auth.dll 文件。如果使用 64 位处理器,请使用 x64 文件夹中的 sqljdbc_auth.dll 文件。
也可以通过设置 java.libary.path 系统属性来指定 sqljdbc_auth.dll 的目录,例如,如果 JDBC 驱动程序安装在默认目录中,您可以在 Java 应用程序启动时使用以下虚拟机 (VM) 参数来指定 DLL 的位置:
-Djava.library.path=C:\Microsoft SQL Server 2005 JDBC Driver\sqljdbc_<version>\enu\auth\x86
注意要把Microsoft SQL Server JDBC Driver 2.0\sqljdbc_2.0\chs\auth\x86设到PATH中(32位机),不然会说sqljdbc_auth.dll找不到!
JDBC 驱动程序支持使用具有连接属性集和 serverName 连接字符串属性的 IPv6 地址。连接字符串不支持在 IPv6 地址中使用初始 serverName 值,如 jdbc:sqlserver://serverName。使用 serverName 的名称而不是原始 IPv6 地址将适用于连接中的所有情况。
使用 serverName 属性
jdbc:sqlserver://;serverName=3ffe:8311:eeee:f70f:0:5eae:10.203.31.9\\instance1;integratedSecurity=true;
使用属性集
Properties pro = new Properties();
pro.setProperty("serverName", "serverName=3ffe:8311:eeee:f70f:0:5eae:10.203.31.9\\instance1");
Connection con = DriverManager.getConnection("jdbc:sqlserver://;integratedSecurity=true;", pro);
参考:
XP上安装配置JDK,Tomcat,SqlServer2000和JDBC
MS Sql 2000中字段text为空时的bug解决办法:sqljdbc4.jar