怎么使用JDBC连接SQL Server

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么使用JDBC连接SQL Server相关的知识,希望对你有一定的参考价值。

首先确保SQLSERVER服务正在运行,并可以允许远程访问连接
然后按如下步骤进行连接
1.安装JDBC驱动
1)下载JDBC驱动
http://www.microsoft.com/zh-cn/download/details.aspx?id=11774
2)执行sqljdbc_4.0.2206.100_chs.exe解压驱动文件
3)拷贝以下目录中的sqljdbc_auth.dll到Windows的System32目录。对x64的机子,x64的dll拷到C:\\Windows\\System32,x86的dll拷到C:\\Windows\\SysWOW64目录。
Microsoft JDBC Driver 4.0 for SQL Server\\sqljdbc_4.0\\chs\\auth\\
2.在Java程序中连接SQL Server
classpath中加上安装好的SQL Server jdbc jar包
Microsoft JDBC Driver 4.0 for SQL Server\\sqljdbc_4.0\\chs\\sqljdbc4.jar
连接SQL Server的JDBC代码
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url = "jdbc:sqlserver://localhost:54364;databaseName=master;IntegratedSecurity=True";
Connection con = DriverManager.getConnection(url);
在SQL Server Browser服务开启的情况下也可以通过服务名连接
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url = "jdbc:sqlserver://localhost\\\\SQLEXPRESS;databaseName=master;IntegratedSecurity=True";
Connection con = DriverManager.getConnection(url);
3.身份验证模式
SQL Server默认使用Windows身份验证模式,这也是官方推荐的模式,安全性更高。上面的连接例子就是采用的Windows认证。如果要使用混合认证模式,需要下载SQL Server Management Studio,并通过SQL Server Management Studio修改认证模式为混合认证模式。
SQL Server Management Studio的下载地址
http://www.microsoft.com/zh-cn/download/details.aspx?id=8961
修改SQL Server认证模式的方法
http://technet.microsoft.com/zh-cn/library/ms188670(v=sql.105).aspx
混合认证模式下,可以由数据库进行认证,连接时需要提供用户名和密码
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url = "jdbc:sqlserver://localhost:54364;databaseName=master";
Connection con = DriverManager.getConnection(url,"user","password");
参考技术A 自己看

图文并茂

http://jingyan.baidu.com/article/cbf0e500ed68622eab289356.html本回答被提问者和网友采纳
参考技术B 首先加载数据库驱动,然后调用DriverManager类连接数据库,其次使用PreparedStatement预编译sql语句;具体orcle,与mysql连接就驱动不一样;例如:orcle的
oracle---Class.forName("oracle.jdbc.driver.OracleDriver");
//msql---Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "user", "pwd");

PreparedStatement ps = conn.prepareStatement(sql);

eclipse用jdbc连接SQL server时出现了问题……这是啥情况啊!请大神指教!

按照教程一步步来的 驱动器和jdk都是是最新版 不知道哪里出了问题……

一、安装JDBC驱动程序
二、加载驱动程序并建立连接对象
1.sql server的连接代码:
2.关于这里的用户名和密码
3.解决在用sa登录时可能出现的问题
三、建立数据库
四、在servlet中创建语句对象并执行操作
1.Statement对象的创建
2.查询:调用Statement对象的executeQuery()方法,得到ResultSet对象。
3.关于ResultSet对象——获得执行结果
①.next()定位记录
②getXxx获得某条记录中的列值
4.非查询语句:使用executeUpdate()方法
5.讲讲可滚动、可更新的ResultSet——Statement对象创建时的三个参数
①resultType——ResultSet是否可滚动
可能值:
移动结果集游标的方法(对于可滚动的结果集)
②concurrency——是否可通过ResultSet更新表
可能值
更新方法
五、使用预处理语句——preparedStatement对象代替Statement
preparedStatement对象的创建
创建时的参数之一sql语句的参数-“?”和对?进行赋值
执行预处理语句-查询、更新、其他
六、一个完整的servlet示例
一、安装JDBC驱动程序

下载SQL Server JDBC 驱动程序 6.0点击下载,这里我选择的是.exe版本,如下图:

点击Next->下载完成后双击->弹出的窗体中点击【Unzip】按钮
解压后的目录中有一个jre7和jre8文件夹

将对应的.jar包复制到Tomcat安装目录的lib目录中或web应用程序的WEB-INF\\lib目录中
注意jdk是什么版本的就复制哪个文件夹下的jar包

如果不知道自己的jdk版本:
win+R 输入cmd 进入命令行 输入 java -version

二、加载驱动程序并建立连接对象

1.sql server的连接代码:

//加载
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");、
//连接数据库
Connection con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=xxx", user, password);
1
2
3
4
其中1433是SQL Server的默认端口号,DatabaseName是要连接数据库的名称,user是用户名,password是登录密码。
其他数据库的连接代码也可以通过百度找到。

2.关于这里的用户名和密码

平时使用数据库时你可能是这么连接的:

要用到用户名和密码的话,可以直接使用sa,按上图方式登录后:安全性->登录名->sa->属性->更改密码

然后关闭ssms,重新开启,选择sql server身份验证,尝试用sa和新的密码登录

3.解决在用sa登录时可能出现的问题

①已成功与服务器建立连接,但是在登录过程中发生错误。(provider:命名管道提供程序,error:0-管道的另一端上无任何进程。)(Microsoft SQL Server,错误:233)
开始—所有程序—Microsoft SQL Server 2017 —Microsoft SQL Server 2017配置管理器
如果在这里没有,则右键我的电脑-管理,按下图所示将右边的“Named Pipes”和“TCP/IP”启用

再重启SQL Server:右键下图中正在运行的sql server-选择重新启动

②用户 ‘sa’ 登录失败。 (Microsoft SQL Server,错误: 18456)
看这里可以解决
感觉它讲得够详细了,这里就不赘述了。

三、建立数据库

和一般建立数据库并没有什么不同,这里就不说了。
如果完全不清楚怎么用可以查看之前的一篇博客:数据库入门

四、在servlet中创建语句对象并执行操作

示例代码——以查询为例

String sql = "SELECT * FROM products";
Statement pstmt = dbconn.Statement();
ResultSet rst = stmt.executeQuery(sql);
if(rst.next())//抛出SQLException异常

//创建javaBean实例并给它赋值,并将其存储到作用域变量中请求转发/重定向,例如
Product product = new Product();
product.setProd_id(rst.getString("prod_id"));

else
response.sendRedirect("/helloweb/error.jsp");

1
2
3
4
5
6
7
8
9
10
11
12
1.Statement对象的创建

语句对象需要通过connection对象创建:(如上文二中建立连接对象的代码)

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");、
Connection con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=xxx", user, password);
1
2
创建Statement对象的三种声明

Statement stmt = con.createStatement();
Statement stmt = con.createStatement(int resultType,int concurrency);
Statement stmt = con.createStatement(int resultType,int concurrency,int holdability);
1
2
3
对于这三个参数的解释牵涉到ResultSet对象,先看下面的内容,在之后会有解释。

2.查询:调用Statement对象的executeQuery()方法,得到ResultSet对象。

执行查询语句时Statement对象调用executeQuery(Srting sql)方法,该方法的返回值是ResultSet,用于保存查询的结果集。
ResultSet rst = stmt.executeQuery(sql);←这样我们就得到了ResultSet对象rst。
注意Result对象的记录行从1开始,而不是0。

3.关于ResultSet对象——获得执行结果

①.next()定位记录

rst.next()用于定位到下一条记录。对新产生的ResultSet对象,游标指向第一行的前面。
该方法的返回值是Boolean,如果已无下一条记录则返回false。

②getXxx获得某条记录中的列值

//当值为String时

rst.getString(String columnName);//参数为列名
rst.getString(int columnIndex);//参数为列的序号,从1开始
1
2
3
4
4.非查询语句:使用executeUpdate()方法

public int executeUpdate(String sql) 返回值为受影响行数,如果语句没有返回值则返回0。
INSERT、CREATE TABLE、DELETE等等语句都可以使用executeUpdate()方法
public int[] executeBatch():用于在有一个操作中发送多条SQL语句。

5.讲讲可滚动、可更新的ResultSet——Statement对象创建时的三个参数

使用不带参数的.createStatement();时,resultset对象默认不可滚动、不可更新。

①resultType——ResultSet是否可滚动

可能值:

ResultSet.TYPE_SCROLL_SENSITIVE——可滚动,且当数据库发生改变时,变化对结果集可见
ResultSet.TYPE_SCROLL_INSENSITIVE——可滚动,但数据库发生改变时,变化对结果集不可见
ResultSet.TYPE_FORWARDONLY——不可滚动

移动结果集游标的方法(对于可滚动的结果集)

方法 说明
public boolean previous() throws SQLException 游标向前移动一行,存在合法的行返回true,不存在返回false
public boolean first() throws SQLException 移动游标使其指向第一行
public boolean last() throws SQLException 移动游标使其指向最后一行
public boolean absolute(int rows) throws SQLException 移动游标使其指向指定行
public boolean relative(int rows) throws SQLException 移动游标,参数为相对现在在的行基准,正向前移动,负向后
public boolean isFirst() throws SQLException 返回游标是否指向第一行
public boolean isLast() throws SQLException 返回游标是否指向最后一行
public int getRow() 返回游标所在当前行行号
②concurrency——是否可通过ResultSet更新表

可能值

ResultSet.CONCUR_READ_ONLY——只读
ResultSet.CONCUR_UPDATABLE——可通过ResultSet更新表

更新方法

更新:
updateXxx,以int类型为例:

//用指定整数x更新当前指定列
public void updateInt(int columnIndex,int x)
public void updateInt(String columnName,int x)
1
2
3
updateXxx指定了更新进去的数据类型。
public void updateRow() throws SQLException//调用updateXxx,再调用updateRow()实现修改,在调用updateRow()前可使用cancelRowUpdate()取消更新。

插入:
①public void moveToInsertRow() throws SQLException //将游标移到插入行,再用updateXxx修改值,再调用insertRow插入
②public void insertRow() throws SQLException //插入一行数据
③public void moveToCurrentRow() throws SQLException //返回当前行,也可以在insertRow() 前调用取消插入

删除:
public void deletetRow() throws SQLException

五、使用预处理语句——preparedStatement对象代替Statement

因为它比Statement的效率要高。

示例代码——依旧以查询为例,注意和四中Statement写法的比较

String sql = "SELECT * FROM products WHERE prod_id=?";
PreparedStatement pstmt = dbconn.prepareStatement(sql);
pstmt.setString(1, productid);
ResultSet rst = pstmt.executeQuery();
if(rst.next())//抛出SQLException异常

//创建javaBean实例并给它赋值,并将其存储到作用域变量中请求转发/重定向,例如
Product product = new Product();
product.setProd_id(rst.getString("prod_id"));

else
response.sendRedirect("/helloweb/error.jsp");

1
2
3
4
5
6
7
8
9
10
11
12
13
preparedStatement对象的创建

它比Statement对象创建时多了一个参数——sql语句

PreparedStatement pstmt = con.prepareStatement(String sql);
PreparedStatement pstmt = con.prepareStatemen(String sql,int resultType,int concurrency);
PreparedStatement pstmt = con.prepareStatemen(String sql,int resultType,int concurrency,int holdability);
1
2
3
创建时的参数之一sql语句的参数-“?”和对?进行赋值

在sql语句中用?指定参数。(或者说是占位符)
从字符串左侧开始第一个占位符的序号为1,以此类推
pstmt.setXxx(int index, Xxx value);用于给占位符赋值

执行预处理语句-查询、更新、其他

注意必须要调用这些方法的无参数版,而且在执行sql语句前必须用setXxx设置好所有参数

//查询语句
ResultSet result = pstmt.executeQuery();

//更新语句
int n = pstmt.executeUpdate();

//其他语句
Boolean b = pstmt.execute();
1
2
3
4
5
6
7
8
六、一个完整的servlet示例

package com.homework7.servlet;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.homework7.bean.Product;

/**
* Servlet implementation class QueryProductServlet
*/
@WebServlet("/queryproduct.do")
public class QueryProductServlet extends HttpServlet
private static final long serialVersionUID = 1L;

Connection dbconn = null;

public void init()

String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String dburl = "jdbc:sqlserver://localhost:1433;DatabaseName=webHomework";
String username = "sa";
String password = "123456";
try
Class.forName(driver);
System.out.println("数据库驱动加载成功");
dbconn = DriverManager.getConnection(dburl, username, password);
System.out.println("数据库连接成功");
catch (ClassNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch(SQLException e2)


/**
* @see HttpServlet#HttpServlet()
*/
public QueryProductServlet()
super();
// TODO Auto-generated constructor stub


/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
// TODO Auto-generated method stub
String productid = request.getParameter("productid");
try
String sql = "SELECT * FROM products WHERE prod_id=?";
PreparedStatement pstmt = dbconn.prepareStatement(sql);
pstmt.setString(1, productid);
ResultSet rst = pstmt.executeQuery();
if(rst.next())

Product product = new Product();
product.setProd_id(rst.getString("prod_id"));
product.setPname(rst.getString("pname"));
product.setPrice(rst.getDouble("price"));
product.setStock(rst.getInt("stock"));
request.getSession().setAttribute("product", product);
response.sendRedirect("/helloweb/displayProduct.jsp");
else
response.sendRedirect("/helloweb/error.jsp");

catch(SQLException e)
e.printStackTrace();



/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
// TODO Auto-generated method stub
doGet(request,response);


public void destroy()
try
dbconn.close();
catch(Exception e)
e.printStackTrace();



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
文章最后发布于: 2018-06-08
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yogima/article/details/80614575
参考技术A 你的数据库名字是Drivermanager? 不是123吗?
看你这个情况,应该是连接未找到你的数据库名字,把Drivermanager换成你的数据库名字。也就是蓝条状标示出的那一行的Databasename.

以上是关于怎么使用JDBC连接SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

怎么使用JDBC连接SQL Server

怎么连接sql server数据库

使用JDBC连接SQL SERVER的数据库后,读取出来的中文数据是乱码?

eclipse用jdbc连接SQL server时出现了问题……这是啥情况啊!请大神指教!

jdbc连接sql Server 数据库时用的数据库名是指实例名吗?

使用 JDBC 的 SQL Server 连接 - JTDS