代码编织梦想

        周五!放假!
        干劲涌上来了!

        昨天的代码再重新贴一下:

        FyTestService.java:

package 不.要.在.意.fyTest.service;

import java.util.List;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


import 不.要.在.意.Page;
import 不.要.在.意.CrudService;
import 不.要.在.意.fyTest.dao.FyTestDao;
import 不.要.在.意.fyTest.entity.FyTestUser;
import 不.要.在.意.FunctionReturn;

@Service										//对于 service层的类,在类上用 @Service注解声明
@Transactional(readOnly =false)							//表示该类需要读写事务支持
//老规矩,不管crudService,写上只是防止以后会有其他相配合的功能要使用它
public class FyTestService extends CrudService<FyTestDao,FyTestUser> {

	//获取page(查)
	public Page<FyTestUser> getFyTestPage(Page<FyTestUser> page,FyTestUser fyTestUser){    
		fyTestUser.setPage(page);
		page.setList(dao.getFyTestUserList(fyTestUser));
		return page;
	}
	
	//fytest表单页面(增)
	public FunctionReturn saveFyTestUser(FyTestUser fyTestUser){
		FunctionReturn functionReturn = new FunctionReturn();
		
		//保存fytest表单信息
		dao.insertFyTestUser(fyTestUser);
		functionReturn.setReturnCode(0);
		functionReturn.setReturnMsg(fyTestUser.getName()+"["+fyTestUser.getTuid()+"]数据添加成功");
		
		return functionReturn;
	}
	
	
	//导出表单数据(查)
	public List<FyTestUser> getChannelMaintainUserExportList(FyTestUser fyTestUser){
		return dao.getFyTestUserList(fyTestUser);
	}
	
	
	//移除表单数据 (删)
	public FunctionReturn deleteFyTestUser(FyTestUser fyTestUser){
		FunctionReturn functionReturn = new FunctionReturn();
		dao.deleteFyTestUser(fyTestUser);
		functionReturn.setReturnCode(0);
		functionReturn.setReturnMsg("移除成功");
		return functionReturn;
	}
		
}

        我去除了昨天"(存在问题)"的那两个注释
        摆了,不纠结他们了,我现在就直接理解下这一整个类是干什么的就好了.
        现在我已经能在里面看到查,增,删的功能了,现在我要自己写一个改的功能
        接上文:

//改状态(改)
	public FunctionReturn updateFyTestUserForStatus(FyTestUser fyTestUser){
		FunctionReturn functionReturn=new FunctionReturn();
		dao.updateFyTestUserForStatus(fyTestUser);
		functionReturn.setReturnCode(0);
		functionReturn.setReturnMsg("状态更改成功");
		return functionReturn;
	}
	
	//改状态(改)
	public FunctionReturn updateFyTestUserForAll(FyTestUser fyTestUser){
		FunctionReturn functionReturn=new FunctionReturn();
		dao.updateFyTestUserForAll(fyTestUser);
		functionReturn.setReturnCode(0);
		functionReturn.setReturnMsg("整体更改成功");
		return functionReturn;
	}
}

        这两段写的相当快速,因为我没去细究各个地方的功能,对比一下就能发现,每块的写法大差不差,只需要改变一下"dao."那行对应的功能就好.

        在我研究web层时,我用大佬昨天教我的理解代码的方式,debug运行一个他们写好的例子,给想看的地方打上断点,然后在程序中挨个功能都试一下,哪个操作触发了断点,那么断点所在的这段代码就对应这段操作.
        用这个办法我很顺畅的理解了例子中的代码,并转化为我所用.
        在web层的编写时我意识到我需要写一个验证工号是否有重复的功能,因为在设置数据表时我将工号设置为了主键.所以我又回去给dao层,service层都补上了这个功能
        PS:这种之前我已经发过整篇代码的文件,要再进行新增时,我只发出新增的代码,在任务完成后我会再重新发一下所有的代码.

        加入FyTestDao.java:

List<FyTestUser> getFyTestUserListForCheckTuid(FyTestUser fyTestUser);	//在新增数据的前一刻使用,检查新建的数据的工号是否跟旧数据有重复

        加入FyTestDao.xml:

<!-- 在新增数据的前一刻使用,检查新建的数据的工号是否跟旧数据有重复 -->
	<select id="getFyTestUserListForCheckTuid" resultType="FyTestUser">
		select
			t.tuid					as"tuid"	
			,t.name					as"name"
			,t.sex					as"sex"
			,t.dep					as"departments"
			,t.status				as"status"
			,t.tel					as"telephone"
			,t.create_time			as"createTime"
			,t.amend_time			as"amendTime"
		from fy_test t
		where upper(t.tuid) = upper('#{tuid}')		<!-- upper 所有小写字母转换为大写字母的大小写转换函数 -->
		order by t.amend_time desc
	</select>

        更新FyTestService.java:

//fytest表单页面(增)
	public FunctionReturn saveFyTestUser(FyTestUser fyTestUser){
		FunctionReturn functionReturn = new FunctionReturn();		
		//1.设置数据表时将工号设计为了主键(不允许有重复数据),所以要将这种情况设置为"储存失败"
		List<FyTestUser> checkList=dao.getFyTestUserListForCheckTuid(fyTestUser);
		if(checkList.size()>0){							//checkList.size返回的数据是数据条数,当数据大于0时代表Dao层在数据库里查到了相同工号的数据	
			functionReturn.setReturnCode(1);			//工号重复是不允许的,返回值"1",代表着错误
			functionReturn.setReturnMsg("添加失败:表单中已存在该工号,请确认");
			return functionReturn;						//因为if成真,工号确实有重复,所以不进行保存操作,直接在此处return,2操作也就不会进行了
		}
		//2.保存fytest表单信息
		dao.insertFyTestUser(fyTestUser);
		functionReturn.setReturnCode(0);
		functionReturn.setReturnMsg(fyTestUser.getName()+"["+fyTestUser.getTuid()+"]数据添加成功");
		
		return functionReturn;
	}

        回到FyTestController.java:

package 不.要.在.意.fyTest.web;

import java.util.List;

import javax.servlet.http.HttpServletRequest;		//HttpServletRequest接收来自客户端的请求
import javax.servlet.http.HttpServletResponse;		//HttpServletResponse发出对客户端的响应

import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;				//它允许控制器向视图传递数据
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;


import 不.要.在.意.Page;
import 不.要.在.意.DateUtils;
import 不.要.在.意.Exceptions;
import 不.要.在.意.ExportExcel;
import 不.要.在.意.BaseController;
import 不.要.在.意.fyTest.entity.FyTestUser;
import 不.要.在.意.fyTest.service.FyTestService;
import 不.要.在.意.FunctionReturn;


/**
 * FyTest
 * 
 */
@Controller
@RequestMapping(value="${adminPath}/fyTest")
public class FyTestController extends BaseController {

	@Autowired
	FyTestService fyTestService;
	
	//调出页面1,查询整个数据表,分页,每页30行数据,展示
	@RequiresPermissions("fyTest:fyTestUser:view")  //注解,验证当前登录用户是否有 "fyTest:fyTestUser:view"对应的权限 
	@RequestMapping(value={"/fyTestUsers/list"})	//一个用来处理请求地址映射的注解,运行这个功能时的url路径就会是".../fyTestUsers/list"(还未验证)
	public String fyTestUserList(FyTestUser fyTestUser,HttpServletRequest request,HttpServletResponse response,Model model){
		Page<FyTestUser> page = fyTestService.getFyTestPage(new Page<FyTestUser>(request,response),fyTestUser);//获取了表的数据
		model.addAttribute("page",page);			//将数据存储在 Model对象中,然后在视图层中使用该数据
		return"modules/fyTest/fyTest";				//疑问:返回了个字符串?干啥用的?
	}

	
	//调出页面2,填写"新增信息"的页面
	@RequiresPermissions("fyTest:fyTestUser:edit")
	@RequestMapping(value={"/fyTestUsers/form"})
	public String fyTestUsersForm(FyTestUser fyTestUser, HttpServletRequest request, HttpServletResponse response, Model model){
		return "modules/fyTest/fyTestForm";
	}
	
	
	//功能,新增信息
	@RequiresPermissions("fyTest:fyTestUser:edit")
	@RequestMapping(value={"/fyTestUsers/save"})
	public String fyTestUsersSave(FyTestUser fyTestUser, Model model,RedirectAttributes redirectAttributes){		
		try{
			FunctionReturn fr = fyTestService.saveFyTestUser(fyTestUser);		//1查重2插入新数据
			addMessage(redirectAttributes,fr.getReturnMsg());					//打印在Service层获取到的消息
		}catch(Exception ex){
			addMessage(redirectAttributes, fyTestUser.getName()+"["+fyTestUser.getTuid()+"]添加新数据失败");
			logger.debug(Exceptions.getStackTraceAsString(ex));
			ex.printStackTrace();
		}
		return"redirect:"+adminPath+"fyTest/fyTestUsers/list";
	}
	
	
	//导出表单数据
	@RequiresPermissions("fyTest:fyTestUser:view")
	@RequestMapping(value = "/fyTestUsers/export",method=RequestMethod.POST)
	public String exportfile(FyTestUser fyTestUser,HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes){
		try{
			String fileName="FyTest"+DateUtils.getDate("yyyyMMDDHHmmss")+".xlsx";
			List<FyTestUser>exportList= fyTestService.getFyTestUserExportList(fyTestUser);
			new ExportExcel("fyTest", FyTestUser.class).setDataList(exportList).write(response, fileName).dispose();			return null;
		}catch (Exception e){
			addMessage(redirectAttributes,"导出信息失败!失败信息:"+e.getMessage());
		}
		return "redirect:"+adminPath+"/fyTest/fyTestUsers/list";
	}
	
	
	//删除数据
	@RequiresPermissions("fyTest:fyTestUser:edit")
	@RequestMapping(value = "/fyTestUsers/updateStatus")
	public String fyTestUserUpdateStatus(FyTestUser fyTestUser, HttpServletRequest request, Model model, RedirectAttributes redirectAttributes){
		try{
			FunctionReturn fr = fyTestService.updateFyTestUserForStatus(fyTestUser);
			addMessage(redirectAttributes,fr.getReturnMsg());
		}catch(Exception ex){
			addMessage(redirectAttributes,"状态更新失败");
			logger.debug(Exceptions.getStackTraceAsString(ex));
			ex.printStackTrace();
		}
		return "redirect:"+adminPath+"/fyTest/fyTestUsers/list";
		
	}

	
	//删除数据
	@RequiresPermissions("fyTest:fyTestUser:edit")
	@RequestMapping(value = "/fyTestUsers/updateAll")
	public String fyTestUserUpdateAll(FyTestUser fyTestUser, HttpServletRequest request, Model model, RedirectAttributes redirectAttributes){
		try{
			FunctionReturn fr = fyTestService.updateFyTestUserForStatus(fyTestUser);
			addMessage(redirectAttributes,fr.getReturnMsg());
		}catch(Exception ex){
			addMessage(redirectAttributes,"更新失败");
			logger.debug(Exceptions.getStackTraceAsString(ex));
			ex.printStackTrace();
		}
		return "redirect:"+adminPath+"/fyTest/fyTestUsers/list";
		
	}
	
	
	//删除数据
		@RequiresPermissions("fyTest:fyTestUser:edit")
		@RequestMapping(value = "/fyTestUsers/delete")
		public String fyTestUserRemove(FyTestUser fyTestUser, HttpServletRequest request, Model model, RedirectAttributes redirectAttributes){
			try{
				FunctionReturn fr = fyTestService.deleteFyTestUser(fyTestUser);
				addMessage(redirectAttributes,fr.getReturnMsg());
			}catch(Exception ex){
				addMessage(redirectAttributes,"删除失败");
				logger.debug(Exceptions.getStackTraceAsString(ex));
				ex.printStackTrace();
			}
			return "redirect:"+adminPath+"/fyTest/fyTestUsers/list";
			
		}
}

        1.try catch用法:
        版权声明:本文为CSDN博主「呀吖呀吖呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
        原文链接:https://blog.csdn.net/yayayalaila/article/details/122723894
        理论上,我们这里的try catch是捕获不到异常的,但是考虑到实际在程序运行中可能会发生意想不到的异常情况,所以我们都用上了.

        但是真正的重点(以"功能"为例),重点就在
"FunctionReturn fr= fyTestService.saveFyTestUser(fyTestUser);"这一句上,而这一句包含的内容,就是我们从Dao,Service层一点点完善下来的.

        至此,我们已经写完所有后端的内容啦(大概),接下来就是写前端的jsp页面文件,前端应该不会很麻烦,这个推进速度还是很不错的,周末就不用担心了.
        下班.

        整理与思考:

        在FyTestController.java那里有一个“疑问”,我感觉是跟前端有关的,所以我打算先搁置,等下周写前端时看看能不能联系起来。

——20230317

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45899178/article/details/129630092

spring 事务传播机制总结-爱代码爱编程

目录 为什么会有传播机制 传播机制生效条件 传播机制类型 示例代码 PROPAGATION_REQUIRED / REQUIRED (默认) REQUIRES_NEW NESTED SUPPORTS NOT_SUPPORTED MANDATORY NEVER 一点小说明 小总结 四种隔离级别 事务的并发问题 为什么会有传播机

Spring事务和MySQL事务详解面试-爱代码爱编程

文章目录 数据库事务事务是什么事务的四大特性MySQL事务隔离级别查看MySQL当前事务隔离级别MySQL默认操作模式为自动提交模式JDBC处理事务Spring事务Spring的事务传播PROPAGATION_REQUIREDPROPAGATION_SUPPORTSPROPAGATION_MANDATORYPROPAGATION_REQUIRES_

Spring事务传播机制-爱代码爱编程

目录 一、事务在Spring中是如何运作的 1.1 开启事务(DataSourceTransactionManager.doBegin) 二、Spring的事务传播机制 2.1 子事务的传播机制为REQUIRED 2.2 子事务的传播机制为REQUIRES_NEW 2.3 子事务的传播机制为NESTED 当我们在使用Spring所提供的事务功

Spring事务的实现原理-爱代码爱编程

目录 一、Spring事务分类二、Spring事务的三大接口2.1 PlatformTransationManager接口2.2 TransactionDefinition接口2.3 TransactionStatus接口三、Spring事务嵌套最佳实践3.1 最佳实践场景一:3.2 最佳实践场景二:3.3 最佳实践场景三:3.4 最佳实践场景四:

Spring事务源码详解-爱代码爱编程

一. 简介 事务: 事务是逻辑上的一组操作,要么都执行,要么都不执行,关于事务的基本知识可以看我的这篇文章:事务的基础知识 Spring事务: Spring 支持两种方式的事务管理:编程式事务管理、声明式事务管理 编程式事务管理:通过 TransactionTemplate或者TransactionManager手动管理事务,使用较少,但是可以让

spring事务的传播机制_qq_32424581的博客-爱代码爱编程

什么是spring事务的传播机制? Spring 事务传播机制是指,包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。 既然是“事务传播”,所以事务的数量应该在两个或两个以上,Spring 事务传播机制的诞生是

创建spring项目和lombok框架-简单案例_枯草上的霜雪的博客-爱代码爱编程

创建Spring项目 1.创建Spring项目    2.总目录下创建src文件夹,main目录下创建resourses     3在main方法中SpringApplication.run(类名.class,args); @SpringBootApplication 注解  4.在demo包下创建controller

聊聊spring事务失效的12种场景,太坑了_throws exception spring 实物不生效_苏三说技术的博客-爱代码爱编程

前言 对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了。 在某些业务场景下,如果一个请求中,需要同时写入多张表的数据。为了保证操作的原子性(要么同时成功,要么同时失败),避免数据不一致的情况,我

spring系列九:spring 事务_spring事物-爱代码爱编程

 该文章收录专栏: 叶秋学长Spring系列专栏 叶秋学长主页: 新星计划第三季人工智能赛道TOP2;退役复学在校大学生,全栈JAVA领域创作者,目光所至,皆为华夏 目录   什么是事务? 23.Spring 事务的种类? 24.Spring 的事务隔离级别? 25.Spring 的事务传播机制? 26.声明式事务实

mybatis框架源码笔记(八)之plugin插件原理解析_mybatis plugin-爱代码爱编程

1、插件概述 引用一段官网的译文 MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括: Executor (update, query,