返回
nestjs 搭建个人博客(三):操作数据库
前端
2023-10-09 00:47:45
初次接触 NestJS 搭建个人博客时,连接数据库是至关重要的第一步。在上篇文章中,我们已成功建立数据库连接,今天我们就来深入探索如何操作数据库,完成 DAO(数据访问对象)层的构建。
DAO 层:数据访问的中枢
DAO 层是应用程序与数据库交互的桥梁。它负责执行 CRUD(创建、读取、更新、删除)操作,让我们能够方便地管理数据,而无需直接与底层数据库交互。
在 NestJS 中,使用 TypeORM 作为 ORM(对象关系映射器)工具,它可以自动将数据库表映射为 JavaScript 类,极大地简化了我们的操作。
实体类:数据库表的映射
首先,我们需要创建实体类来映射数据库表。实体类与数据库表一一对应,它的属性与表中的字段相对应。
例如,创建一个名为 Post
的实体类:
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
content: string;
}
数据仓库:封装数据操作
接下来,我们需要创建数据仓库来封装数据操作。数据仓库类似于 DAO 层,但更专注于特定实体。
例如,创建一个 PostRepository
数据仓库:
@Injectable()
export class PostRepository {
constructor(private readonly connection: Connection) {}
async create(post: Post): Promise<Post> {
return await this.connection.manager.save(post);
}
async find(): Promise<Post[]> {
return await this.connection.manager.find(Post);
}
async update(post: Post): Promise<Post> {
return await this.connection.manager.save(post);
}
async delete(id: number): Promise<void> {
await this.connection.manager.delete(Post, id);
}
}
这个数据仓库提供了对 Post
实体的 CRUD 操作,让我们能够轻松地添加、查找、更新和删除博客文章。
注入数据仓库:在服务中使用 DAO
现在,我们可以将数据仓库注入到服务中,在服务中使用 DAO 层的功能。
例如,在我们的博客服务中:
@Injectable()
export class BlogService {
constructor(private readonly postRepository: PostRepository) {}
async createPost(post: Post): Promise<Post> {
return await this.postRepository.create(post);
}
async getPosts(): Promise<Post[]> {
return await this.postRepository.find();
}
async updatePost(post: Post): Promise<Post> {
return await this.postRepository.update(post);
}
async deletePost(id: number): Promise<void> {
await this.postRepository.delete(id);
}
}
总结
通过使用 TypeORM 和 NestJS,我们可以轻松地操作数据库,构建强大的 DAO 层。通过将数据操作封装到数据仓库中,我们可以保持代码的整洁和可维护性。接下来,我们将继续探索 NestJS 中的其他高级特性,进一步提升我们的博客应用程序。