瑞吉外卖笔记(实战部分)

@TableField

作用:

  • 当数据库中的列名与实体类中的属性名不一致,使用@TableField 使其对应
@TableField("db_column_name")
private String entityFieldName;
  • 通过 exist 属性来指定该字段是否参与数据库的增删改查操作。

    @TableField(exist = false)
    private String tempField;  // 该字段不会参与数据库操作
    
  • 实现自动填充,标注在需要自动填充的字段上,支持插入时自动填充或更新时自动填充。

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;  // 插入时自动填充
    
  • 指定更新策略,控制字段的更新方式。

    @TableField(updateStrategy = FieldStrategy.NOT_NULL)
    private String name;  // 只有字段不为空时才更新
    

例:

//指定填充策略,插入时填充
@TableField(fill = FieldFill.INSERT)  
private Long createUser;  
//插入,更新时填充
@TableField(fill = FieldFill.INSERT_UPDATE)  
private Long updateUser;
  • @pathvariable :用于指定路径参数,不带问号的,比如category/1这种形式.
  • 下面的url中,id直接以键值对形式跟在?后,明确地说明了这就是id的值,不用加@pathvariable注解.
http://localhost:8080/category?id=12345
@DeleteMapping  
public R<String> delete( Long id){  
    categoryService.remove(id);  
    return R.success("删除菜品分类成功!");  
}

前端提交过来的得是json格式的数据才用@RequestBody注解 , 不是说看见对象就用@RequestBody注解

@Transactional: 这个注解表示方法内的所有数据库操作要么都成功,要么都失败。如果某个操作出现异常,事务会回滚,来确保数据一致性, 操作多张表的时候需要用到

BeanUtils.copyProperties 方法

BeanUtils.copyProperties : Apache Commons BeanUtils 提供的静态方法,用于将源对象的属性值拷贝到目标对象中。

方法签名:
public static void copyProperties(Object dest, Object orig, String... ignoreProperties) throws BeansException;

  • dest: 目标对象
  • orig: 源对象
  • ignoreProperties: 可变参数,指定被忽略的属性

注意点:

  • 类型匹配:BeanUtils.copyProperties 会根据属性名和类型自动匹配。如果目标对象的属性类型与源对象不一致,则拷贝会失败。
  • 忽略字段:如果目标对象不包含源对象的某个属性(或某个属性类型不匹配),则会跳过这个字段的拷贝。

REST标准 HTTP 方法:

  • GET:获取资源。查询
  • POST:创建资源。保存,创建
  • PUT:更新资源。更新
  • DELETE:删除资源。
MD5算法:

MD5是一种广泛使用的哈希算法,用于生成一个固定长度的(128位)哈希值(通常表示为32位十六进制数)。它将任意长度的输入数据(如文本、文件等)映射为一个固定大小的输出值。

特点:
1.单向性:一旦输入数据被哈希为MD5值,就无法从哈希值推回原始数据。
2.输出固定长度:无论输入数据多大,MD5哈希值的长度始终是128位(32个字符的十六进制表示)。
3.敏感性:即使输入数据稍微改变(比如改变一个字符),其输出的MD5哈希值也会发生巨大变化。

用途:
4.数据完整性验证:MD5常用于文件下载时进行完整性校验,通过比较文件的MD5值来检查文件是否被篡改。
5.密码存储:虽然在过去,MD5被用于存储密码的哈希,但由于其安全性较低(容易碰撞),现代应用中一般更倾向于使用更安全的算法,如SHA-256或bcrypt。
6.数字签名和证书:在一些场景中,MD5也用于生成数据的唯一标识。

安全性问题:容易受到“碰撞攻击”(即两个不同输入产生相同哈希值)。

MP查询

LambdaQueryWrapper : 用于构造查询条件的工具类,可以通过lambda表达式来确保条件的正确,避免手动拼接字符串导致的错误和SQL注入问题

示例:

queryWrapper.eq(Employee::getUsername, employee.getUsername());
  • queryWrapper.eq(...) :用于添加 等值查询 条件。
  • .eq 表示 “等于” (=).

LambdaQueryWrapper 查询方法:

方法描述示例代码
eq等于queryWrapper.eq(Employee::getAge, 25);
ne不等于queryWrapper.ne(Employee::getAge, 25);
gt大于queryWrapper.gt(Employee::getAge, 25);
lt小于queryWrapper.lt(Employee::getAge, 25);
ge大于等于queryWrapper.ge(Employee::getAge, 25);
le小于等于queryWrapper.le(Employee::getAge, 25);
like模糊匹配queryWrapper.like(Employee::getName, "John");
likeLeft左模糊匹配queryWrapper.likeLeft(Employee::getName, "John");
likeRight右模糊匹配queryWrapper.likeRight(Employee::getName, "John");
in包含queryWrapper.in(Employee::getAge, 20, 25, 30);
notIn不包含queryWrapper.notIn(Employee::getAge, 20, 25, 30);
isNull字段为 NULLqueryWrapper.isNull(Employee::getPhone);
isNotNull字段不为 NULLqueryWrapper.isNotNull(Employee::getPhone);
between字段范围queryWrapper.between(Employee::getAge, 20, 30);
orderByAsc升序排序queryWrapper.orderByAsc(Employee::getAge);
orderByDesc降序排序queryWrapper.orderByDesc(Employee::getAge);
select选择字段queryWrapper.select(Employee::getName, Employee::getAge);
last拼接 SQLqueryWrapper.last("LIMIT 5");
groupBy分组queryWrapper.groupBy(Employee::getDepartment);
havingHAVING 子句queryWrapper.having("count(id) > 5");
异常处理器
package warren.reggie.common;

/*
 * author: Warren
 */

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLIntegrityConstraintViolationException;


@ControllerAdvice(annotations = {RestControllerAdvice.class, Controller.class}) // 处理加了这些注解的类(@RestController 或 @Controller)
@ResponseBody // 返回的对象会自动序列化为JSON,直接作为HTTP响应体返回
public class ExceptionHandler {

    /**
     * 处理SQLIntegrityConstraintViolationException异常。
     * @param ex 捕获的异常对象
     * @return 返回错误信息的响应对象(R类)
     */
    @org.springframework.web.bind.annotation.ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> ExceptionHandler(SQLIntegrityConstraintViolationException ex) {
      
      System.out.println("异常信息:" + ex.getMessage());

      if (ex.getMessage().contains("Duplicate entry")) {
          
          //将异常信息按空格拆分并取出相关字段
          String[] s = ex.getMessage().split(" ");
          
          // 错误信息提取:获取重复条目的字段值,通常是数据库的唯一键(如用户名、手机号等)
          String msg = s[2] + "已存在"; // 提示用户该数据已存在
          
          return R.error(msg);
      }
      
      // 如果不是重复数据的错误,则返回通用的错误信息
      return R.error("出错了");
  }
}

@ExceptionHandler : 捕获并处理指定类型的异常。

@ControllerAdvice : 集中处理所有控制器类中抛出的异常。应用于所有带有 @Controller@RestController 注解的类.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值