一、安装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对象代替StatementpreparedStatement对象的创建创建时的参数之一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 —Microsoft SQL Server 配置管理器
如果在这里没有,则右键我的电脑-管理,按下图所示将右边的“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——不可滚动
移动结果集游标的方法(对于可滚动的结果集)
②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();}}}