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

一、安装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 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();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/yogima/article/details/80614575
今日推荐