将对应的.jar包复制到Tomcat安装目录的lib目录中或web应用程序的WEB-INF\lib目录中
注意jdk是什么版本的就复制哪个文件夹下的jar包
//加载
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是登录密码。
其他数据库的连接代码也可以通过百度找到。
平时使用数据库时你可能是这么连接的:
要用到用户名和密码的话,可以直接使用sa,按上图方式登录后:安全性->登录名->sa->属性->更改密码
然后关闭ssms,重新开启,选择sql server身份验证,尝试用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)
看这里可以解决
感觉它讲得够详细了,这里就不赘述了。
和一般建立数据库并没有什么不同,这里就不说了。
如果完全不清楚怎么用可以查看之前的一篇博客:数据库入门
示例代码——以查询为例
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");
}
语句对象需要通过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对象,先看下面的内容,在之后会有解释。
执行查询语句时Statement对象调用executeQuery(Srting sql)
方法,该方法的返回值是ResultSet,用于保存查询的结果集。
ResultSet rst = stmt.executeQuery(sql);
←这样我们就得到了ResultSet对象rst。
注意Result对象的记录行从1开始,而不是0。
rst.next()
用于定位到下一条记录。对新产生的ResultSet对象,游标指向第一行的前面。
该方法的返回值是Boolean,如果已无下一条记录则返回false。
//当值为String时
rst.getString(String columnName);//参数为列名
rst.getString(int columnIndex);//参数为列的序号,从1开始
public int executeUpdate(String sql)
返回值为受影响行数,如果语句没有返回值则返回0。
INSERT、CREATE TABLE、DELETE等等语句都可以使用executeUpdate()方法
public int[] executeBatch():用于在有一个操作中发送多条SQL语句。
使用不带参数的.createStatement();时,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() | 返回游标所在当前行行号 |
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
因为它比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");
}
它比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语句中用?指定参数。(或者说是占位符)
从字符串左侧开始第一个占位符的序号为1,以此类推
pstmt.setXxx(int index, Xxx value);
用于给占位符赋值
注意必须要调用这些方法的无参数版,而且在执行sql语句前必须用setXxx设置好所有参数
//查询语句
ResultSet result = pstmt.executeQuery();
//更新语句
int n = pstmt.executeUpdate();
//其他语句
Boolean b = pstmt.execute();
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();
}
}
}