发布时间:2026/9/4 23:21:24
MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第七章: TypeORM 高级查询 一、Repository 是什么定义RepositoryEntity 对应的数据访问对象负责操作数据库。简单理解Entity负责描述表结构。Repository负责操作表数据。关系Controller ↓ Service ↓ Repository ↓ Database例如User EntityEntity(user) export class User { }对应RepositoryUser获取 RepositoryInjectable() export class UserService { constructor( InjectRepository(User) private userRepository:RepositoryUser ){} }二、为什么企业项目不推荐 Service 直接写 SQL例如不推荐async findUser(){ return this.dataSource.query( SELECT * FROM user WHERE id1 ) }原因1. 数据库耦合以后MySQL换 PostgreSQL。大量 SQL 需要修改。2. 缺少类型提示SQL字符串。TypeScript不知道返回结构。3. 维护困难大型项目SQL散落。推荐Servicereturn this.userRepository.find();三、save() 新增和修改save()为什么既能新增又能修改因为 TypeORM 根据主键是否存在。判断。新增没有 idconst user{ username:Tom } repository.save(user);生成INSERT INTO user修改有 idconst user{ id:1, username:Jack } repository.save(user);生成UPDATE user SET usernameJack WHERE id1判断有主键 ↓ UPDATE 没有主键 ↓ INSERT四、find 查询最常用查询。查询全部find()SQLSELECT * FROM user;例如const users await userRepository.find();返回[ { id:1, username:Tom } ]五、select 查询指定字段企业不推荐find()查询全部。例如只需要用户名、年龄。find({ select:{ username:true, age:true } })SQLSELECT username,age FROM user;优点减少数据传输提高性能六、findOne 查询单条用于根据ID查询。findOne({ where:{ id:1 } })SQLSELECT * FROM user WHERE id1;常见登录findOne({ where:{ username:admin } })七、where 条件查询等于查询find({ where:{ status:1 } })SQLWHERE status1八、Like 模糊查询对应 SQLLIKE例如搜索用户名包含Tom。import {Like} from typeorm; find({ where:{ username:Like(%Tom%) } })SQLWHERE username LIKE %Tom%Like 和 区别精确匹配usernameTomLike模糊username LIKE %Tom%使用场景搜索框。例如后台用户搜索。九、In 多值查询SQLWHERE id IN(1,2,3)TypeORMfind({ where:{ id:In([1,2,3]) } })例如查询多个用户1 2 3为什么比多个 OR 好错误id1 OR id2 OR id3复杂。推荐id IN(1,2,3)十、Between 范围查询SQLBETWEEN例如年龄18-30。find({ where:{ age:Between(18,30) } })SQLWHERE age BETWEEN 18 AND 30应用时间范围金额范围年龄范围十一、排序 OrderSQLORDER BYTypeORMfind({ order:{ createTime:DESC } })SQLORDER BY create_time DESC常见最新数据DESC十二、分页查询 ⭐⭐⭐⭐⭐后台系统必备。例如用户列表100万用户。不能一次查询全部。分页第一页 1-20 第二页 21-40TypeORMfind({ skip:0, take:20 })对应 SQLLIMIT 20 OFFSET 0skip跳过多少条。例如第二页20条一页。skip:20take取多少条。take:20对应skip OFFSET take LIMIT十三、findAndCount()后台列表最常用。为什么因为列表需要数据总数量例如页面用户列表 第1页 共10000条普通查询两次SELECT * SELECT COUNT(*)TypeORMconst [ users, total ]await repository.findAndCount({ skip:0, take:20 });返回[ [ user1, user2 ], 10000 ]十四、update()直接更新。update( 1, { username:Jack } )SQLUPDATE user SET usernameJack WHERE id1特点不会查询原数据。优点快。缺点不会触发 Entity 生命周期。十五、save() 和 update() 区别save()流程查询对象 ↓ 保存 ↓ 更新适合复杂对象。update()直接SQL UPDATE。适合简单修改。例如修改状态推荐update( id, { status:0 } )十六、delete()物理删除。delete(id)SQLDELETE FROM user WHERE id1企业慎用。十七、softDelete()软删除。softDelete(id)SQLUPDATE user SET deleted_atNOW() WHERE id1企业推荐。十八、relations 关联查询例如订单查询用户find({ relations:{ user:true } })SQLJOIN。但是不要大量使用。原因关联太多SQL复杂。性能下降。十九、QueryBuilder ⭐⭐⭐⭐⭐复杂查询推荐。例如查询订单数量大于10的用户。find困难。QueryBuildercreateQueryBuilder(user) .leftJoin(user.orders,order) .where(order.count10) .getMany();优势1. 支持复杂SQLJOINGROUP BYHAVING子查询。2. 性能控制更强3. 企业复杂列表必用二十、企业用户列表分页搜索接口需求GET /users条件用户名搜索状态过滤分页排序参数{ keyword:tom, status:1, page:1, size:20 }查询findAndCount({ where:{ username:Like(%tom%), status:1 }, skip:0, take:20, order:{ createTime:DESC } })返回{ list:[ {} ], total:1000, page:1, size:20 }二十一、本章总结方法作用find查询列表findOne查询单条save新增/修改update更新delete删除softDelete软删除Like模糊搜索In多值查询Between范围查询skip跳过take数量findAndCount分页QueryBuilder复杂查询本章核心一句话简单查询使用 Repository复杂业务查询使用 QueryBuilder企业列表接口基本离不开分页 条件 排序。

相关新闻

2026/8/31 15:27:40

CameraService 详解二(open camera)

前面介绍了camera service的初始化过程,这里接着介绍open camera在camera service的流程。前面有介绍camera app的常用接口,通过调用api2提供的opencamera接口调用到cameraservice来打开一个指定逻辑camera id的camera对象,在camera service再…

2026/9/4 2:31:59

Python网络CSV直读实战:HTTP控制、编码压缩与企业级健壮性

1. 项目概述:为什么“直接读取网络CSV”是每个数据从业者绕不开的基本功你有没有遇到过这样的场景:早上刚收到运营同事发来的链接,说“最新用户行为数据在这儿,快跑个分析”;或者在复现某篇论文时,作者只给…

2026/8/31 10:18:00

C语言实战:手搓进制转换器,实现十六进制与十进制的灵活互转

1. 为什么需要手动实现进制转换?在嵌入式开发和底层编程中,我们经常需要直接操作硬件寄存器或处理内存数据,这些场景下十六进制表示尤为常见。虽然C标准库提供了strtol和printf等现成函数,但手动实现转换算法能带来三个关键好处&a…

2026/9/4 23:14:13

卡尔曼滤波硬件化:从算法到FPGA的Verilog实现

简介:本资源是一套面向数字电路设计与嵌入式信号处理领域的卡尔曼滤波器Verilog硬件实现方案,适用于FPGA开发工程师、控制算法硬件化实践者及高年级本科生/研究生。资源完整呈现了线性卡尔曼滤波核心逻辑的RTL级设计,涵盖状态预测、测量更新、…

2026/9/4 23:14:13

微信聊天记录导出成HTML、Word、CSV:WeChatMsg 三步搞定

微信聊天记录导出成HTML、Word、CSV:WeChatMsg 三步搞定 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeC…

2026/9/4 23:14:13

集成光隔离器如何保障多激光器宽带稳定运行

集成光隔离器这几年的进展速度,明显比传统工艺时代的预期要快。以前大家觉得隔离器只能做成分立器件,激光器与隔离器之间靠光纤跳线或者微光学元件连接,光谱范围往往固定在某个通信窗口上。最近在宽带、多激光器同时工作这个方向上&#xff0…

2026/9/4 23:14:13

Taichi 完整入门指南:让 Python 免费用上 GPU 并行算力

Taichi 完整入门指南:让 Python 免费用上 GPU 并行算力 【免费下载链接】taichi Productive, portable, and performant GPU programming in Python. 项目地址: https://gitcode.com/GitHub_Trending/ta/taichi Taichi 是一款嵌入 Python 的开源并行编程语言…

2026/9/4 23:14:13

基于STM32的太阳能MPPT控制器设计:从升降压拓扑到算法实现

简介:本资源是一套基于STM32的太阳能MPPT控制器完整工程实现,面向嵌入式开发工程师、新能源方向本科生及毕业设计实践者,解决光伏系统中最大功率点动态追踪与智能电池充电管理的核心问题。项目采用升降压(Buck-Boost)拓…

2026/9/3 18:28:26

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/3 14:29:47

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/3 14:30:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/4 0:00:58

STM32H743 SPI从机DMA双缓冲通信实战

简介:本资源是面向嵌入式开发工程师与STM32进阶学习者的SPI DMA双机通信从机端完整实现方案,聚焦STM32H743高性能Cortex-M7单片机在工业控制与高速数据交互场景下的从机通信开发痛点。压缩包含1355个文件,主体为599个C源码与321个头文件&…

2026/9/4 0:00:58

CPU开盖降温教程:20元成本让温度直降30度的原理与实践

最近很多朋友都在抱怨,自己的电脑一到夏天就变成"烤箱",玩游戏时CPU温度动不动就飙到90度以上,风扇噪音堪比直升机。更让人头疼的是,明明配置不错,却因为高温降频导致性能大打折扣。如果你也遇到了类似问题&…

2026/9/4 0:00:58

ArkTS 表单工程:场地预约页的三态场次 Grid 与校验

ArkTS 表单工程:场地预约页的三态场次 Grid 与校验 App 14「运动场地预约」场地 Tab(Func1Tab),是整 App 交互最丰富的页面——场地横向切换 三色图例 渐变预约预览卡 快捷模板 今日场次 Grid(可选/已选/已满三态&…

2026/9/3 20:43:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/3 17:51:43

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/3 21:06:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…