「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」
ORM
ORM 对象-关系映射 Object-Relational Mapping
通过使用对象和数据库之前映射的元数据,将程序中的对象自动持久化到关系数据库中。通过实例对象的语法去操作数据库。
映射关系:
- 表 : 类
- 记录 :对象
- 字段 :对象属性
使用 ORM 可以不仅可以提高开发效率,数据访问更加抽象、轻便,支持面向对象封装。因为我们统一定义数据模型,更易更新和维护,且有利于代码重用。现有很多ORM 框架可以使用,可以让我们更专注业务逻辑的处理。
有优点自然也存在缺点。比如:
- 性能不如原生SQL
- 可能存在一些特殊业务场景,而使用ORM 可能无法定制部分SQL语句
TypeORM集成
TypeORM是 TypeScript 中最成熟的对象关系映射器,它可以很好地与 Nest 框架集成。
详细使用可以看 TypeORM中文文档,这里介绍在Nestjs中使用 TypeORM
安装所需的依赖包,这里是以mysql2 为例。 TypeORM 提供了对许多关系数据库的支持,比如 PostgreSQL 、Oracle、Microsoft SQL Server、SQLite,甚至像 MongoDB这样的 NoSQL 数据库
npm install --save @nestjs/typeorm typeorm mysql2
mysql 数据可以使用Docker安装一个MySQL镜像
docker run --name {your_mysql_name} -e MYSQL_ROOT_PASSWORD={your_password} -d -p {port}:3306 mysql
实体对应
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
firstName: string;
@Column()
lastName: string;
@Column({ default: true })
isActive: boolean;
}
自动载入实体
Nestjs 框架支持配置autoLoadEntities 这一选项,使得每个通过forFeature()注册的实体都会自动添加到配置对象的entities数组中
@Module({
imports: [
TypeOrmModule.forRoot({
...
autoLoadEntities: true,
}),
],
})
export class AppModule {}
事务
typeORM 当然也是支持事务的,以下代码是创建事务,然后将所运行的所有内容都在事务的回调内执行。
await getManager().transaction(async transactionalEntityManager => {
await transactionalEntityManager.save(users);
// ...
});
详细的使用可以通过操作手册。typeORM其实提供很多功能,数据之间的关系,多个数据库连接等。
NestJs重学系列整合
参考资料: