当前位置: 首页 > news >正文

网站建设前端切图贵阳市住房和城乡建设厅网站

网站建设前端切图,贵阳市住房和城乡建设厅网站,网站字体大小是多少,企业网站 源代码一、MySQL事务回顾 二、Spring事务管理 Spring框架的第一大核心#xff1a;IOC控制反转 在DeptServiceImpl下删除部门方法下新加一个删除员工信息的操作#xff0c;注意#xff1a;此时的id是部门id。 1、问题分析 2、Transactional-Spring事务管理 一般是在Service实现类的…一、MySQL事务回顾 二、Spring事务管理 Spring框架的第一大核心IOC控制反转 在DeptServiceImpl下删除部门方法下新加一个删除员工信息的操作注意此时的id是部门id。 1、问题分析 2、Transactional-Spring事务管理 一般是在Service实现类的方法上加Transactional注解 执行多次数据访问的增删改操作上需要用到事务 三、Spring事务进阶 1、rollbackFor Int i 1/0 是属于运行时异常 这是service层需要继续往上抛异常 默认情况下只有运行时异常才会进行事务回滚 2、propagation 因为我们需要解散部门时无论成功还是失败都要记录操作日志所以需要用到Transaction的REQUIRES_NEW的属性来新建一个事务 pojo/DeptLog package com.itheima.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.time.LocalDateTime;Data NoArgsConstructor AllArgsConstructor public class DeptLog {private Integer id;private LocalDateTime createTime;private String description; }DeptServiceImple package com.itheima.service.impl;import com.itheima.mapper.DeptLogMapper; import com.itheima.mapper.DeptMapper; import com.itheima.mapper.EmpMapper; import com.itheima.pojo.Dept; import com.itheima.pojo.DeptLog; import com.itheima.service.DeptLogService; import com.itheima.service.DeptService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import java.time.LocalDateTime; import java.util.List; import java.util.logging.LogManager;Service public class DeptServiceImpl implements DeptService {Autowiredprivate DeptMapper deptMapper;Autowiredprivate EmpMapper empMapper;// 删除部门id的同时需要删除与部门id关联的员工信息Autowiredprivate DeptLogService deptLogService;// 添加日志对象注入// Autowired // private DeptLogMapper deptLogMapper;/*1、查询操作* */// 实现方法public ListDept list(){ListDept deptList deptMapper.select();return deptList;}/*2、删除指定id* */Transactional(rollbackFor Exception.class) // 交给了Spring进行事务管理将所有异常进行事务处理Overridepublic void deleteById(Integer id) throws Exception{try {deptMapper.deleteById(id); // 删除部门idint i 1/0; // if (true){throw new Exception(出错了...);}empMapper.deleteById(id); // 删除员工信息} finally {// 记录日志描述DeptLog deptLog new DeptLog();deptLog.setCreateTime(LocalDateTime.now());deptLog.setDescription(执行了解散部门的操作此次解散的部门id是id);deptLogService.insert(deptLog);/***可以不用写DeptLogService和DeptServiceImpl直接写一个DeptLogMapper然后交给IOC控制器再在* 这个实现类中注入DeptLogMapper的对象直接调用insert方法在方法前加入* Transactional(propagation Propagation.REQUIRES_NEW)*/ // deptLogMapper.insert(deptLog);}}/*3、新增部门*/public void add(Dept dept){dept.setCreateTime(LocalDateTime.now());dept.setUpdateTime(LocalDateTime.now());deptMapper.insert(dept);}/*根据ID查询*/public Dept selectById(Integer id){Dept dept deptMapper.selectById(id);return dept;}Override/*更新部门名称*/public void update(Dept dept) {dept.setUpdateTime(LocalDateTime.now());dept.setCreateTime(LocalDateTime.now());deptMapper.update(dept);} }DpetLogService package com.itheima.service;import com.itheima.pojo.DeptLog;public interface DeptLogService {void insert(DeptLog deptLog); }DeptLogServiceImpl package com.itheima.service.impl;import com.itheima.mapper.DeptLogMapper; import com.itheima.pojo.DeptLog; import com.itheima.service.DeptLogService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional;Service public class DeptLogServiceImpl implements DeptLogService {Autowiredprivate DeptLogMapper deptLogMapper;// 开启一个新事务Transactional(propagation Propagation.REQUIRES_NEW)Overridepublic void insert(DeptLog deptLog) {deptLogMapper.insert(deptLog);} } DeptLogMapper package com.itheima.mapper;import com.itheima.pojo.DeptLog; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional;Mapper public interface DeptLogMapper {Insert(insert into dept_log(create_time, description) VALUES (#{createTime},#{description})) // Transactional(propagation Propagation.REQUIRES_NEW)public void insert(DeptLog deptLog); }四、AOP基础-Spring框架的第二大核心 AOP概述 AOP快速入门 package com.itheima.aop;import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component;Slf4j Component // 交给IOC容器 Aspect // 表示这个是AOP类 public class TimeAspect { // 当前共性功能应该加在哪些方法上Around(execution(* com.itheima.service.*.*(..))) //切入点表达式public void recordTime(ProceedingJoinPoint joinPoint) throws Throwable { // 1、获取方法运行开始时间long begin System.currentTimeMillis(); // 2、运行原始方法,o是原始方法的返回值Object o joinPoint.proceed(); // 3、获取方法结束运行结束时间long end System.currentTimeMillis(); // 计算方法耗时 // joinPoint.getSignature()原始方法的签名log.info(joinPoint.getSignature()方法耗时{}ms,end-begin);} }小结 五、AOP基础-核心概念 AOP核心概念 AOP执行流程 小结 连接点JoinPoint能够被AOP所控制的方法切入点PointCut实际被AOP控制的方法通过切入点表达式通知Advice将所有共性功能封装起来的方法切面Aspect描述通知与切入点之间的对应关系目标对象Target通知所对应的对象 六、AOP进阶 1、通知类型 切入点表达式抽取 小结 2、通知顺序 3、切入点表达式 execution MyAspect6.java package com.itheima.aop;import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component;Component Slf4j Aspect public class MyAspect6 { // Pointcut(execution(public void com.itheima.service.impl.DeptServiceImpl.delete(java.lang.Integer))) // Pointcut(execution(void com.itheima.service.DeptService.delete(java.lang.Integer)))//基于接口描述 // Pointcut(execution(void delete(java.lang.Integer)))包名.类名不建议省略匹配的范围过大影响匹配的效率 // Pointcut(execution(* com.itheima.service.DeptService.*(*)))//匹配返回值为任意DeptService接口下所有方法任意类型的一个参数 // Pointcut(execution(* com..DeptService.get(*)))//匹配返回值为任意com包下任意子包中DeptService接口/类下get方法为任意类型的一个参数Pointcut(execution(* com.itheima.service.DeptService.delete(java.lang.Integer)) ||execution(* com.itheima.service.DeptService.list()))//匹配前面一个或者后面任意一个public void pt(){}Before(pt())public void before(){System.out.println(before ...6);} }annotation MyLog package com.itheima.aop;import lombok.extern.slf4j.Slf4j;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Retention(RetentionPolicy.RUNTIME)//该注解表示注解的生命周期 Target(ElementType.METHOD)//表示该注解作用在哪一部分 public interface MyLog { }MyAspect7 package com.itheima.aop;import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component;Slf4j Component Aspect public class MyAspect7 {Pointcut(annotation(com.itheima.aop.MyLog))public void pc(){}Before(pc())public void func(){log.info(MyAspect7...);} }只需要在想要匹配的方法上加MyLog注解就可以调用通知方法 小结 4、连接点 MyAspect8 package com.itheima.aop;import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component;import java.util.Arrays;Component Slf4j Aspect public class MyAspect8 {Pointcut(execution(* com.itheima.service.DeptService.*(..)))public void pt(){}Before(pt())public void before(JoinPoint joinPoint){log.info(before....);}Around(pt())public Object around(ProceedingJoinPoint joinPoint) throws Throwable {log.info(MyAspect8 around before...);// 1、获取目标类名String className joinPoint.getTarget().getClass().getName();log.info(目标类名{},className);// 2、获取目标方法签名Signature signature joinPoint.getSignature();log.info(目标方法签名{},signature);// 3、获取目标方法名String signatureName joinPoint.getSignature().getName();log.info(目标方法名{},signatureName);// 4、获取目标方法运行参数Object[] args joinPoint.getArgs();String arg Arrays.toString(args);log.info(目标方法参数{},arg);// 5、执行原始方法获取返回值Object result joinPoint.proceed();log.info(目标方法的返回值{},result);log.info(MyAspect8 after ...);return result;}After(pt())public void after(){log.info(after...);} }测试类 package com.itheima;import com.itheima.service.DeptService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;SpringBootTest class SpringbootAopQuickstart1ApplicationTests {AutowiredDeptService deptService;Testpublic void test1(){deptService.delete(10);}Testpublic void test2(){deptService.list();} }执行delete之后 只有环绕通知才可以执行原始方法 前置通知在原始方法执行前运行后置通知在原始方法执行后运行 七、AOP案例 ​ 1、准备工作 !--AOP依赖-- dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactIdversion2.7.1/version /dependency-- AOP案例 -- 操作日志表 create table operate_log(id int unsigned primary key auto_increment comment ID,operate_user int unsigned comment 操作人ID,operate_time datetime comment 操作时间,class_name varchar(100) comment 操作的类名,method_name varchar(100) comment 操作的方法名,method_params varchar(1000) comment 方法参数,return_value varchar(2000) comment 返回值,cost_time bigint comment 方法执行耗时, 单位:ms ) comment 操作日志表;sql表格对应的实体类 package com.itheima.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.time.LocalDateTime;Data NoArgsConstructor AllArgsConstructor public class OperateLog {private Integer id; //IDprivate Integer operateUser; //操作人IDprivate LocalDateTime operateTime; //操作时间private String className; //操作类名private String methodName; //操作方法名private String methodParams; //操作方法参数private String returnValue; //操作方法返回值private Long costTime; //操作耗时 }2、编码 LogAspect.java package com.itheima.aop;import com.alibaba.fastjson.JSONObject; import com.itheima.mapper.OperateLogMapper; import com.itheima.pojo.OperateLog; import com.itheima.utils.JwtUtils; import io.jsonwebtoken.Claims; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest; import java.time.LocalDateTime; import java.util.Arrays;Component Slf4j Aspect //切面类 public class LogAspect {Autowired//用于获取jwt令牌private HttpServletRequest httpServletRequest;Autowiredprivate OperateLogMapper operateLogMapper;Around(annotation(com.itheima.anno.Log))//切点表达式public Object recordLog(ProceedingJoinPoint joinPoint) throws Throwable { // 1、获取操作人ID当前登录员工id这一步需要用到jwt令牌在Header中String jwt httpServletRequest.getHeader(token); // 解析jwt令牌Claims claims JwtUtils.parseJwt(jwt);Integer operateUser (Integer) claims.get(id);// 2、操作时间LocalDateTime operateTime LocalDateTime.now();// 3、操作类名String className joinPoint.getTarget().getClass().getName();// 4、操作方法名String methodName joinPoint.getSignature().getName();// 5、操作方法参数Object[] args joinPoint.getArgs();String methodParams Arrays.toString(args);// 获取方法开始时间long begin System.currentTimeMillis(); // 6、操作方法返回值转换为json格式的字符串保存起来Object result joinPoint.proceed();String returnValue JSONObject.toJSONString(result); // 获取结束时间long end System.currentTimeMillis();// 7、操作耗时long costTime end - begin;// 将日志内容插入到表中OperateLog operateLog new OperateLog(null,operateUser,operateTime,className,methodName,methodParams,returnValue,costTime);operateLogMapper.insert(operateLog);log.info(AOP操作日志{},operateLog);return result;//返回的是执行方法的返回值} }OperateLogMapper package com.itheima.mapper;import com.itheima.pojo.OperateLog; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper;Mapper public interface OperateLogMapper {Insert(insert into operate_log (operate_user, operate_time, class_name, method_name, method_params, return_value, cost_time) values (#{operateUser}, #{operateTime}, #{className}, #{methodName}, #{methodParams}, #{returnValue}, #{costTime});)public void insert(OperateLog operateLog);}注意
http://www.hkea.cn/news/14447590/

相关文章:

  • 动易网站栏目局网站建设意见
  • ps做网站要求官网网站建设研究
  • 网站后台密码忘了怎么办企业营销的意义
  • 运城购物网站开发设计做网站建设挣钱吗
  • 网站dns解析失败音乐播放网站开发pc端
  • 网站 后台 设计wordpress回复显示插件
  • 怀化物流网站建设报价wordpress评论选择头像
  • 沈阳大型网站设计公司WordPress纯代码添加雪花
  • 网站专业优化公司交易类网站建设费用
  • 长城建设投资有限公司网站建设摩托车官网中国官网报价大全
  • 网页设计网站开发需要什么软件广西桂林最新事件
  • 企业网站建设费用 珠海浙江网站建设品牌
  • 网站开发实战视频教程厚街做网站公司
  • 北京公司网站制作哪家专业安徽省建设安全质量协会网站
  • 株洲网站优化找哪家网络服务有点问题
  • 国外网站能否做百科参考资料网页网站作业制作
  • 狠狠做网站歌手投票网站怎么做
  • 新乡营销型网站建设长春seo经理
  • iis 新建网站 要登录网站设计存在的问题
  • 比格设计网站官网博客网站怎么搭建
  • 泰安北京网站建设公司哪家好saas系统多少钱
  • 网站建设服务协议 百度旅行社网页设计
  • 美食网站开发与设计任务书昆明做网站建设技巧公司
  • 东莞莞城网站建设公司南京seo优化推广
  • 视频网站如何赚钱江门公司网站建设
  • 网站站长要会什么用大连网站建设-中国互联
  • 开封网站建设网络开发工具有哪些
  • 帮人负责做网站叫什么工作深圳办公室设计
  • wordpress快速仿站开发龙岗网站建设
  • 网站开发时如何兼容俄语好网站设计