• 一、安装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驱动程序

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

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

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

  4. 如果不知道自己的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);

其中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.Statement对象的创建

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

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");、
Connection con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=xxx", user, password);

创建Statement对象的三种声明

Statement stmt = con.createStatement();
Statement stmt = con.createStatement(int resultType,int concurrency);
Statement stmt = con.createStatement(int resultType,int concurrency,int holdability);

对于这三个参数的解释牵涉到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开始

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)

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");
}

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);

创建时的参数之一sql语句的参数-“?”和对?进行赋值

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

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

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

//查询语句
ResultSet result = pstmt.executeQuery();//更新语句
int n = pstmt.executeUpdate();//其他语句
Boolean b = pstmt.execute();

六、一个完整的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 blocke.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 stubString 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 stubdoGet(request,response);}public void destroy() {try {dbconn.close();}catch(Exception e) {e.printStackTrace();}}
}

java web之数据库的连接(使用JDBC连接sql server 2017)相关推荐

  1. 使用SQL Server 2017 Docker容器在.NET Core中进行本地Web API开发

    目录 介绍 先决条件 最好事先知道 假设 动机 跨平台 快速安装 经济有效 不同版本/多个实例 速度 持久性 找到SQL Server 2017镜像并在本地下载它 在没有卷挂载的情况下在本地执行SQ​ ...

  2. java web之数据库的连接(使用JDBC连接sql server)

    一.安装JDBC驱动程序 二.加载驱动程序并建立连接对象 1.sql server的连接代码: 2.关于这里的用户名和密码 3.解决在用sa登录时可能出现的问题 三.建立数据库 四.在servlet中 ...

  3. JSP详细篇——Java Web的数据库操作

    Java Web的数据库操作 JDBC技术 JDBC简介 JDBC是Java程序曹祖数据库的API,也是Java程序与数据库交互的一门技术.JDBC是java操作数据库的规范,由一组用Java语言编写 ...

  4. Java案例:利用JDBC访问SQL Server数据库

    Java案例:利用JDBC访问SQL Server数据库 1.以sa为登录名连接数据库服务器 2.附加选课数据库Xk,如下图所示: 3.启动Eclipse,创建Java项目TestDB

  5. aws rds监控慢sql_如何使用Web控制台和AWS CLI停止AWS RDS SQL Server

    aws rds监控慢sql This article explores the process to stop an AWS RDS SQL Server using web console and ...

  6. ef 连接localdb_如何连接和使用Microsoft SQL Server Express LocalDB

    ef 连接localdb Microsoft SQL Server Express LocalDB is intended for developers, it is very easy to ins ...

  7. 远程连接docker中的SQL Server

    远程连接docker上的SQL_Server 参考: 官方文档https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect ...

  8. #数据库--第1章 Windows 下的数据库导入 TPCH 数据(以 SQL Server 作为示例,MySQL同样适用)

    #数据库--第1章 Windows 下的数据库导入 TPCH 数据(以 SQL Server 作为示例,MySQL同样适用 一.TPCH 简介 二.TPCH 文件 三.生成 TPCH 数据 四.导入 ...

  9. MSSQL · 最佳实践 · RDS SDK实现数据库迁移上阿里云RDS SQL Server

    title: MSSQL · 最佳实践 · RDS SDK实现数据库迁移上阿里云RDS SQL Server author: 风移 摘要 至今,我们完成了SQL Server备份还原专题系列七篇月报分 ...

最新文章

  1. 图十字链表并求度c语言,利用十字链表存储树结构(便于同时求出某一点的入度与出度)------C语言实现...
  2. mysql是如何管理数据_【MySQL】如何管理数据库
  3. 考研数学一历年真题小题(选择填空)整理
  4. 『ACM-算法-动态规划』初识DP动态规划算法
  5. 回答一个微信好友的创业问题
  6. 大学python教材思维导图_Python核心知识体系的14张思维导图
  7. admin- 源码解析(流程)
  8. View requires API level 14 (current min is 8): GridLayout
  9. 易语言 网页用什么编码_Plessey条码用的什么编码方式?
  10. 1.c++模式设计-简单工厂模式
  11. 抽象背景素材|纯粹为了视觉兴趣而存在
  12. Java进阶1. Synchronized 关键字
  13. SpringBoot Cache 深入
  14. PyQt上位机软件开发简介
  15. 洛谷 3097 USACO13DEC 最优挤奶 Optimal Milking
  16. android 盒子 红白机 模拟器,安卓FC模拟器
  17. 【06月21日】北上资金持股比例排名
  18. 外挂、私服为何你们这么猖獗?
  19. 各种博客的代码高亮是如何实现的
  20. windows中定时操作(SetTimer函数用法)

热门文章

  1. 对抗生成网络GAN(优化目标篇)
  2. kotlin入门学习文档
  3. 宝塔linux面板搭建小程序wss,CentOS系统云服务器宝塔面板安装以及微信小程序服务器搭建...
  4. 写csv解决Excel打开乱码问题
  5. ①html画桃心两种实现
  6. 苹果平板可以配笔吗?好用的苹果笔推荐
  7. 阿里云ACP认证普尔文线上考试场预约指引
  8. 这么多年不容易...我很庆幸等到现在的你——知乎上关于男人成熟的好故事
  9. 测试工程师面试题答案分类详解
  10. Python神经网络编程(TR) (3)