文章目录
2.5 学生信息删除
2.5.1 产品经理阶段
操作要求 :
点击页面的删除按钮,弹出删除提示框,确定后删除学生信息和学生的考试成绩;
2.5.2 项目经理阶段
业务分析 :
删除学生信息的时候还要删除考试成绩
所以删除的时候应该是先获取学生信息,然后根据学生ID删除考试成绩 考试成绩删除后再删除学生信息即可
2.5.3 程序员阶段
具体实现:
完成模型层的封装,注意项目经理的话
2.5.4 实现过程
2.5.3.1 DAO层方法
/**
* 删除学生方法
* @param student
* @return
* @throws Exception
*/
public int deleteStudent(Student student)throws Exception;
/**
* 更新学生方法
* @param sid
* @return
* @throws Exception
*/
public Student findStudentByID(Integer sid)throws Exception;
2.5.3.2 DAO层实现
@Override
public int deleteStudent(Student student) throws Exception {
// 创建方法的返回值
int count = 0;
// 获取数据源
DataSource dataSource = qr.getDataSource();
// 获取连接
Connection conn = dataSource.getConnection();
// 设置手动提交事务
conn.setAutoCommit(false);
try {
// 成绩
String sql = "delete from result where s_id = ?";
count = qr.update(conn,sql, student.getSid());
// 学生
sql = "delete from student where s_id = ?";
count = qr.update(conn,sql, student.getSid());
// 提交
conn.commit();
} catch (Exception e) {
conn.rollback();
e.printStackTrace();
}finally{
// 释放资源
conn.close();
}
// 返回
return count;
}
@Override
public Student findStudentByID(Integer sid) throws Exception {
// 创建方法的返回值
Student stu = null;
// 编写SQL语句
String sql = "select * from stu_v1 where sid = ?";
// 占位符赋值
Object[] params = {sid};
// 执行
stu = qr.query(sql, new BeanHandler<Student>(Student.class),params);
// 返回
return stu;
}
2.5.3.3 Service层接口
/**
* 删除学生方法
* @param student
* @return
* @throws Exception
*/
public int deleteStudent(Student student)throws Exception;
/**
* 更新学生方法
* @param sid
* @return
* @throws Exception
*/
public Student findStudentByID(Integer sid)throws Exception;
2.5.3.4 Service层实现类
@Override
public int deleteStudent(Student student) throws Exception {
return studentDAO.deleteStudent(student);
}
@Override
public Student findStudentByID(Integer sid) throws Exception {
return studentDAO.findStudentByID(sid);
}
到此Model层编写完毕开始进行页面编写
2.5.3.5 页面JS
// 删除
function goDelete(id){
var con = window.confirm("确定删除此条数据么?");
if(con){
window.location.href = "${pageContext.request.contextPath}/deleteStudentByID?id="+id;
}
}
2.5.3.6 后端控制器
@RequestMapping("/deleteStudentByID")
public ModelAndView deleteStudentByID(Integer id)throws Exception{
// 创建方法的返回值
ModelAndView mv = new ModelAndView();
// 获取要删除的数据
Student stu = studentService.findStudentByID(id);
// 判断
if(null != stu){
int count = studentService.deleteStudent(stu);
if(count >0){
// 重定向到查询页面
mv.setViewName("redirect:/findStudentsByPage");
}else{
mv.addObject("errmsg", "很遗憾删除失败");
// 转发到报错页面
mv.setViewName("forward:/error.jsp");
}
}else{
mv.addObject("errmsg", "没有找到要删除的学生");
// 转发到报错页面
mv.setViewName("forward:/error.jsp");
}
// 返回
return mv;
}
2.5.5 效果展示
到此 删除效果编写完毕
2.6 学生信息更新
2.6.1 产品经理阶段
需求说明 :
点击更新按钮,跳转到更新信息展示页,然后进行更新
要求所有数据都能正常显示
2.6.2 项目经理阶段
业务分析:
正常更新业务比较简单,但是有一处难点是如果反显区域和学校,这是非常难的
所以实现思路应该是这样的
1. 获取学生信息 (包括区域ID和学校ID)
2. 查询所有区域信息,学生所属区域的全部学校信息然后和学生信息一起封装到页面作为数据展示
2.6.3 程序员阶段
功能实现 :
根据页面JS完成后端控制器的封装
// 准备更新
function goUpdate(id){
window.location.href = "${pageContext.request.contextPath}/findStudentByID?id="+id;
}
2.6.3.1 后端控制器
@RequestMapping("/findStudentByID")
public ModelAndView findStudentByID(Integer id)throws Exception{
// 创建方法发返回值
ModelAndView mv = new ModelAndView();
// 获取数据
Student student = studentService.findStudentByID(id);
// 判断
if(null != student){
// 获取区域信息
List<Area> areas = studentService.findAllAreas();
// 获取该学生所在区域的学校信息
List<School> schools = studentService.findSchoolsByAreaID(student.getAid());
// 保存数据
mv.addObject("s", student);
mv.addObject("areas", areas);
mv.addObject("schools", schools);
// 转发到更新页面
mv.setViewName("forward:/student_update.jsp");
}else{
mv.addObject("errmsg", "很抱歉没有找到要更新的数据");
mv.setViewName("forward:/error.jsp");
}
// 返回
return mv;
}
2.6.3.2 更新页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>学生信息管理与分析系统</title>
<!-- 引入CSS -->
<link rel="stylesheet" href="css/bootstrap.min.css">
<!-- 引入JS -->
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.9.1.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
<script type="text/javascript">
function loadSchools(){
// 获取每次更改的考区id
var areaSelect = $("#areaSelect");
// alert(areaSelect.val());
// 发起post提交方式 request请求
$.post("${pageContext.request.contextPath}/findSchoolsByAid",{aid:areaSelect.val()},function(data){
// 回调函数
var scSelect = $("#scSelect");// 获取学校的下拉菜单
// 填充内容
var op = "<option value=''>---请选择---</option>";
for (var i = 0; i < data.length; i++) {
op += "<option value='"+data[i].scid+"'>"+data[i].scname+"</option>";
}
scSelect.html(op);
});
}
</script>
</head>
<body>
<div>
<div class="page-header">
<h1>修改考生信息</h1>
</div>
<form action="${pageContext.request.contextPath}/updateStudent" method="post">
<input type="hidden" name="sid" value="${s.sid}" />
<table class="table table-hover">
<tr>
<th style="text-align: right;">考生姓名 :</th>
<td>
<input type="text" value="${s.sname}" name="sname" class="form-control" required="required" placeholder="请输入考生姓名...." />
</td>
<th style="text-align: right;">考生性别 :</th>
<td>
<select name="sex" required="required" class="form-control">
<option value="">---请选择---</option>
<option value="1" <c:if test="${s.sex == 1}">selected</c:if>>男</option>
<option value="0" <c:if test="${s.sex == 0}">selected</c:if>>女</option>
</select>
</td>
<th style="text-align: right;">出生日期 :</th>
<td>
<input type="date" value="${s.birthday}" name="birthday" class="form-control" required="required" />
</td>
</tr>
<tr>
<th style="text-align: right;">准考证号 :</th>
<td>
<input type="text" value="${s.examnum}" name="examnum" class="form-control" required="required" placeholder="请输入准考证号...." />
</td>
<th style="text-align: right;">考生考区 :</th>
<td>
<div class="form-inline">
<select class="form-control" id="areaSelect" required="required" onchange="loadSchools();">
<option value="">---请选择---</option>
<c:forEach var="a" items="${areas}">
<option value="${a.aid}" <c:if test="${s.aid == a.aid}">selected</c:if>>${a.aname}</option>
</c:forEach>
</select>
<select class="form-control" id="scSelect" name="scid" required="required">
<option value="">---请选择---</option>
<c:forEach var="sc" items="${schools}">
<option value="${sc.scid}" <c:if test="${s.scid == sc.scid}">selected</c:if>>${sc.scname}</option>
</c:forEach>
</select>
</div>
</td>
<th style="text-align: right;">语文成绩 :</th>
<td>
<input type="text" value="${s.scores['语文']}" name="scores['语文']" class="form-control" required="required" placeholder="请输入语文成绩...." />
</td>
</tr>
<tr>
<th style="text-align: right;">数学成绩 :</th>
<td>
<input type="text" value="${s.scores['数学']}" name="scores['数学']" class="form-control" required="required" placeholder="请输入数学成绩...." />
</td>
<th style="text-align: right;">英语成绩 :</th>
<td>
<input type="text" value="${s.scores['英语']}" name="scores['英语']" class="form-control" required="required" placeholder="请输入英语成绩...." />
</td>
<th style="text-align: right;">综合成绩 :</th>
<td>
<input type="text" value="${s.scores['综合']}" name="scores['综合']" class="form-control" required="required" placeholder="请输入综合成绩...." />
</td>
</tr>
<tr>
<th colspan="6" style="text-align: center;">
<button type="submit" class="btn btn-success">
<span class="glyphicon glyphicon-ok"></span> 确定
</button>
<button type="reset" class="btn btn-danger" onclick="javascript:history.go(-1);">
<span class="glyphicon glyphicon-remove"></span> 取消
</button>
</th>
</tr>
</table>
</form>
</div>
</body>
</html>
分析一下这个BUG,它应该出现在哪?没有值,有可能是查询学生的时候没有封装成绩数据,赶紧看下DAO层
果然没有封装,赶紧改了
@Override
public Student findStudentByID(Integer sid) throws Exception {
// 创建方法的返回值
Student stu = null;
// 编写SQL语句
String sql = "select * from stu_v1 where sid = ?";
// 占位符赋值
Object[] params = { sid };
// 执行
stu = qr.query(sql, new BeanHandler<Student>(Student.class), params);
// 创建SQL语句
sql = "select suname,score from stu_v2 where sid = " + stu.getSid();
// 执行
List<StudentScore> scores = qr.query(sql, new BeanListHandler<StudentScore>(StudentScore.class));
// 解析
for (StudentScore ss : scores) {
// 保存学生成绩
stu.getScores().put(ss.getSuname(), ss.getScore());
}
// 返回
return stu;
}
重启,再看看
解决!
展示出来了,继续做更新
根据页面提交的数据,和添加时候一样需要更新学生表数据和成绩表数据
2.6.3.3 DAO层接口
/**
* 更新学生信息
* @param student
* @return
* @throws Exception
*/
public int updateStudent(Student student)throws Exception;
2.6.3.4 DAO层实现类
@Override
public int updateStudent(Student student) throws Exception {
// 创建方法的返回值
int count = 0;
// 获取数据源
DataSource dataSource = qr.getDataSource();
// 获取数据库连接
Connection conn = dataSource.getConnection();
// 设置手动提交
conn.setAutoCommit(false);
try {
// 编写SQL语句
String sql = "update student set s_name=?,s_sex=?,s_birthday=?,s_examnum=?,sc_id=? where s_id=?";
// 占位符赋值
Object[] params = { student.getSname(), student.getSex(), student.getBirthday(), student.getExamnum(),
student.getScid(), student.getSid() };
// 执行SQL语句
count = qr.update(conn,sql, params);
// 更新成绩
sql = "update result set r_score = ? where s_id = ? and su_id = ?";
// 占位符赋值
Object[] p1 = { student.getScores().get("语文"), student.getSid(), 1 };
// 执行
count = qr.update(conn,sql, p1);
// 占位符赋值
Object[] p2 = { student.getScores().get("数学"), student.getSid(), 2 };
// 执行
count = qr.update(conn,sql, p2);
// 更新
Object[] p3 = { student.getScores().get("英语"), student.getSid(), 3 };
// 执行
count = qr.update(conn,sql, p3);
Object[] p4 = { student.getScores().get("综合"), student.getSid(), 4 };
// 执行
count = qr.update(conn,sql, p4);
// 提交
conn.commit();
} catch (Exception e) {
// 回滚
conn.rollback();
e.printStackTrace();
}finally{
conn.close();
}
// 返回
return count;
}
2.6.3.4 Service接口
/**
* 更新学生信息
* @param student
* @return
* @throws Exception
*/
public int updateStudent(Student student) throws Exception;
2.6.3.5 Service实现类
@Override
public int updateStudent(Student student) throws Exception {
return studentDAO.updateStudent(student);
}
至此,完成Model层的封装
根据页面提交请求完成更新后台控制器
2.6.3.6 后端控制器
@RequestMapping("/updateStudent")
public ModelAndView updateStudent(Student student) throws Exception {
// 创建方法的返回值
ModelAndView mv = new ModelAndView();
// 执行
int count = studentService.updateStudent(student);
// 判断
if (count > 0) {
// 重定向到查询页面
mv.setViewName("redirect:/findStudentsByPage");
} else {
mv.addObject("errmsg", "很遗憾更新失败");
// 转发到报错页面
mv.setViewName("forward:/error.jsp");
}
// 返回
return mv;
}
测试
至此 添加效果完成
到此为止,学生数据的操作部分结束!