学习nestjs的第五天

这个之前我们首先要做一点前期准备:
mysql安装和数据库可视化工具安装

mysql保姆级安装教程: 安装《MySql8.0保姆级》 - 哔哩哔哩

MySQL - navicat16 安装与破解:MySQL - navicat16 安装与破解 - 简书

vsCode可视化数据库安装:Database Client

就是这个:

之后你会在左边工具栏看到一个桶,点击它→点击Create Connection→输入密码连接

如果出现连接失败,报错:Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)

1.按下”Win“+”R键“打开运行

2.输入”services.msc“

3.找到MYSQL一项,右键点击属性

4.在属性中:将“启动类型”改为“自动”

5.在属性中:点击“服务状态”下的“启动”后,MySQL便可以正常登录。

点击‘+’,输入库名,右键执行全部SQL,新建一个数据库,成功后点击刷新

实体 entity

要知道什么是实体,首先就要知道什么是ORM?

百度百科是这么说的:Object Relational Mapping 对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”

是一种描述对象与关系数据库之间映射的规范

面向对象编程语言和数据库之间的映射,TS(或者说大部分的编程语言)是面向对象的,我们操作的是对象,而数据库它操作的是表,我们操作数据库获得的是一张张表,一行行记录和一个个字段。而ORM做的,就是在二者直接搭建桥梁,把数据库的表转换或者说映射成我们要的对象,它们之间映射的桥梁就是实体,entity

TypeORM

TypeORM是使用ts编写的ORM工具,也是nestjs官方内部推荐的集成数据库和ORM工具,中文文档:实体 | TypeORM 中文文档 | TypeORM 中文网

首先下载依赖

npm install --save @nestjs/typeorm typeorm mysql2

在app.module.ts中注册

@Module({
    imports: [
        TypeOrmModule.forRoot({
            type: 'mysql', // 数据库类型
            username: 'root', // 你的mysql账号,默认root
            password: '', // 你的mysql密码
            host: 'localhost', // host
            port: 3306, //你的端口号,默认3306
            database: 'testdata', // 你需要导入的库名
            //entities: [`${__dirname}/**/*.entity{.ts,.js}`], // 匹配所有entity文件
            synchronize: true, // synchronize字段代表是否自动将实体类同步到数据库,请不要在生产环境使用
            retryDelay: 500, // 重试连接数据库间隔
            retryAttempts: 10, // 重试连接数据库的次数
            autoLoadEntities: true, // 如果为true,将自动加载实体 forFeature()方法注册的每个实体都将自动添加到配置对象的实体数组中
        }),
    ],
    controllers: [],
    providers: [],
})
手动创建实体
//src\modules\content\entities\postdata.entity.ts
import {
    Entity,
    Column,
    PrimaryGeneratedColumn,
    CreateDateColumn,
    UpdateDateColumn,
} from 'typeorm';

@Entity()
export class PostData {
    // 自动递增uuid,如果只是想自增可以不传参数 @PrimaryGeneratedColumn()
    @PrimaryGeneratedColumn()
    id: number;

    // 普通列,可以传入一个对象定义字段类型{type:"varchar",length:200}对象中的type参数是mysql的类型参数
    @Column()
    title: string;

    @Column({ default: '' })//设置默认值
    summary?: string;

    @Column()
    body: string;

    // 创建时间
    @CreateDateColumn({ type: 'timestamp' })
    createTime: Date;

    // 更新时间
    @UpdateDateColumn({ type: 'timestamp' })
    updateTime: Date;
}
引入实体
//src\modules\content\content.module.ts
import { Module } from '@nestjs/common';

import { TypeOrmModule } from '@nestjs/typeorm';

import { PostController } from './controllers/post.controller';
import { PostData } from './entities/postdata.entity';
import { PostService } from './services/posts.service';

@Module({
    //TypeOrmModule调用forFeature方法为传入的实体创建存储库
    imports: [TypeOrmModule.forFeature([PostData])],
    providers: [PostService],
    controllers: [PostController],
})
export class ContentModule {}

刷新表,发现自动创建了这个实体

做一个简单的CURD(增删改查)

typeOrm中有许多内置的方法可以帮我们操作数据库,最常见的莫过于查找find、findOneBy(查找某个值)、创建实体 create、保存save、更新 update、删除 delete、remove

改造下service

import { Injectable } from '@nestjs/common';

import { InjectRepository } from '@nestjs/typeorm';

import { Repository } from 'typeorm';

import { CreatePostDto } from '@/modules/content/dtos/create-post.dto';
import { UpdatePostDto } from '@/modules/content/dtos/update-post.dto';

import { PostData } from '../entities/postdata.entity';

@Injectable()
export class PostService {
	//依赖注入
	//@InjectRepository()装饰器将posts注入;类型是Repository传入PostData
    constructor(@InjectRepository(PostData) private readonly posts: Repository<PostData>) {}

    async findAll() {
    	//find查询,可以传入查询条件对象或者直接传入主键
    	//空参数代表查询实体存储库中所有数据
        const data = await this.posts.find();
        return { data, total: data?.length };
    }

    findOne(id: number) {
    	//findOneBy查询某个值,可以传入对象或者直接传入主键
        return this.posts.findOneBy(id);
    }

    createPost(
        data: CreatePostDto, // 使用Dto
    ) {
    	//创建实体,有两种方式
    	//方法一:调用create方法:this.posts.create(data)
    	//方法二:实例化PostData
        const createData = new PostData();
        createData.body = data.body;
        createData.summary = data?.summary;
        createData.title = data.title;
        //储存实体
        return this.posts.save(createData);
    }

    async upDatePost(data: UpdatePostDto) {
        const newData = await this.posts.findOneBy({
            id: data.id,
        });
        //更新也有两种方式
    	//方法一:save:传入存在的实体(传入不存在的实体会变成保存)
    	//merge:先合并,再保存
    	//const newEntity= await this.posts.merge(data.id, res);
    	//this.posts.save(newEntity);
    	
    	//方法二:update:update(id,obj)
        const res = { ...newData, ...data };
        this.posts.update(data.id, res);
        return res;
    }

    async deletePost(id: number) {
    	//删除可以使用delete(id)或者remove(entity)
    	//const entity=await this.posts.findOneBy(id);
    	//await this.posts.remove(entity);
        await this.posts.delete(id);
        const data = await this.posts.find();
        return { data, total: data?.length };
    }
}

调用下接口

新增

修改

删除

查询

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值