发布时间:2026/7/15 21:02:41
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/7/15 21:02:41

CameraService 详解二(open camera)

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

2026/7/15 21:02:41

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

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

2026/7/15 21:02:41

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

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

2026/7/15 22:08:11

模型服务监控面板:延迟、吞吐、错误率、显存四象限监控

模型服务监控面板:延迟、吞吐、错误率、显存四象限监控 一、你的监控面板有 50 个图表,但真正有用的是哪几个 打开生产环境的 Grafana 面板,密密麻麻的折线图、柱状图、饼图、热力图。GPU 利用率、CPU 使用率、内存占用、磁盘 I/O、网络带宽、…

2026/7/15 22:08:11

AI图像生成与角色建模:从Stable Diffusion到ComfyUI的完整实践指南

这次我们来看一个名为"时理|刘枭"的项目,从标题和关键词来看,这应该是一个涉及人物形象或数字内容的创作项目。虽然具体的技术细节在输入材料中比较有限,但我们可以从技术角度分析这类项目的典型实现方式和验证流程。这类项目通常涉…

2026/7/15 22:08:11

商城网站搭建平台哪个好,微商城和PC商城到底哪里不同

商城网站搭建平台哪个好?微商城和PC商城到底哪里不同?2026年中国自助建站市场规模达286亿元,同比增长32.4%,AI驱动型建站占比突破61%。越来越多的商家开始搭建自己的线上商城,但很多人第一步就卡住了——微商城和PC商城…

2026/7/15 22:08:11

MATLAB版Chan算法TDOA定位实现:含三基站/多基站代码+实操视频

本文还有配套的精品资源,点击获取 简介:提供一套开箱即用的MATLAB TDOA定位实现方案,核心是Chan算法的两种版本:ChanAlgorithm.m支持标准三基站二维定位,ChanAlgorithm1.m扩展至四站及以上,提升冗余观测…

2026/7/15 17:04:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/14 19:23:19

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/14 18:30:06

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/15 0:08:29

【LINUX】驱动

【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】

2026/7/15 0:08:29

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

🔍 数据简介 本次分享1982-2026年全国村级精度建筑轮廓矢量数据,覆盖全国各省市区县,到村级别精细,为2026年最新实时采集成果,非网传仅60/77个城市的老旧数据。 数据含带高度/不带高度双版本,单体建筑边界精…

2026/7/15 0:08:29

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

🔍 数据简介 本次分享1975-2026年全国高精度水系水路矢量数据,覆盖全国全域,包含河流、水系、水库、运河、湿地、冰川、沟渠等全类别水文要素。 数据集包含双层矢量图层,字段分类清晰、要素齐全,支持2013-2026逐年完整…

2026/7/15 13:36:32

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…