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

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

使用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);
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

renren-fast-vue-master常见报错和解决

前言&#xff1a; 因为最近博主的实习&#xff0c;所以在小破站写那个分布式微服务电商的项目&#xff0c;什么什么商城就不说了&#xff0c;大家都明白&#xff0c;相信大家像我一样&#xff0c;在使用renren-fast-vue-master的时候都很是头痛&#xff0c;项目还没开始就结束了…

防、治、管融合一体化旅居健康守护系统

随着人口老龄化趋势的加剧和人们生活水平的提高&#xff0c;养老服务需求不断增长。旅居养老作为一种新型的养老模式&#xff0c;逐渐受到广大老年人的青睐。在生命健康服务运营平台中&#xff0c;为了给老人提供全方位、个性化的生命健康服务&#xff0c;我们平台也特意开设了…

PUBG问题解决:吃鸡请重新安装软件MSVCP140.dll

近年来&#xff0c;随着电子竞技游戏的兴起&#xff0c;《绝地求生》&#xff08;俗称“吃鸡”&#xff09;成为了全球范围内备受瞩目的游戏之一。然而&#xff0c;由于游戏本身对计算机硬件和软件的要求较高&#xff0c;许多玩家在游戏过程中可能会遇到各种问题。其中之一就是…

【Yolov系列】Yolov5学习(一)补充2:Focus模块详解

一、相关知识 Focus模块是一种用于特征提取的卷积神经网络层&#xff0c;用于将输入特征图中的信息进行压缩和组合&#xff0c;从而提取出更高层次的特征表示&#xff0c;它被用作网络中的第一个卷积层&#xff0c;用于对输入特征图进行下采样&#xff0c;以减少计算量和参数量…

IS62C256AL-45TLI功能参数介绍及如何优化性能

IS62C256AL-45TLI功能和参数介绍及如何优化性能-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 产品品种:静态随机存取存储器 RoHS:是 存储容量:256 kbit 组织:32 k x 8 访问时刻:45 ns 接口类型:Parallel 电源电压-最大:5.5 V 电源电压-最小:4.5 V 电源电流—最大值:25 mA 最小…

如何高效协作?

前言 上一篇文章我们分享了《如何高效沟通》&#xff0c;本篇文章继续延伸至更复杂的场景&#xff0c;跨团队/跨部门协作。 什么是协同&#xff1f; 协同也会被称为协作合作&#xff0c;无论是哪种类型的团队&#xff0c;无论哪种方式的工作场景&#xff0c;都一定会有协作发…

力扣110. 平衡二叉树

思路&#xff1a;与二叉树最大高度类似&#xff0c;但是这里需要返回 -1 的高度来标识不是平衡二叉树&#xff0c;判断左右子树的高度相差大于1则不平衡&#xff0c;否则就是平衡。 class Solution {public boolean isBalanced(TreeNode root) {int ans func(root);if(ans >…

MySQL主从复制实现高可用性和负载均衡

大家好&#xff0c;我是咕噜铁蛋&#xff0c;今天我想和大家聊聊MySQL主从复制如何帮助我们实现高可用性和负载均衡。在如今的大数据时代&#xff0c;数据库的稳定性和性能成为了企业关注的重点&#xff0c;而MySQL主从复制正是解决这两个问题的重要工具。 一、MySQL主从复制简…

Linux进程和任务管理

目录 一.程序和进程的关系 程序 进程 线程 线程与进程的区别 二.查看进程信息ps 方法一 常用选项 方法二 三.TOP动态查看进程信息 进程信息区各列解释 top常用命令 系统查看命令总结 查看进程信息pgrep 查看进程树pstree 四.控制进程 进程的启动方式 进程的前…

[C语言实现]码林盟主秘籍——《手撕八大排序》

​ ​ &#x1f970;作者: FlashRider &#x1f30f;专栏: 初阶数据结构 &#x1f356;知识概要&#xff1a;详解八大排序的原理、时间复杂度分析、以及代码实现。 目录 八大排序 插入排序 直接插入排序 希尔插入排序 选择排序 冒泡排序 计数排序 堆排序 快速排序 霍…

Gather:基于 DePIN 体系构建的 Web3 社交生态

“Gather 通过搭建一套基于 DePIN 的 Web3 社交体系&#xff0c;正在成为 SocialFi 革命的早期推动者。” 基于互联网的社交&#xff0c;正在为人们提供了远距离沟通和连接的便利&#xff0c;打破了地理障碍&#xff0c;这种具备包容性、广泛性的线上连接&#xff0c;加速了信息…

Git禁止松散对象loose objects弹窗

打开仓库时&#xff0c;弹窗如图 This repository currently has approximately XXXX loose objects.解决办法&#xff1a;见How to skip “Loose Object” popup when running ‘git gui’ Git v1.7.9 或以上版本&#xff0c;执行git config --global gui.gcwarning false

什么是XXE攻击?如何进行防护

安全性很难做到正确&#xff0c;即使在当今具有安全意识的世界中&#xff0c;也存在一些严重的漏洞&#xff0c;例如 XML 外部实体 (XXE)&#xff0c;它们被忽视并最终成为破坏的原因。 XML 外部实体 (XXE) 攻击是一种计算机安全漏洞&#xff0c;通常存在于 Web 应用程序中&…

Uds诊断协议的请求和响应的寻址

一根总线上挂载着很多ECU&#xff0c;那么基于CAN协议UDS的诊断请求报文&#xff0c;诊断仪是如何发给ECU的&#xff1f;如何精准的找到想要诊断的那个ECU&#xff1f;ECU又是如何将诊断响应的报文返回给诊断仪&#xff1f; 在UDS协议中&#xff0c;规定了诊断请求和响应报文发…

kerberos:适配华为FI

文章目录 一、hive1、hive thrift连接方式 一、hive 1、hive thrift连接方式 kerberos认证失败信息 缺少配置&#xff1a;{“hadoop.rpc.protection”:“privacy”}&#xff0c;具体可参考&#xff1a;kerbros认证相关问题 华为FI参考资料&#xff1a; https://github.com…

Hive 解决数据倾斜方法

数据倾斜问题&#xff0c; 通常是指参与计算的数据分布不均&#xff0c; 即某个 key 或者某些 key 的数据量远超其他 key&#xff0c; 导致在 shuffle 阶段&#xff0c; 大量相同 key 的数据被发往同一个 Reduce&#xff0c; 进而导致该 Reduce 所需的时间远超其他 Reduce&…

easyui datagrid单元格点击进入编辑时,行会自动向上错位

现象描述&#xff0c;点击第20行可编辑的单元格进入编辑状态时&#xff0c;滚动条自动滚动到第19行了。导致第20行被分页遮挡&#xff0c;看不到无法编辑。 排查了一天百度AI说是滚动定位问题&#xff0c;最后发现是自己设置的列有问题&#xff0c;表格总共五列&#xff0c;全…

mysql面试题八(SQL语句)

目录 1.SQL 基本组成部分 常用操作示例 创建表 插入数据 查询数据 更新数据 删除数据 创建索引 授予用户权限 2.常见的聚合查询 1. 计数&#xff08;COUNT&#xff09; 2. 求和&#xff08;SUM&#xff09; 3. 平均值&#xff08;AVG&#xff09; 4. 最大值&…

4套java智慧型管理系统源码-智慧校园-智慧工地-智慧城管-智慧3D导诊

第一套&#xff1a;Java智慧校园系统源码 智慧学校源码 微信小程序电子班牌 智慧校园系统简介&#xff1a; 智慧校园的建设逐渐被师生、家长认可接受&#xff0c;智慧校园通过对在校师生、教务等所有人员的信息以及各种信息搜集与储存&#xff0c;进行数据优化与管理&#xf…

Formik:让用户体验更加出色的表单解决方案

hi, 大家好&#xff0c;我是徐小夕&#xff0c; 今天又到了我们的博学时间。今天和大家分享一款非常有价值的开源项目——Formik。 这款开源项目也是我研究零代码搭建平台——H5-Dooring 时参考的项目之一&#xff0c;它可以提高表单渲染引擎的性能和效率&#xff0c;构建出性能…