NestJS mysql typeorm CURD

171 阅读2分钟

typeorm官网

typeorm.bootcss.com/

image.png

TypeORM 集成

为了与 SQL 和 NoSQL 数据库集成,Nest 提供了 @nestjs/typeorm 包。 TypeORM 是可用于 TypeScript 的最成熟的对象关系映射器 (ORM)。 由于它是用 TypeScript 编写的,因此可以很好地与 Nest 框架集成。

yarn add @nestjs/typeorm typeorm mysql2 -S

安装过程完成后,我们可以将 TypeOrmModule 导入到根 AppModule 中。

app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { DemoModule } from './demo/demo.module';
import { UploadModule } from './upload/upload.module';
import { GuardModule } from './guard/guard.module';
import { ConfigModule } from '@nestjs/config';
import env from './env/index';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true, load: [env] }),
    TypeOrmModule.forRoot({
      type: "mysql", //数据库类型
      username: "root", //账号
      password: "xxxxxx", //密码
      host: "localhost", //host
      port: 3306, //
      database: "demo", //库名
      entities: [__dirname + '/**/*.entity{.ts,.js}'], //实体文件
      synchronize:true, //synchronize字段代表是否自动将实体类同步到数据库
      retryDelay:500, //重试连接数据库间隔
      retryAttempts:10,//重试连接数据库的次数
      autoLoadEntities:true, //如果为true,将自动加载实体 forFeature()方法注册的每个实体都将自动添加到配置对象的实体数组中
    }),
    DemoModule,
    UploadModule,
    GuardModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

使用

目录结构

image.png

新增

dto/create-guard.dto.ts

import { ApiProperty } from '@nestjs/swagger'

export class CreateGuardDto {
    @ApiProperty({
        required:true,
        description:"用户名"
    })
    username:string

    @ApiProperty({
        required:true,
        description:"密码"
    })
    password:string
}

guard.entity.ts

import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  CreateDateColumn,
} from 'typeorm';

@Entity()
export class Guard {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  username: string;

  @Column()
  password: string;

  @CreateDateColumn({ type: 'timestamp' })
  createTime: Date;

  @CreateDateColumn({ type: 'timestamp' })
  updateTime: Date;
}

guard.controller.ts

import { Controller, Get, Post, Body, Patch, Param, Delete,UseGuards,SetMetadata } from '@nestjs/common';
import { GuardService } from './guard.service';
import { CreateGuardDto } from './dto/create-guard.dto';
import { UpdateGuardDto } from './dto/update-guard.dto';
import { ApiTags,ApiOperation, ApiParam, ApiQuery } from '@nestjs/swagger';

@ApiTags("guard模块")
export class GuardController {
  constructor(private readonly guardService:GuardService) {}
  
  @Post("add")
  @ApiOperation({summary:"创建用户"})
  @ApiParam({name:'username',description:"用户名"})
  @ApiParam({name:'password',description:"密码"})
  saveUser(@Body() createGuardDto:CreateGuardDto){
    return this.guardService.saveUser(createGuardDto)
  }
}

guard.service.ts

import { Injectable } from '@nestjs/common';
import { CreateGuardDto } from './dto/create-guard.dto';
import { InjectRepository } from '@nestjs/typeorm'
import { Guard } from './entities/guard.entity'
import { Repository } from 'typeorm'

@Injectable()
export class GuardService {
  constructor(@InjectRepository(Guard) private user: Repository<Guard>){}

  saveUser(createGuardDto:CreateGuardDto){
    const user = new Guard()
    user.username = createGuardDto.username
    user.password = createGuardDto.password
    return this.user.save(user)
  }
}

运行

navcat查看 已经创建了该表

image.png

Swagger

image.png

数据已保存

image.png

修改

guard.controller.ts

  @Post('update')
  @ApiOperation({summary:'更新'})
  @ApiParam({name:'id',description:""})
  @ApiParam({name:'username',description:""})
  @ApiParam({name:'password',description:""})
  updateUser(@Body() updateData:UpdateGuardDto){
    console.log(updateData)
    return this.guardService.updateUser(updateData)
  } 

guard.service.ts

updateUser(updateData:UpdateGuardDto){
   return this.user.update(updateData.id,updateData)
}

image.png

image.png

删除

guard.controller.ts

  @Post('remove')
  @ApiOperation({summary:'删除'})
  @ApiParam({name:'id',description:"删除的id"})
  remove(@Body('id') id){
    console.log(id)
    return this.guardService.remove(id)
  }

guard.service.ts

async remove(id:number){
    const removeDTO = await this.user.findBy({
      id
    })
    console.log(removeDTO)
    return this.user.remove(removeDTO)
}

image.png

image.png

查询

guard.controller.ts

  @Get('search')
  @ApiOperation({ summary: '查询' })
  @ApiQuery({ name: 'username', description: '查询name' })
  search(@Query('username') username: string,@Query('page') page:number,@Query('size') size:number) {
    return this.guardService.search(username,page,size);
  }

guard.service.ts

 async search(username: string,page:number = 1,size:number = 10) {
    const data = await this.user.findAndCount({
      where: {
        username: Like(`%${username}%`)
      },
      skip:(page-1)*size,
      take:size
    })
    return {
      list:data[0],
      total:data[1]
    }
  }

image.png

image.png