返回

nestjs 搭建个人博客(三):操作数据库

前端

初次接触 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 中的其他高级特性,进一步提升我们的博客应用程序。


NestJS 官网