JDBC使用Statement和PreparedStatement实现简单的增删改查

数据库student中有一个学生信息表student(没错数据库和表的名字一样),如下:

其中id是主码,设置成自动递增且不为null;name也设置成不为null。现欲通过JDBC的Statement和PreparedStatement,简单实现对该表的增删改查。


首先是主菜单页面(index.jsp):

<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="UTF-8"%>
<html>
<body>
<center>
<h2>请选择:</h2>
<table>
<tr>
<td><a href="a.jsp">增</a></td>
<td><a href="b.jsp">删</a></td>
<td><a href="c.jsp">改</a></td>
<td>查(<a href="f.jsp">列出表中所有信息</a>,<a href="d.jsp">按姓名查询</a>)</td>
</tr>
</table>
</center>
</body>
</html>

然后是四个分别实现了增删改查的用户界面:

增(a.jsp):

<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="UTF-8"%>
<html>
<body>
<%
	session.setAttribute("operation","add");
 %>
<center>
<h2>请输入要添加的信息</h2>
<form action="e.jsp" method="post">
<table>
<tr><td>姓名(必填):</td><td><input type="text" name="name"></td></tr>
<tr><td>年龄(选填):</td><td><input type="text" name="age"></td></tr>
<tr><td>性别(选填):</td><td><input type="text" name="sex"></td></tr>
<tr><td colspan="2" align="center"><input type="submit" value="添加"></td></tr>
</table>
</form>
<a href="index.jsp">主菜单</a>
</center>
</body>
</html>

删(b.jsp):

<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="UTF-8"%>
<html>
<body>
<%
	session.setAttribute("operation","delete");
 %>
<center>
<h2>请输入</h2>
<form action="e.jsp" method="post">
<table>
<tr><td>姓名:</td><td><input type="text" name="name"></td><td><input type="submit" value="删除"></td></tr>
</table>
</form>
<a href="index.jsp">主菜单</a>
</center>
</body>
</html>

改(c.jsp):

<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="UTF-8"%>
<html>
<body>
<%
	session.setAttribute("operation","update");
 %>
<center>
<h2>请输入要修改的信息</h2>
<form action="e.jsp" method="post">
<table>
<tr><td>要修改的姓名(必填):</td><td><input type="text" name="oldname"></td></tr>
<tr><td>修改后的姓名(选填):</td><td><input type="text" name="newname"></td></tr>
<tr><td>修改后的年龄(选填):</td><td><input type="text" name="age"></td></tr>
<tr><td>修改后的性别(选填):</td><td><input type="text" name="sex"></td></tr>
<tr><td colspan="2" align="center"><input type="submit" value="修改"></td></tr>
</table>
</form>
<a href="index.jsp">主菜单</a>
</center>
</body>
</html>

查(d.jsp):

<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="UTF-8"%>
<html>
<body>
<%
	session.setAttribute("operation","select");
 %>
<center>
<h2>请输入</h2>
<form action="e.jsp" method="post">
<table>
<tr><td>姓名:</td><td><input type="text" name="name"></td><td><input type="submit" value="查询"></td></tr>
</table>
</form>
<a href="index.jsp">主菜单</a>
</center>
</body>
</html>

然后是操作处理页(e.jsp):

<%@ page language="java" import="java.util.*,java.sql.*,java.io.*" pageEncoding="UTF-8"%>
<html>
<body>
<center>
<%
	Class.forName("com.mysql.jdbc.Driver");
	Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/student?user=root&password=1");
	String operation=(String)session.getAttribute("operation");
	String sql="";//简单初始化
	PreparedStatement ps=con.prepareStatement(sql);//简单初始化
	switch (operation) {
		case "add":
			sql="insert into student(name,age,sex) values(?,?,?)";
			ps=con.prepareStatement(sql);
			ps.setString(1,request.getParameter("name"));
			ps.setInt(2,Integer.parseInt(request.getParameter("age")));
			ps.setString(3,request.getParameter("sex"));
			ps.executeUpdate();
			response.sendRedirect("http://localhost:8080/jsp/success.jsp");
			break;
		case "delete":
			sql="delete from student where name=?";
			ps=con.prepareStatement(sql);
			ps.setString(1,request.getParameter("name"));
			ps.executeUpdate();
			response.sendRedirect("http://localhost:8080/jsp/success.jsp");
			break;
		case "update":
			boolean flag=false;//一旦修改完某个属性,就把flag置为true
			String oldname=request.getParameter("oldname");
			String newname=request.getParameter("newname");
			String age=request.getParameter("age");
			String sex=request.getParameter("sex");
			sql="update student set ";
			if(!newname.isEmpty()){
				sql=sql+"name='"+newname+"'";
				flag=true;
			}
			if(!age.isEmpty()){
				if(flag){//之前修改过某属性
					sql+=",";
				}
				sql=sql+"age="+age;
				flag=true;
			}
			if(!sex.isEmpty()){
				if(flag){//之前修改过某属性
					sql+=",";
				}
				sql=sql+"sex='"+sex+"'";
				flag=true;//可以省略,因为sex是最后一个属性
			}
			sql=sql+" where name='"+oldname+"'";
			Statement st=con.createStatement();
			st.executeUpdate(sql);
			st.close();
			response.sendRedirect("http://localhost:8080/jsp/success.jsp");
//			out.print(sql);
			break;
		case "select":
			sql="select id,name,age,sex from student where name=?";
			ps=con.prepareStatement(sql);
			ps.setString(1,request.getParameter("name"));
			ResultSet rs=ps.executeQuery();
			while(rs.next()){
				out.print("id:"+rs.getInt("id")+"   name:"+rs.getString("name")+"   age:"+rs.getString("age")+"   sex:"+rs.getString("sex"));
			}
			break;	
		}
	ps.close();
	con.close();
 %>
 </center>
</body>
</html>

因为我把查询分成了“列出表中所有信息”和“按姓名查询”这两种方式,所以我把前者的实现单独写在了一个页面(f.jsp),后者的实现仍然放在操作处理页e.jsp里面。

f.jsp:

<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="UTF-8"%>
<html>
<body>
<head><title>列出表中所有信息</title></head>
<center>
<h2>表中所有信息如下:</h2>
<table>
<th>id</th><th>name</th><th>age</th><th>sex</th>
<%
	Class.forName("com.mysql.jdbc.Driver");
	Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/student?user=root&password=1");
	Statement st=con.createStatement();
	ResultSet rs=st.executeQuery("select id,name,age,sex from student");
	while(rs.next()){
 %>
 		<tr>
 			<td><%=rs.getInt("id") %></td>
 			<td><%=rs.getString("name") %></td>
 			<td><%=rs.getInt("age") %></td>
 			<td><%=rs.getString("sex") %></td>
 		</tr>
 <%
 	}
 	rs.close();
 	st.close();
 	con.close();
  %>
</table>
<a href="index.jsp">主菜单</a>
</center>
</body>
</html>

最后是操作成功页面(success.jsp):

<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="UTF-8"%>
<html>
<body>
<center>
<h2>操作成功!</h2>
<a href="index.jsp">主菜单</a>
</center>
</body>
</html>


一点心得:PreparedStatement预编译貌似在一个jsp页只能执行一次。如果在同一jsp页上存在多条预编译语句,程序只会选择性的执行其中一条语句(一般是最后一条)。此时只能使用效率较低的Statement。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值