尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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企业列表接口基本离不开分页 条件 排序。
RELATED

相关推荐

CameraService 详解二(open camera)

CameraService 详解二(open camera)

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

📅 2026/11/6 13:48:49
Python网络CSV直读实战:HTTP控制、编码压缩与企业级健壮性

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

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

📅 2026/9/12 22:40:31
C语言实战:手搓进制转换器,实现十六进制与十进制的灵活互转

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

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

📅 2026/9/26 13:54:02
MORE NEWS

更多资讯

📰

Windows 11安装MySQL 8.0完整指南与常见问题解决

1. MySQL 8.0在Windows 11上的完整安装指南 作为数据库管理员,我经常需要在各种Windows系统上部署MySQL。最近在Windows 11上安装MySQL 8.0时,发现官方安装包虽然简单,但隐藏了不少坑点。本文将分享我从下载到配置的完整过程,包含…

📰

KaiwuDB分布式数据库安装部署与性能调优实战

1. 初识KaiwuDB:一款值得关注的新型数据库 第一次听说KaiwuDB是在一个技术社区的热门讨论帖里,当时几位资深DBA正在比较各种新型数据库的性能特点。作为一个长期使用传统关系型数据库的开发者,我对这类新兴产品总是保持着谨慎但开放的态度。经…

📰

CentOS 7下Docker Redis三主三从集群一键部署脚本与避坑

简介:针对 CentOS 7.x 环境下希望快速搭建容器化 Redis 集群的 Linux 运维人员与后端开发者,提供一套可传递参数后自动执行的 shell 部署方案,用于减少逐节点配置、容器编排和基础环境准备中的重复操作,适合实验环境验证及中小项目…

📰

E3-1231 v3+B85-D3H黑苹果OpenCore EFI配置与避坑

简介:面向 Intel E3 1231V3 处理器搭配 B85 D3H 主板的黑苹果 EFI 引导配置包,主要服务于希望在非苹果硬件上安装并运行 macOS 的进阶玩家与装机爱好者。内容围绕 Clover/OpenCore 类引导所需组件展开,包含 ACPI 补丁、驱动内核扩展、设备属性…

📰

工业控制系统深度解析:35 电机速度控制

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

📰

Qt飞机大战源码拆解:从工程结构到二次开发实战

简介:这份资源是面向Qt初学者与游戏开发入门者的「飞机大战」完整项目源码包,围绕Qt框架的图形渲染、事件驱动与资源管理等核心能力展开,可用于课程设计、练手项目或Qt技术学习参考。压缩包共223个文件,约6.21MB,以105…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬