《苍穹外卖》Day02部分知识点记录

news2024/11/19 9:26:15

一、属性的拷贝以及密码的加密

使用org.springframework.beans中的BeanUtils.copyProperties()方法时,二者的属性名必须要一致。

    /**
     * 新增员工
     * @param employeeDTO
     */
    @Override
    public void save(EmployeeDTO employeeDTO) {
        Employee employee = new Employee();
        // 对象的属性拷贝,从employeeDTO拷贝到employee
        BeanUtils.copyProperties(employeeDTO, employee);
        // 设置账号的状态,默认正常状态。1表示正常,0表示异常
        employee.setStatus(StatusConstant.ENABLE);
        // 设置初始密码,默认123456。使用md5算法进行加密(org.springframework.util)
        employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));
        // 设置创建时间和修改时间,当前系统时间
        employee.setCreateTime(LocalDateTime.now());
        employee.setUpdateTime(LocalDateTime.now());
        // 设置当前记录创建人的id和修改人的id
        // TODO
        employee.setCreateUser(10L);
        employee.setUpdateUser(10L);
        // 使用持久层更新数据库的数据
        employeeMapper.insert(employee);
    }

二、写SQL语句时自动提示功能

1. 选中SQL语句,右键选择“show Context Actions”,然后点击“Uninject language or reference”,然后选择“MySQL”。

2. 使用IDEA连接数据库,选择MySQL,然后填写相关信息。最后,刷新一下。

三、安装插件MyBatisX

效果:方便快速定位(点那个小鸟可以快速切换到SQL语句)

四、ThreadLocal

ThreadLocal并不是一个Thread,而是Thread的局部变量。ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。

ThreadLocal的常用方法:

方法名称作用
public void set(T value)设置当前线程的线程局部变量的值
public T get()返回当前线程所对应的线程局部变量的值
public void remove()移除当前线程局部变量
public class BaseContext {

    public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

    public static void setCurrentId(Long id) {
        threadLocal.set(id);
    }

    public static Long getCurrentId() {
        return threadLocal.get();
    }

    public static void removeCurrentId() {
        threadLocal.remove();
    }

}

五、PageHelper分页插件

<dependency>
   <groupId>com.github.pagehelper</groupId>
   <artifactId>pagehelper-spring-boot-starter</artifactId>
   <version>${pagehelper}</version>
</dependency>
    /**
     * 员工的分页查询
     * @param employeePageQueryDTO
     * @return
     */
    @Override
    public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
        // 开始分页查询(页码 + 记录数)
        PageHelper.startPage(employeePageQueryDTO.getPage(), employeePageQueryDTO.getPageSize());
        Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO);

        long total = page.getTotal();
        List<Employee> records = page.getResult();

        // 封装到pageResult
        return new PageResult(total, records);
    }

六、对日期进行格式化

方式一:在属性上加入注解,对日期进行格式化

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;

对日期进行格式化与不进行格式化的对比:

方式二:在WebMvcConfiguration中扩展Spring MVC的消息转换器,统一对日期类型进行格式化处理

package com.sky.json;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;

/**
 * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
 * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
 */
public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    //public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}
package com.sky.config;

import com.sky.json.JacksonObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.util.List;

/**
 * 配置类,注册web层相关组件
 */
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

    /**
     * 扩展spring MVC框架的消息转换器
     * @param converters
     * @Override
     */
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        log.info("扩展消息转换器······");
        // 创建一个消息转换器对象
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        // 需要为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据
        converter.setObjectMapper(new JacksonObjectMapper());
        // 将自己的消息转换器加入容器中,排在第一位,优先使用
        converters.add(0, converter);
    }
}

效果:

七、@PathVariable注解、@RequestParam注解、@RequestBody注解、@ResponseBody注解

1. @PathVariable注解

定义:通过@PathVariable可以将URL中占位符参数绑定到控制器(Controller)处理方法的形参中:URL中的{xxx}占位符可以通过@PathVariable("xxx")绑定到操作方法的形参中。

用法:通常用于RESTful API中,例如@PostMapping("/status/{status}")中的{status}就是一个路径变量,可以使用@PathVariable注解将其注入到方法参数中。

    /**
     * 启动禁用员工信号
     * @param status
     * @param id
     * @return
     */
    @PostMapping("/status/{status}")
    @ApiOperation("启用禁用员工账号")
    public Result startOrStop(@PathVariable Integer status, Long id) {
        log.info("启用禁用员工账号:{}, {}", status, id);
        employeeService.startOrStop(status, id);
        return Result.success();
    }

2. @RequestParam注解

定义:用于从HTTP请求中获取请求参数的值,并将其绑定到方法参数上。

用法:可以指定参数名和是否必须的属性,如@RequestParam("name") String name 表示获取名为"name"的请求参数,并将其赋值给name变量。

注意,如果参数前写了@RequestParam(xxx),那么前端必须要有对应的xxx名字(不管其是否有值,当然也可以通过设置该注解的required属性来调节是否必须传),如果没有xxx名的话,请求会出错,报400。

@RequestMapping(value="/user")
public String getUserBlog(@RequestParam(value="name") String username) {
    return name;
}

3. @RequestBody注解

定义:用于将HTTP请求体中的数据绑定到方法参数上,通常用于接收JSON或XML格式的数据。

用法:在方法参数上添加@RequestBody注解,Spring会自动将请求体中的数据转换为对应的Java注解。

@RestController
@RequestMapping("api/users")
public class UserController {
    @PostMapping("/create")
    public ResponseEntity<User> createUser(@RequestBody UserRequest userRequest) {
        // 创建用户
        User user = userService.createUser(userRequest);
        return ResponseEntity.ok(user);
    }
}

4. @ResponseBody注解

定义:用于将方法的返回值直接作为HTTP响应体返回给客户端,通常用于返回JSON或XML格式的数据。

用法:在方法上添加@ResponseBody注解,Spring将方法的返回值序列化为JSON或XML格式,并作为HTTP响应返回给客户端。

@RestController
@RequestMapping("/api/users")
public class UserController {
    GetMapping("/all")
    @ResponseBody
    public List<User> getAllUsers() {
        // 获取所有用户信息
        List<User> users = userService.getAllUsers();
        return users;
    }
}

总的来说,@PathVariable用于获取路径变量,@RequestParam用于获取请求参数,@RequestBody用于接收请求体数据,@ResponseBody用于返回响应体数据。

八、构造实体对象的两种方式

    /**
     * 启动禁用员工信号
     * @param status
     * @param id
     * @return
     */
    @Override
    public void startOrStop(Integer status, Long id) {
        // 构造实体对象
        // 第一种方式
        // Employee employee = new Employee();
        // employee.setStatus(status);
        // employee.setId(id);

        // 第二种方式
        Employee employee = Employee.builder()
                .status(status)
                .id(id)
                .build();

        employeeMapper.update(employee);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1610186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring webflux 小结

一、WebFlux 简介 WebFlux 是 Spring Framework5.0 中引入的一种新的反应式Web框架。通过Reactor项目实现Reactive Streams规范&#xff0c;完全异步和非阻塞框架。本身不会加快程序执行速度&#xff0c;但在高并发情况下借助异步IO能够以少量而稳定的线程处理更高的吞吐&…

COIN++: Neural Compression Across Modalities 论文阅读笔记

1. 论文基本信息 发布于&#xff1a; TMLR 2022 2. 创新点 使用元学习将编码时间减少了两个数量级以上&#xff0c;将编码共享结构进行编码&#xff0c;并对该网络应用调制来编码实例特定信息。量化和熵编码调制。虽然我们的方法在压缩和速度方面都大大超过了 COIN&#xff0…

Navicat导入sql文件图文教程

本文使用的MySQL工具为:Navicat.默认已经连接数据库!! 步骤: 1.右键自己的数据库,选择新建数据库. 2.输入数据库名称&#xff0c;字符集选择“utf8”&#xff0c;排序规则选择“ utf8_general_ci”,确定. 3.双击新建好的“数据库”。右键点击“运行SQL文件”。 4.选择本地的s…

Linux上的uname

2024年4月19日&#xff0c;周五上午 这是我第一篇用CSDN上的markdown编辑器写的博客&#xff0c;感觉还不错 uname 是一个常用的命令行工具&#xff0c;uname 的全称是 “Unix Name”&#xff0c;它是一个 Unix 和类 Unix 操作系统上的命令行工具&#xff0c;用于获取操作系统相…

同旺科技 USB TO SPI / I2C适配器读写24LC256--页写

所需设备&#xff1a; 1、USB 转 SPI I2C 适配器&#xff1b;内附链接 2、24LC256芯片 适应于同旺科技 USB TO SPI / I2C适配器升级版、专业版&#xff1b; 从00地址开始写入64个字节&#xff0c;然后再将64个字节读回&#xff1b; 页写时序&#xff1a; 读时序&#xff1a…

【不看后悔】AGI时代,这些工具真的能让你收入翻倍!

引言 在数字化浪潮中&#xff0c;AIGC已经成为不可或缺的一部分 无论你是一名内容创作者&#xff0c;还是简单的社交媒体用户&#xff0c;免费的AI工具都能在多个层面助你一臂之力。这些工具涵盖从文本创作到图像设计&#xff0c;再到视频制作等多个方面&#xff0c;不仅可以…

Python全栈开发前端与后端的完美融合

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在当今互联网时代&#xff0c;全栈开发已经成为了一种趋势。全栈开发者具备前端和后端开发的…

基于java+springboot+vue实现的校园一卡通系统(文末源码+Lw+ppt)23-26

摘 要 近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;校园一卡通利用计算机网络实现信息化管理&#xff0c;使整个校园一卡通管理的发展和服务水平有显著提升。 本文拟采用java技…

圣地亚哥 Toler 小学利用School AI帮助每个学生都有自己的聊天机器人,提高学习兴趣和效率

圣地亚哥 Toler 小学利用 AI 程序 SchoolAI 平台为学生创建个性化的聊天机器人&#xff0c;帮助他们更好地学习和提问。这个 AI 程序让学生可以在几秒钟内得到问题的答案&#xff0c;激发了他们提出更多问题的好奇心。 管理、调节和指导学生如何通过任务控制使用人工智能。 当…

Python性能优化技巧

Python作为一种高级编程语言&#xff0c;凭借其简洁易读、开发效率高的特点&#xff0c;受到了广大开发者的喜爱。然而&#xff0c;在追求开发效率的同时&#xff0c;我们也不能忽视Python代码的性能问题。在大数据处理、机器学习等场景下&#xff0c;Python代码的性能往往成为…

SQLite数据库中JSON 函数和运算符(二十七)

返回&#xff1a;SQLite—系列文章目录 上一篇:维护SQLite的私有分支&#xff08;二十六&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​1. 概述 默认情况下&#xff0c;SQLite 支持 29 个函数和 2 个运算符 处理 JSON 值。还有两个表值函数可用于分解 JSON 字…

Golang | Leetcode Golang题解之第37题解数独

题目&#xff1a; 题解&#xff1a; func solveSudoku(board [][]byte) {var line, column [9][9]boolvar block [3][3][9]boolvar spaces [][2]intfor i, row : range board {for j, b : range row {if b . {spaces append(spaces, [2]int{i, j})} else {digit : b - 1line…

Octopus+: An RDMA-Enabled Distributed Persistent Memory File System——泛读笔记

TOS 2021 Paper 分布式元数据论文阅读笔记整理 问题 非易失性存储器&#xff08;NVM&#xff09;和远程直接存储器访问&#xff08;RDMA&#xff09;在存储和网络硬件中提供了极高的性能。然而&#xff0c;现有的分布式文件系统隔离了文件系统和网络层&#xff0c;而且分层的…

H3C交换机基础配置及故障排查

以下命令以H3C S5120为实验对象&#xff0c;其他设备命令可能略有不同 一、交换机基础配置 1.开启NTP服务 ntp enable 设置时区 clock timezone beijing add 8 自定义NTP服务器地址 ntp-service unicast-server 120.25.115.20 #如果使用域名作为ntp服务器的地址&#x…

电脑工作者缓解眼部疲劳问题的工具分享

背景 作为以电脑为主要工作工具的人群&#xff0c;特别是开发人员&#xff0c;我们每天都需要长时间紧盯着屏幕&#xff0c;进行代码编写、程序调试、资料查询等工作。这种持续的工作模式无疑给我们的眼睛带来了不小的负担。一天下来&#xff0c;我们常常会感到眼睛干涩、疲劳…

2.4G射频收发芯片 KT8P01,非常适合超低功耗(ULP)的无线应用

KT8P01是一颗低成本、高性能的智能2.4 GHz射频收发芯片&#xff0c;内置单片机。KT8P01经过优化&#xff0c;提供了单芯片解决方案&#xff0c;适用于超低功耗&#xff08;ULP&#xff09;的无线应用。处理能力、存储器、低功率振荡器、实时计数器以及一系列省电模式的组合为RF…

dependency walker工具简介及使用

dependency walker工具 简介使用 简介 官方概述&#xff1a; Dependency Walker is a free utility that scans any 32-bit or 64-bit Windows module (exe, dll, ocx, sys, etc.) and builds a hierarchical tree diagram of all dependent modules. For each module found, …

Vue实现多角色登录,Vue-Router路由守卫控制权限页面

实现页面侧边栏和头部不变&#xff0c;当点击某个功能时&#xff0c;只有主体部分发生变化&#xff0c;这要用到子路由技术 我的项目结构如上&#xff0c;其中包含侧边栏和头部的文件是Manage.vue&#xff0c;主页面是Home.vue&#xff0c;个人页面是Person.vue&#xff0c;用户…

CSS实现广告自动轮播

实现原理 该广告轮播功能的实现主要依靠HTML和CSS。HTML负责搭建轮播框架&#xff0c;而CSS则控制样式和动画效果。通过CSS中的关键帧动画&#xff08;Keyframes&#xff09;&#xff0c;我们可以定义图片在容器内的滚动效果&#xff0c;从而实现轮播功能。 HTML结构 首先&am…

2024-4-狼道

2024-4-狼道 2024-4-9 宋犀堃&#xff08;堃通坤&#xff0c;多用于人名&#xff09; fatux&#xff1a; 做人当如狗&#xff0c;和蔼可亲&#xff1b;做事当如狼&#xff0c;专注果决。 狼道 智慧生存的强者法则 走向卓越的成功之道 狼道&#xff0c;是追求卓越的野心&am…