第一次写的博客,就拿一个以前做的JDBC+JSP例子来分享一下吧.首先说一下JDBC的操作步骤:
1、加载JDBC驱动程序 2、提供JDBC连接的URL 3、创建数据库的连接
4、执行SQL语句 5处理结果 6关闭JDBC对象 。
本文就做一个简单的用户登陆以及添加、删除和修改例子,使用的是mysql数据库。
数据库设计
用户表 |
||||
user |
No |
列名称 |
描述 |
|
id |
Int <pk> |
1 |
Id |
主键,自动增长 |
username |
Varchar(200) |
2 |
username |
用户登陆名 |
password |
Varchar(200) |
3 |
password |
用户登陆密码 |
首先
将mysql的驱动包复制到项目lib文件夹下
首先是一个登陆界面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <center> <h1>登陆操作</h1> <hr> <form action="login_check.jsp" method="post"> <table border="1"> <tr> <td colspan="2"> 用户登陆 </td> </tr> <tr> <td>登陆名:</td> <td><input type="text" name="name"></td> </tr> <tr> <td>登陆密码:</td> <td><input type="password" name="password"></td> </tr> <tr> <td colspan="2"> <input type="submit" value="登陆"> <input type="reset" value="重置"> </td> </tr> </table> </form> </center> </body> </html>
界面视图:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="java.sql.*"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'login_check.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <center> <h1> 登陆操作 </h1> <jsp:include page="dataconn.jsp" /> <!--这里是包含数据库连接的页面 --> <hr> <% Connection conn =(Connection)request.getAttribute("conn"); // 数据库连接 PreparedStatement pstmt = null; // 数据库预处理操作 ResultSet rs = null; // 查询要处理结果集 boolean flag = false; // 保存标记 %> <% try { %> <% String sql = "SELECT username FROM user WHERE username=? AND password=?";//此sql语句是传入用户名和密码查询出用户名 pstmt = conn.prepareStatement(sql);//实例化数据库操作对象 pstmt.setString(1, request.getParameter("name"));//设置用户名 pstmt.setString(2, request.getParameter("password"));//设置密码 rs = pstmt.executeQuery(); // 查询 if (rs.next()) { // 如果有数据,则可以执行 flag = true; // 表示登陆成功 } %> <% } catch (Exception e) { e.printStackTrace(); } finally { %> <jsp:include page="dataclose.jsp"/><!--这里是包含数据库关闭的页面 --> <% } %> <% if (flag) { // 登陆成功跳转到list.jsp页面 %> <jsp:forward page="list.jsp"/> <% } else { // 登陆失败则跳转到错误的页面 %> <jsp:forward page="login_failure.jsp" /> <% } %> </center> </body> </html>
本页面上以及后面的页面上都没见到数据库的连接和数据关闭代码,因为数据的连接代码已经写在dataconn.jsp页面上了,页面只要包含即可,包含语句<jsp:include page="dataconn.jsp" />、<jsp:include page="dataclose.jsp"/>,这样使代码的重用性得到了很大的提高。
<%@ page import="java.sql.*"%> <%!// 定义若干个数据库的连接常量 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";//定义数据库驱动程序 public static final String DBURL = "jdbc:mysql://localhost:3306/user";//数据库连接地址 public static final String DBUSER = "root";//数据库连接用户名 public static final String DBPASS = "admin";//数据库连接密码%> <% Connection conn = null; // 数据库连接 Class.forName(DBDRIVER); //加载驱动程序 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);//取得数据库的连接 PreparedStatement pstmt = null; // 数据库预处理操作 ResultSet rs = null; // 查询要处理结果集 request.setAttribute("conn",conn);//设置数据库连接 request.setAttribute("pstmt",pstmt); request.setAttribute("rs",rs); %>
<%@ page import="java.sql.*"%> <% try { ((ResultSet)request.getAttribute("rs")).close();//关闭查询对象 ((PreparedStatement)request.getAttribute("pstmt")).close();//关闭操作对象 ((Connection)request.getAttribute("conn")).close();//关闭数据库连接 } catch (Exception e) { } %>
下面 需要注意个问题,就是<jsp:forward page="" />
跳转语句后面不能是<jsp:forward page="" flush="true"/>,这样会报
的异常,如果不写则默认为false.
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="java.sql.*"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'list.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <table border="1" width="80%"> <tr> <td> id </td> <td> 用户名 </td> <td> 密码 </td> <td> 操作|| <a href="insert.jsp">添加</a> </td> </tr> <jsp:include page="dataconn.jsp" flush="true" /> <!--这里是包含数据库连接的页面 --> <% Connection conn = ((Connection)request.getAttribute("conn")); // 数据库连接 PreparedStatement pstmt = null; // 数据库预处理操作 ResultSet rs = null; // 查询要处理结果集 boolean flag = false; // 保存标记 %> <% String id = null; //保存id String name = null; //保存用户名 String pass = null; //保存密码 try {//JDBC操作会抛出异常,使用try...catch处理 %> <% String sql = "SELECT id,username,password FROM user ";//此sql语句是从usre表中查出所有的记录,select后面的字段全部改为*也可以 pstmt = conn.prepareStatement(sql);//实例化数据库操作对象 rs = pstmt.executeQuery();//实行查询 while (rs.next()) { // 如果有数据,则可以执行 id = rs.getString(1); //将从数据库查询出来的记录集第1位赋给id name = rs.getString(2); //将从数据库查询出来的记录集第2位赋给name(用户名) pass = rs.getString(3); //将从数据库查询出来的记录集第3位赋给pass(密码) %> <tr> <td><%=id%></td> <!--显示id--> <td><%=name%></td> <!--显示用户名--> <td><%=pass%></td> <!--显示密码--> <td> <a href="update.jsp?id=<%=id%>">修改</a>|| <!--因为要根据id修改,修改时需要将id通过地址重写的方式传过去--> <a href="delete_do.jsp?id=<%=id%>">删除</a> <!--要根据id删除--> </td> </tr> <% }//注意:我们的<tr>元素是在while循环里面,所以才能将全部记录列出来 } catch (Exception e) { e.printStackTrace(); } finally {//不管怎么样都要关闭数据库连接 %> <jsp:include page="dataclose.jsp"/><!--这里是包含数据库包含的页面 --> <% } %> </table> </body> </html>
界面视图:
这个列表页面我们要进行操作有查询所有、删除、修改和添加操作。
代码注释很清楚了。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'insert.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <center> <h1>注册操作</h1> <hr> <form action="insert_do.jsp" method="post"> <table border="1"> <tr> <td colspan="2"> 用户注册 </td> </tr> <tr> <td>登陆名:</td> <td><input type="text" name="name"></td> </tr> <tr> <td>登陆密码:</td> <td><input type="password" name="password"></td> </tr> <tr> <td colspan="2"> <input type="submit" value="注册"> <input type="reset" value="重置"> </td> </tr> </table> </form> </center> </body> </html>
这个页面跟登陆页面类似,这里就不讲了
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="java.sql.*"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'inset_do.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <center> <h1> 注册操作 </h1> <hr> <jsp:include page="dataconn.jsp" flush="true" /> <!--这里是包含数据库连接的页面 --> <% Connection conn = ((Connection)request.getAttribute("conn")); // 数据库连接 PreparedStatement pstmt = null; // 数据库预处理操作 ResultSet rs = null; // 查询要处理结果集 boolean flag = false; // 保存标记 %> <% try { %> <% String sql = "INSERT INTO user(username,password) VALUES(?,?)";//插入语句 pstmt = conn.prepareStatement(sql);//实例化数据库操作对象 pstmt.setString(1, request.getParameter("name"));//设置用户名 pstmt.setString(2, request.getParameter("password"));//设置密码 if (pstmt.executeUpdate() > 0) { // 如果有数据,则可以执行 flag = true; // 表示注册成功 } %> <% } catch (Exception e) { e.printStackTrace(); } finally { %> <jsp:include page="dataclose.jsp"/><!--这里是包含数据库关闭的页面 --> <% } %> <% if (flag) { // 注册成功 %> <h2> 注册成功 </h2> <jsp:forward page="list.jsp" /><!--跳转到list.jsp --> <% } else { // 注册失败 %> <h2> 注册失败 </h2> <% } %> </center> </body> </html>
添加成功后还是跳回list.jsp页面,如果失败则显示添加失败。
接下来是修改,修改之前要先根据id将这条记录查询出来,给用户显示,
当点击“修改”的时候将id传过去,并且根据id将记录查询出来
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="java.sql.*"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'update.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <jsp:include page="dataconn.jsp" flush="true" /> <!--这里是包含数据库连接的页面 --> <% Connection conn =(Connection)request.getAttribute("conn"); // 数据库连接 PreparedStatement pstmt = null; // 数据库预处理操作 ResultSet rs = null; // 查询要处理结果集 boolean flag = false; // 保存标记 int userid=0; //保存id String name = null; //保存用户名 String pass = null; //保存密码 %> <% try {//JDBC操作会抛出异常,使用try...catch处理 %> <% String sql = "SELECT id,username,password FROM user WHERE id=? ";//此sql语句是根据id查询出一条记录 String id = request.getParameter("id").toString();//接收从上个表单传过来的id(从地址栏传来) pstmt = conn.prepareStatement(sql); pstmt.setString(1, id);//设置第一个“?”的内容,即id的内容 rs = pstmt.executeQuery();//执行查询 if (rs.next()) { userid = rs.getInt(1);//取出id name = rs.getString(2);//取出用户名 pass = rs.getString(3);//取出密码 } %> <% } catch (Exception e) { e.printStackTrace(); } finally { try { rs.close();//关闭查询对象 pstmt.close();//关闭操作对象 conn.close();//关闭数据库连接 } catch (Exception e) { } } %> <body> <center> <h1> 更新操作 </h1> <hr> <form action="update_do.jsp" method="post"> <table border="1"> <tr> <td colspan="2"> 更新资料 </td> </tr> <tr> <td> 登陆名: </td> <td> <input type="text" name="name" value="<%=name%>"> </td> </tr> <tr> <td> 登陆密码: </td> <td> <input type="text" name="password" value="<%=pass%>"> </td> <input type="hidden" name="id" id="id" value="<%=userid%>"><!--用隱藏域來儲存id --> </tr> <tr> <td colspan="2"> <input type="submit" value="修改"> <input type="reset" value="重置"> </td> </tr> </table> </form> </center> </body> </html>
接下来是删除,删除跟修改一样,只要把id传过去,再根据id删除整条记录。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="java.sql.*"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'update_do.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <center> <h1>更新操作</h1> <hr> <jsp:include page="dataconn.jsp" /> <!--这里是包含数据库连接的页面 --> <% Connection conn = ((Connection)request.getAttribute("conn")); // 数据库连接 PreparedStatement pstmt = null ; // 数据库预处理操作 ResultSet rs = null ; // 查询要处理结果集 boolean flag = false ; // 保存标记 %> <% try{ %> <% String sql = "UPDATE user SET username=?,password=? WHERE id=?" ;//此sql语句是 pstmt = conn.prepareStatement(sql) ; pstmt.setString(1,request.getParameter("name")) ;//设置用户名 pstmt.setString(2,request.getParameter("password")) ;//设置密码 pstmt.setString(3,request.getParameter("id")) ;//设置id if(pstmt.executeUpdate()>0){ // 如果有数据,则可以执行 flag = true ; // 表示更新成功 } %> <% }catch(Exception e) { e.printStackTrace() ; } finally{ %> <jsp:include page="dataclose.jsp"/><!--这里是包含数据库关闭的页面 --> <% } %> <% if(flag){ // 更新成功 %> <h2>更新成功</h2> <jsp:forward page="list.jsp" />//跳转到list.jsp <% } else { // 更新失败 %> <h2>更新失败</h2> <% } %> </center> <h2>返回首页<a href="list.jsp">点击这里</a></h2> </body> </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="java.sql.*"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'delete_do.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <center> <h1>删除操作</h1> <hr> <jsp:include page="dataconn.jsp" /> <!--这里是包含数据库连接的页面 --> <% Connection conn =(Connection)request.getAttribute("conn"); // 数据库连接 PreparedStatement pstmt = null ; // 数据库预处理操作 ResultSet rs = null ; // 查询要处理结果集 boolean flag = false ; // 保存标记 %> <% try{ %> <% String sql = "DELETE FROM user WHERE id=?" ; pstmt = conn.prepareStatement(sql) ; String id=request.getParameter("id").toString(); pstmt.setString(1,id); if(pstmt.executeUpdate()>0){ // 如果有数据,则可以执行 flag = true ; // 表示更新成功 } %> <% }catch(Exception e) { e.printStackTrace() ; } finally{ %> <jsp:include page="dataclose.jsp"/><!--这里是包含数据库关闭的页面 --> <% } %> <% if(flag){ // 删除成功 %> <jsp:forward page="list.jsp"/> <% } else { // 删除失败 %> <h2>删除失败</h2> <% } %> </center> </body> </html>
好,一个简单的登陆、删除、修改、添加的jdbc例子就完成。
总结一下:大家发现没有,有一大长串数据库连接的代码是重复的,也就是每次执行操作都需要进行数据库
的连接,不管是删除还是添加都一样,jdbc执行的流程就是这样,我们根据业务的不同而写不同的sql语句,
掌握以下几个基本的sql语句是非常重要的 :
添加:inser [into] 表名(列名,列名,...) values(值,值....)
删除:delete 表名 [where 列名=值]
修改:update 表名 set 列名=值,列名=值.... [where 列名=值]
查询:select 列名,列名 from 表名 [where 列名=值]
呵呵,第一次写的博客,代码有点多,如果有写不正确的地方,欢迎纠正。另外附有代码。