MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第七章: TypeORM 高级查询

发布时间:2026/10/31 12:34:30

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/10/31 14:51:41

CameraService 详解二(open camera)

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

2026/10/31 14:53:13

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

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

2026/11/1 2:33:28

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

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

2026/11/1 2:01:37

1.c++入门篇

1.c中的关键字asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassext…

2026/11/1 2:01:37

《江灯合声》:有可行的分框版,也仍可以选择连续鸣谢

武汉江岸区栎坡合唱团在免费节目册《江灯合声》中,以表格集中鸣谢资助者。各家共同要求改为独立小框,团里仍想保留表格。现有全名与支持事项清楚可见,双方此前未承诺具体排版。我支持保留表格。补充的试排材料让选择更具体:分框能…

2026/11/1 2:01:37

关于“贾子猜想”的数学地位、结构特征与讨论边界

关于“贾子猜想”的数学地位、结构特征与讨论边界摘要 本文对“贾子猜想”进行基于公开表述与现有数学事实的分析。该猜想主张:当正整数 n3m>5(即 n6,9,12,15,…)时,方程x₁ⁿ x₂ⁿ ⋯ xₙⁿ yⁿ不存在正整数解。文章首先…

2026/11/1 2:01:37

启动报Port 8088 was already in use?先查是谁占的

启动报Port 8088 was already in use?先查是谁占的 项目启动报 Port 8088 was already in use,意思很直白:这个端口已经有人占了。 先说原理:端口是"门牌号",一间房只住一个进程 端口就是一台机器上的门牌号…

2026/11/1 2:01:37

担心文档上云?本地运行的办公AI才敢放心用

单位上周开了个会,主题是"AI 提效",散会时领导补了一句:涉及客户资料的文档,不许往云端传。这话一出,会议室里本来跃跃欲试的同事全蔫了——大家平时用的那些在线 AI,文档一上传就不知道存哪儿去…

2026/11/1 1:56:37

华为OD机试真题 新系统 2026-10-28 JavaGoC【社交网络消息转发】

目录 题目 思路 Code 题目 题目内容: 在一个社交网络中,有 N 个用户(编号 0 到 N−1);每个用户都有一个「转发名单」(整数),该数二进制格式中的第 i 位为 1 表示此用户会把消息转发给第 i 个用户。 给定一个整数数组 forwardLists 和一个整数 initialSenders,请…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑