JDBC+JSP实例

第一次写的博客,就拿一个以前做的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文件夹下

 


JDBC+JSP实例_第1张图片

 

 首先是一个登陆界面

 

 

 

<%@ 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>

 

界面视图:

 
JDBC+JSP实例_第2张图片
 

 

 

 

 

 

<%@ 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"/>,这样会报

“Attempt to clear a buffer that's already been flushed
”(试图去清空缓存,但是缓存已经被刷新了)

的异常,如果不写则默认为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 列名=值]
呵呵,第一次写的博客,代码有点多,如果有写不正确的地方,欢迎纠正。另外附有代码

 

  

你可能感兴趣的:(jdbc)