首页 > 编程语言 >26届JAVA 学习日记——Day8

26届JAVA 学习日记——Day8

时间:2024-11-14 14:19:26浏览次数:3  
标签:flavors 26 dishDTO Day8 Spring 事务 dish JAVA public

2024.11.12 周二
距离上次打卡已经过去了三天,虽然有三天没有学习,但是旅游的过程还是很治愈的。今天开始继续打卡。

八股

SpringBoot里面有哪些重要的注解?有一个配置相关的注解是哪个?

  • @SpringBootApplicaiton:用于标注主应用程序类,标识一个Spring Boot应用程序的入口点,同时启用自动配置和组件扫描。
@SpringBootApplication
@EnableTransactionManagement //开启注解方式的事务管理
@Slf4j
public class SkyApplication {
    public static void main(String[] args) {
        SpringApplication.run(SkyApplication.class, args);
        log.info("server started");
    }
}
  • @Controller(通常@RestController):标识控制器类,处理HTTP请求。
  • @RestController:结合@Controller和@ResponseBody,返回RESTful风格的数据。
  • @Service:标识服务类,通常用于标记业务逻辑层。
  • @Repository(通常@Mapper):标识数据访问组件,通常用于标记数据访问层。
  • @Component:通用的Spring组件注解,表示一个受Spring管理的组件。
  • @Autowired:用于自动装配Spring Bean。
  • @Value:用于注入配置属性值。
@Component
public class ExampleBean {

    @Value("${example.property}")
    private String propertyValue;

    // ... 使用 propertyValue(example.property)
    
    @Value("${JAVA_HOME}")
    private String javaHome;

    // ... 使用 javaHome(环境变量)
}
  • @RequestMapping:用于映射HTTP请求路径到Controller的处理方法。

  • @GetMapping、@PostMapping、@PutMapping、@DeleteMapping:简化@RequestMapping的GET、POST、PUT和DELETE请求。

  • @Configuration:用于指定一个类为配置类,其中定义的bean会被Spring容器管理。通常与@Bean配合使用,@Bean用于声明一个Bean实例,由Spring容器进行管理。

//此处指定OssConfiguration为配置类,其中@Bean声明的AliOssUtil被Spring容器管理
@Configuration 
@Slf4j
public class OssConfiguration {

    @Bean
    @ConditionalOnMissingBean //条件注解-确保只有在Spring容器中不存在该类Bean时才会创建Bean
    public AliOssUtil ossUtil(AliOssProperties aliOssProperties){
        log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);
        return new AliOssUtil(aliOssProperties.getEndpoint(),
                aliOssProperties.getAccessKeyId(),
                aliOssProperties.getAccessKeySecret(),
                aliOssProperties.getBucketName());
    }
}

Spring管理事务的方法有哪些?

  • 编程式事务:在代码中硬编码(在分布式系统中推荐使用) : 通过 TransactionTemplate或者 TransactionManager 手动管理事务,事务范围过大会出现事务未提交导致超时,因此事务要比锁的粒度更小。
  • 声明式事务:在 XML 配置文件中配置或者直接基于注解(单体应用或者简单业务系统推荐使用) : 实际是通过 AOP 实现(基于@Transactional的全注解方式使用最多)
    @Override
    @Transactional 
    /**
    此处通过@Transactional全注解保证实现类中的该方法需作为事务整体执行
    否则将回滚,由此保证菜品表和对应口味表的一致性。
    */
    public void saveWithFlavor(DishDTO dishDTO) {

        // 将接收的的dishDTO对象拆分成两个bean对象
        Dish dish = new Dish();
        BeanUtils.copyProperties(dishDTO, dish);

        // 向菜品表插入1条数据
        dishMapper.insert(dish);

        // 获取insert语句生成的主键值
        Long dishId = dish.getId();

        List<DishFlavor> flavors = dishDTO.getFlavors();
        if (flavors != null && flavors.size() > 0){
            flavors.forEach(dishFlavor -> {
                dishFlavor.setDishId(dishId);
            });
            // 向口味表插入n条数据
            dishFlavorMapper.insertBatch(flavors);
        }
    }

Spring事务中有哪几种事务传播行为?

事务传播行为是为了解决业务层方法之间互相调用的事务问题。

  1. TransactionDefinition.PROPAGATION_REQUIRED
    使用的最多的一个事务传播行为,我们平时经常使用的@Transactional注解默认使用就是这个事务传播行为。如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  2. TransactionDefinition.PROPAGATION_REQUIRES_NEW
    创建一个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部方法是否开启事务,Propagation.REQUIRES_NEW修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。
  3. TransactionDefinition.PROPAGATION_NESTED
@Transactional(propagation = Propagation.NESTED)
public void doWork() {
    // 这里是嵌套事务的逻辑
}

如果doWork()方法在一个已经存在的事务中被调用,它将在当前事务中创建一个嵌套事务。如果 doWork() 方法抛出异常,可以选择回滚到嵌套事务的保存点,而不是回滚整个外部事务;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED(即新建一个事务)。

  1. TransactionDefinition.PROPAGATION_MANDATORY
    如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)这个使用的很少。

算法

199.二叉树的右视图(哈希表+栈)
15.三数之和

项目

苍穹外卖项目进度
苍穹外卖项目进度

该代码是如何处理flavors的?

    /**
     * 根据id修改菜品基本信息和对应的口味信息
     * @param dishDTO
     */
    @Override
    public void updateWithFlavor(DishDTO dishDTO) {
        Dish dish = new Dish();
        BeanUtils.copyProperties(dishDTO,dish);

        //修改菜品表基本信息
        dishMapper.update(dish);

        //删除原有的口味数据
        dishFlavorMapper.deleteByDishId(dishDTO.getId());

        //重新插入口味数据
        //获取List<DishFlavor>对象flavors
        List<DishFlavor> flavors = dishDTO.getFlavors();
        //如果flavors不为空,且其长度大于0
        if (flavors != null && flavors.size() > 0){
        	//对列表调用forEach方法,并在其中通过lambda表达式进行操作
        	/**
        		dishFlavor -> { dishFlavor.setDishId(dishDTO.getId()); }
        		是一个Lambda表达式,它代表了一个没有参数名称的函数
        		该函数接受一个DishFlavor类型的参数,并执行一个操作(设置dishId属性)。
			*/
            flavors.forEach(dishFlavor -> {
                dishFlavor.setDishId(dishDTO.getId());
            });
            //向口味表插入n条数据
            dishFlavorMapper.insertBatch(flavors);
        }
    }

useGeneratedKeys是什么?

    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
        insert into dish (name, category_id, price, image, description, create_time, update_time, create_user,update_user, status)
        values (#{name}, #{categoryId}, #{price}, #{image}, #{description}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser}, #{status})
    </insert>

useGeneratedKeys="true" 告诉 MyBatis 这个插入操作会生成一个键。
keyProperty="id" 指定了应该将生成的键赋值给 Dish 类的 id 属性。

id作为一个非空约束、自增约束的主键,在此处useGeneratedKeys="true" keyProperty="id" 告诉数据库在创建的时候应该自动生成id

通过插件实现分页查询的逻辑

分页查询请求参数
分页查询响应参数

    /**
     * 分页查询
     * @param categoryPageQueryDTO
     * @return
     */
    public PageResult pageQuery(CategoryPageQueryDTO categoryPageQueryDTO) {
        PageHelper.startPage(categoryPageQueryDTO.getPage(),categoryPageQueryDTO.getPageSize());
        //下一条sql进行分页,自动加入limit关键字分页
        Page<Category> page = categoryMapper.pageQuery(categoryPageQueryDTO);
        return new PageResult(page.getTotal(), page.getResult());
    }

根据Api文档,通过PageHelper实现分页查询的逻辑如下:

  • PageHelper.startPage()方法中传入 第几页 页数大小
  • 通过Page<?>类封装每页中显示的Java实体类
  • 通过Page类提供的getTotal()getResult()方法直接获取记录总数和内容

标签:flavors,26,dishDTO,Day8,Spring,事务,dish,JAVA,public
From: https://blog.csdn.net/MapleLea1f/article/details/143711448

相关文章

  • Idea2024-java-Maven开发配置
    断断续续用过Idea做一些java的学习,在此记录一下最后的配置过程。安装idea,社区版https://www.jetbrains.com.cn/idea/download/?section=windows安装后,setting检查maven的配置 如果想换Mavan的版本,可以自己下载到本地后,点击“Mavanhomepath”后面的"..."选择你下载并解压后......
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-4-启动浏览器-基于Maven(详细教程)
    1.简介上一篇文章,宏哥已经在搭建的java项目环境中添加jar包实践了如何启动浏览器,今天就在基于maven项目的环境中给小伙伴们或者童鞋们演示一下如何启动浏览器。2.eclipse中新建maven项目1.依次点击eclipse的file-new-other,如下图所示:2.在搜索框输入关键字“maven”,然后......
  • Java复习45(PTA)
    office文档页码打印分数20全屏浏览切换布局作者 黄敏单位 河北科技大学在office软件(word,excel)中,有时只需要打印整个文档中的一部分,就需要用户选择需要打印的页码范围。目前输入的页码范围格式定义为:以逗号分割,可以使用-表示连续页码。例如:1,3,5-9,20。表示需要打印......
  • hnuJava程序设计基础训练-2024
    1. DNA序列(Java)【问题描述】 一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。给定一个很长的DNA序列,以......
  • Java复习44(PTA)
     单词替换分数10全屏浏览切换布局作者 孙晨霞单位 河北农业大学设计一个对字符串中的单词查找替换方法,实现对英文字符串中所有待替换单词的查找与替换。输入格式:首行输入母字符串,第二行输入查询的单词,第三行输入替换后的单词。输出格式:完成查找替换后的完整......
  • Java流程控制(三.一)
    publicclassoperator{publicstaticvoidmain(String[]args){//打印九九乘法表for(inti=1;i<10;i++){for(intj=1;j<=i;j++){System.out.print(i+"*"+j+"="+i*j+"\t&q......
  • Java基础面试题
    1.switch的使用intx=2;intresult=0;switch(x){case1:result=result+x;case2:result=result+x*2;case3:result=result+x*3;}System.out.println(result);//返回结果为10//switch语句当case与值不......
  • Java8
    Lambda一、简介Lambda表达式是Java8引入的一种新的语法,它允许你以简洁的方式表示可传递给方法或存储在变量中的代码块。Lambda表达式可以用来替代匿名内部类,使代码更加简洁、易读和易于维护。二、Lambda表达式的基本语法Lambda表达式的语法形式为:(parameters)->expre......
  • java 实训第15天 Java 多线程
    Java多线程一、定义   java程序本身就是多线程的。   二、相关概念   1、操作系统   内核实现其他资源的管理和调度。   2、进程   一个进程就是操作系统中运行的一个应用程序,每个进程都有进程ID标志唯一性   3、线程   线程是计算......
  • Java 实训第17天 Java网络编程
    Java网络编程一、网络分层1、OSI七层   应用层:HTTPFTPPOP3SMTPTELNET...    表示层:    会话层:     传输层:TCPUDP    网络层:IP    数据链路层   物理层    2、TCP/IP协议   应用层--- 应用层,表示......