Spring事务机制以及异常的处理(正确版)

xiaoxiao2021-02-28  65

如图 想添加一位学生 前台规划如图所示所需学生姓名,学号,学院,班级,年级,性别,公寓以及宿舍名

学生表构造如下

外键对应班级id,宿舍id,宿舍表中管理公寓id,学院id

前台点击按钮事件绑定方法

$(document).ready(function() { //增加学生提交 $("#addStudSub").click(function self() { // 禁用按钮 $("#addStudSub").addClass('disabled'); // 学院 var coll = $("#seleColl").val(); // 班级 var clas = $("#seleClas").val(); // 年级 var grad = $("#seleGrade").val(); // 性别 var sex = $("#seleSex").val(); // 公寓 var apar = $("#seleApar").val(); // 宿舍 var dorm = $("#seleDorm").val(); // 验证是否都被选择 if (coll != '' && clas != '' && grad != '' && sex != '' && apar != '' && dorm != '') { $.ajax({ url : "/gradPro/stud/addStud.action", data : { "studName":$("#studentName").val(), "studNo":$("#studentNo").val(), "collName":coll, "clasName":clas, "grade":grad, "sex":sex, "aparName":apar, "dormName":dorm}, success : function(data) { //添加学生成功 if ("1" == data.status) { // 成功后延时两秒跳转并提示信息 countDown(2, data.message); } else if ("0" == data.status) { // 提示错误信息 $("#alterTip").text(data.message); $("#alterTips").modal('show'); } } }) }// 如果存在未被选择 else { // 提示并禁用按钮 $("#subTips").hide().html("<label class='label label-danger'>请全部勾选选项</label>").show(500); //刷新页面 setTimeout("location.reload()", 2000); } }) } );

对应后台Controller层方法如下:(这不是重点,请看到Service层返回再看)

/** * 新增学生 * @param studName * @param studNo * @param collName * @param clasName * @param grade * @param sex * @param aparName * @param dormName * @return */ @SuppressWarnings("finally") @RequestMapping("addStud.action") @ResponseBody public DataSet addStud(@RequestParam("studName") String studName, @RequestParam("studNo") String studNo, @RequestParam("collName") String collName, @RequestParam("clasName") String clasName, @RequestParam("grade") String grade, @RequestParam("sex") String sex, @RequestParam("aparName") String aparName, @RequestParam("dormName") String dormName) { DataSet data = new DataSet(); try{ //尝试添加学生 studentService.addStud(studName,studNo,collName,clasName,grade,sex,aparName,dormName); data.setStatus("1"); data.setMessage("添加学生成功"); }//如果捕获到宿舍已经住满 catch(DormHasAlaredyFullException e){ data.setStatus(e.getErrorCode()); data.setMessage(e.getErrorMSG()); }finally{ return data; } }

Service层的方法:如下图所示,先声明了一个事务@Transactional 配置代表这是一个Spring事务

如果查出宿舍总床位和入住人数已经相等,代表宿舍已住满,则这时抛出一个自定义宿舍已住满异常,事务结束。

否则继续下面逻辑,之前博客中也是应该如此处理。在返回controller层中捕获此异常,跟ajax请求做交互处理提示给用户。

@Transactional @Override public int addStud(String studName, String studNo, String collName, String clasName, String grade, String sex, String aparName, String dormName) { //学生信息添加成功flag默认未成功 int flag = 0; // 拿到学院Id String colleaId = colleageDao.getCollIdByName(collName); // 拿到班级Id String clasId = classesDao.getClassIdByClassName(clasName); // 拿到dormId String dormId = dormitoryDao.getDormIdByDormName(dormName); // 先在宿舍中更新信息 // 查询除宿舍总人数和已住人数 DormitoryPageDto tempDto = dormitoryDao.selectTotalBedAndHave(dormId); // 如果公寓已经住满了 if (tempDto.getHaveEver() == tempDto.getTotalBed()) { // 抛出公寓已经住满了异常 DormHasAlaredyFullException de = new DormHasAlaredyFullException("0", "宿舍"+dormName+"已经住满了"); throw de; } // 如果宿舍未住满 else { // 如果宿舍只剩一张床铺 if ((tempDto.getHaveEver() + 1) == tempDto.getTotalBed()) { // 住进学生后修改宿舍状态 Dormitory dormitory = new Dormitory(); dormitory.setDormitoryId(Integer.parseInt(dormId)); dormitory.setStatus("1"); dormitoryDao.alterStatus(dormitory); } // 添加学生信息 Student student = new Student(); student.setStudentName(studName); student.setStudentNo(studNo); student.setColleageId(Integer.parseInt(colleaId)); student.setClassId(Integer.parseInt(clasId)); student.setGrade(grade); student.setSex(sex); student.setDormitoryId(Integer.parseInt(dormId)); student.setStatus("1"); flag = studentDao.addStud(student); } return flag; }

自定义异常类很简单:

/** * 添加学生时宿舍已住满异常 * @author BreakingBad_ * */ public class DormHasAlaredyFullException extends RuntimeException { private static final long serialVersionUID = 1L; private String errorCode; private String errorMSG; public DormHasAlaredyFullException(String errorMSG) { super(errorMSG); } public DormHasAlaredyFullException(String code, String message) { this.setErrorCode(code); this.setErrorMSG(message); } public String getErrorCode() { return errorCode; } public void setErrorCode(String errorCode) { this.errorCode = errorCode; } public String getErrorMSG() { return errorMSG; } public void setErrorMSG(String errorMSG) { this.errorMSG = errorMSG; }

测试:

表中宿舍名为702-4的总床位为6,对应的学生外键指向该宿舍的人数也为6

此时尝试向该宿舍添加学生:

成功。

转载请注明原文地址: https://www.6miu.com/read-2620390.html

最新回复(0)