java web之数据库的连接(使用JDBC连接sql server 2017)
- 一、安装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更新表
- 可能值
- 更新方法
- ①resultType——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);
其中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)相关推荐
- 使用SQL Server 2017 Docker容器在.NET Core中进行本地Web API开发
目录 介绍 先决条件 最好事先知道 假设 动机 跨平台 快速安装 经济有效 不同版本/多个实例 速度 持久性 找到SQL Server 2017镜像并在本地下载它 在没有卷挂载的情况下在本地执行SQ ...
- java web之数据库的连接(使用JDBC连接sql server)
一.安装JDBC驱动程序 二.加载驱动程序并建立连接对象 1.sql server的连接代码: 2.关于这里的用户名和密码 3.解决在用sa登录时可能出现的问题 三.建立数据库 四.在servlet中 ...
- JSP详细篇——Java Web的数据库操作
Java Web的数据库操作 JDBC技术 JDBC简介 JDBC是Java程序曹祖数据库的API,也是Java程序与数据库交互的一门技术.JDBC是java操作数据库的规范,由一组用Java语言编写 ...
- Java案例:利用JDBC访问SQL Server数据库
Java案例:利用JDBC访问SQL Server数据库 1.以sa为登录名连接数据库服务器 2.附加选课数据库Xk,如下图所示: 3.启动Eclipse,创建Java项目TestDB
- 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 ...
- ef 连接localdb_如何连接和使用Microsoft SQL Server Express LocalDB
ef 连接localdb Microsoft SQL Server Express LocalDB is intended for developers, it is very easy to ins ...
- 远程连接docker中的SQL Server
远程连接docker上的SQL_Server 参考: 官方文档https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect ...
- #数据库--第1章 Windows 下的数据库导入 TPCH 数据(以 SQL Server 作为示例,MySQL同样适用)
#数据库--第1章 Windows 下的数据库导入 TPCH 数据(以 SQL Server 作为示例,MySQL同样适用 一.TPCH 简介 二.TPCH 文件 三.生成 TPCH 数据 四.导入 ...
- MSSQL · 最佳实践 · RDS SDK实现数据库迁移上阿里云RDS SQL Server
title: MSSQL · 最佳实践 · RDS SDK实现数据库迁移上阿里云RDS SQL Server author: 风移 摘要 至今,我们完成了SQL Server备份还原专题系列七篇月报分 ...
最新文章
- 图十字链表并求度c语言,利用十字链表存储树结构(便于同时求出某一点的入度与出度)------C语言实现...
- mysql是如何管理数据_【MySQL】如何管理数据库
- 考研数学一历年真题小题(选择填空)整理
- 『ACM-算法-动态规划』初识DP动态规划算法
- 回答一个微信好友的创业问题
- 大学python教材思维导图_Python核心知识体系的14张思维导图
- admin- 源码解析(流程)
- View requires API level 14 (current min is 8): GridLayout
- 易语言 网页用什么编码_Plessey条码用的什么编码方式?
- 1.c++模式设计-简单工厂模式
- 抽象背景素材|纯粹为了视觉兴趣而存在
- Java进阶1. Synchronized 关键字
- SpringBoot Cache 深入
- PyQt上位机软件开发简介
- 洛谷 3097 USACO13DEC 最优挤奶 Optimal Milking
- android 盒子 红白机 模拟器,安卓FC模拟器
- 【06月21日】北上资金持股比例排名
- 外挂、私服为何你们这么猖獗?
- 各种博客的代码高亮是如何实现的
- windows中定时操作(SetTimer函数用法)