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

尚硅谷尚庭公寓学习笔记

@Builder 注解
  • 加在实体类上
// 使用@Builder(链式调用)
ApartmentVO vo = ApartmentVO.builder().id(1001L).name("阳光公寓").build(); // 最终通过build()方法生成对象
saveOrUpdate

当调用 saveOrUpdate(T entity) 时:

  • 如果主键不存在,则插入数据
  • 如果主键已存在,更新数据
使用 Minio 上传图片
  • 引入依赖

    <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId>
    </dependency>
    
  • 配置 Minio 相关参数

    minio:endpoint: http://<hostname>:<port>access-key: <access-key>secret-key: <secret-key>bucket-name: <bucket-name>
    
  • 创建 MinioProperties:

    @ConfigurationProperties(prefix = "minio")
    @Data
    public class MinioProperties {private String endpoint;private String accessKey;private String secretKey;private String bucketName;
    }
    
  • 创建MinioConfiguration:

    @Configuration
    @EnableConfigurationProperties(MinioProperties.class)
    public class MinioConfiguration {@Autowiredprivate MinioProperties properties;@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(properties.getEndpoint()).credentials(properties.getAccessKey(), properties.getSecretKey()).build();}
    }
    
  • Controller 层逻辑:

    @Tag(name = "文件管理")
    @RequestMapping("/admin/file")
    @RestController
    public class FileUploadController {@Autowiredprivate FileService service;@Operation(summary = "上传文件")@PostMapping("upload")public Result<String> upload(@RequestParam MultipartFile file) {String url = service.upload(file);return Result.ok(url);}
    }
    
    • Service 层逻辑:

      @Autowired
      private MinioProperties properties;@Autowired
      private MinioClient client;@Override
      public String upload(MultipartFile file) {try {boolean bucketExists = client.bucketExists(BucketExistsArgs.builder().bucket(properties.getBucketName()).build());if (!bucketExists) {client.makeBucket(MakeBucketArgs.builder().bucket(properties.getBucketName()).build());client.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(properties.getBucketName()).config(createBucketPolicyConfig(properties.getBucketName())).build());}String filename = new SimpleDateFormat("yyyyMMdd").format(new Date()) + "/" + UUID.randomUUID() + "-" + file.getOriginalFilename();client.putObject(PutObjectArgs.builder().bucket(properties.getBucketName()).object(filename).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build());return String.join("/", properties.getEndpoint(), properties.getBucketName(), filename);} catch (Exception e) {e.printStackTrace();}return null;
      }private String createBucketPolicyConfig(String bucketName) {return """{"Statement" : [ {"Action" : "s3:GetObject","Effect" : "Allow","Principal" : "*","Resource" : "arn:aws:s3:::%s/*"} ],"Version" : "2012-10-17"}""".formatted(bucketName);
      }
      

      createBucketPolicyConfig 的作用是生成用于描述指定 bucket 访问权限的 JSON 字符串。最终生成的字符串格式如下,其表示,允许(Allow)所有人(*)获取(s3:GetObject)指定桶(<bucket-name>)的内容

      {"Statement" : [ {"Action" : "s3:GetObject","Effect" : "Allow","Principal" : "*","Resource" : "arn:aws:s3:::<bucket-name>/*"} ],"Version" : "2012-10-17"
      }
      
集合判空
  • collection != null:判断集合对象是否为 null, 集合为空也返回 true

  • !CollectionUtils.isEmpty(collection):同时判断是否为 null 以及是否为空

UpdateWrapper
LambdaUpdateWrapper<LeaseAgreement>queryWrapper=new LambdaUpdateWrapper<>();queryWrapper.eq(BaseEntity::getId,id)
.set(LeaseAgreement::getStatus,status);  this.update(queryWrapper);

等价于:

UPDATE apartment_info SET is_release = ? 
IPage 的作用

创建:

IPage<ApartmentItemVo> resultPage = new Page<>(apartmentPage.getCurrent(),  // 当前页码(如第1页、第2页)apartmentPage.getSize(),     // 每页显示的记录数(如每页10条)apartmentPage.getTotal()     // 总记录数(符合查询条件的所有记录总数)
);//也可以复用原来的
IPage<HistoryItemVo> resultPage = new Page<>(current, size);  
resultPage.setRecords(historyItemVos);

设置每一页的记录:

resultPage.setRecords(voList);  
lambada表达式写法
List<SystemUserItemVo> itemVos = userIPage.getRecords().stream()  .map(user -> {  SystemUserItemVo vo = new SystemUserItemVo();  BeanUtils.copyProperties(user, vo); // 拷贝属性(字段名一致时生效)  return vo;  })  .collect(Collectors.toList());// 提取支付类型ID(使用Stream API简化代码)  
List<Long> paymentTypeIds = roomPaymentTypes.stream()  .map(RoomPaymentType::getPaymentTypeId)  .collect(Collectors.toList());
ModelMapper
  • BeanUtils 需要两个对象的属性名需要完全相同才能映射 ; ModelMapper 支持相似名称映射,username 可以映射到 userName

  • ModelMapper 的效率更好

使用:

// 将 UserEntity 转换为 UserVO
modelMapper.map(user,vo);
验证码生成

EasyCaptcha 工具

<dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId>
</dependency>
逻辑删除

如果在实体类中设置了逻辑删除 @TableLogic, service.list() 会过滤掉逻辑删除的记录

下面的方法错误,因为该方法不能用于拷贝两个集合的属性, 只能用于拷贝两个对象实例

//拷贝属性  
List<FeeValue> feeValues
List<FeeValueVo> feeValueVoList=new ArrayList<>();
BeanUtils.copyProperties(feeValues,feeValueVoList);
@Async 注解

@Async 异步执行注解,作用是:将被标记的方法提交到线程池异步执行,调用方(主线程)不会等待该方法执行完成,而是直接继续执行后续逻辑

注意异步方法必须定义在被 Spring 管理的 Bean 中(如 @Service 类)

http://www.dtcms.com/a/308964.html

相关文章:

  • 《P2910 [USACO08OPEN] Clear And Present Danger S》
  • JVM之【Java虚拟机概述】
  • uniapp中uview组件中u-input格式化后赋值踩坑
  • 网站技术攻坚与Bug围剿手记
  • nodejs——在Express中使用Session认证
  • 基于 AXI-Lite 实现可扩展的硬件函数 RPC 框架(附完整源码)
  • graph attention network
  • Sklearn 机器学习 文本数据 计数向量化加入停用词
  • Spring Boot 项目问题:Web server failed to start. Port 5566 was already in use.
  • Linux应用开发基础知识——Makefile初级教程(九)
  • 订单识别与发票识别结合的技术实现方案
  • 最新PS 2025安装包下载与安装教程(Adobe Photoshop 2025 )
  • Java客户端连接Redis
  • langchain--2--invoke、batch、stream、ainvoke、abatch、astream
  • 51c自动驾驶~合集12
  • Python脚本批量将usdz文件转为glb文件
  • 智能体通信协议
  • C++(模板,智能指针)
  • 什么是数据集成?和数据融合有什么区别?
  • Video_1920×1080i 1920_1080p
  • 7月31日作业
  • 模型训练速度慢排查
  • C++法则22:运算符 ::* 和 ->* 和 ::* 是独特的整体运算符,是不可分的。
  • 从关键词到用户意图:2025年Google Trends的语义化SEO实战手册
  • 化学结构式解读指南:从基础认知到InDraw智能识别
  • 大小端字节序详解
  • LCGL使用简介
  • Kubernetes架构概览
  • 2025虚幻5光明之魂开发思考1——借鉴软件工程
  • Dify 从入门到精通(第 6/100 篇):配置你的第一个 LLM:OpenAI、Claude 和 Ollama