一、加载mysql2、typeorm、@nestjs/typeorm
为什么使用三个插件?
typeorm 是一个 TypeScript ORM(对象关系映射)框架,它提供了一种将对象模型映射到关系型数据库中的方法,以及提供了对 SQL 和 NoSQL 数据库的支持。同时,typeorm 还提供了一些高级特性,如事务处理、缓存、延迟加载等功能,使开发者可以更加方便地进行数据库操作。
@nestjs/typeorm 是基于 typeorm 的一个 Nest.js 模块,它提供了一种将 typeorm 集成到 Nest.js 应用中的方法。通过使用 @nestjs/typeorm,开发者可以在 Nest.js 应用中更加方便地使用 typeorm 进行数据库操作。
mysql2 是 MySQL 数据库的 Node.js 驱动程序,它提供了一种与 MySQL 数据库进行交互的方法。通过使用 mysql2,开发者可以在 Node.js 应用中访问 MySQL 数据库。
因此,typeorm 和 @nestjs/typeorm 都是用来方便开发者对数据库的操作,而 mysql2 则是提供了访问 MySQL 数据库的方法。在 Nest.js 应用中,一般会使用 @nestjs/typeorm 集成 typeorm 并使用 mysql2 作为 typeorm 的驱动程序,简单来说@nestjs/typeorm依赖typeorm,typeorm依赖 mysql2 ,缺一不可。
当然也可以直接使用mysql2进行链接数据库。
npm install --save @nestjs/typeorm typeorm mysql2
二、创建数据库实体类./user.entity文件
在 Nest.js 应用中,需要创建实体类来映射数据库中的表。
@PrimaryGeneratedColumn() 是 typeorm 模块提供的一个装饰器,用于指定实体类中的主键,并且生成主键的值是由数据库生成的自增长数值。在一个实体类中,通常需要指定一个或多个属性作为主键,以标识实体类的唯一性。使用 @PrimaryGeneratedColumn() 装饰器可以将一个属性设置为自动生成的主键。
可以在 src 目录下创建一个 user.entity.ts 文件,并添加以下内容:
在代码中,@PrimaryGeneratedColumn() 装饰器指定了 id 属性为主键,并且生成主键的值是由数据库生成的自增长数值。当插入一条新的用户数据时,数据库会自动为该用户生成一个新的自增长 id 值。
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
password: string;
}
三、创建数据库服务
下面以app.module.ts文件为示例
这里使用了 TypeOrmModule.forRoot()和TypeOrmModule.forFeature(),这两个方法缺一不可。
TypeOrmModule.forRoot() 方法用于创建数据库连接,并指定连接的参数、实体类、自动同步等选项。这个方法应该在应用程序的根模块(AppModule)中使用,并且只需要调用一次。
TypeOrmModule.forFeature() 方法用于注册需要在本模块中使用的实体类。这个方法可以在任何模块中使用。
一个是连接一个是注册。
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost', // 服务器地址
port: 3306, // 端口号
username: '', // 数据库用户名
password: '', // 数据库密码
database: 'test', // 数据库名
entities: [User], // 实体类
synchronize: true, // 自动同步数据库结构
}),
TypeOrmModule.forFeature([User]), // 注册实体类
],
})
export class AppModule {}
四、进行数据库查询
import { Body, Controller, Get, Post, Req, Res,Param } from "@nestjs/common";
import { Repository } from 'typeorm';
import { User } from '../entities/login.entity';
import { InjectRepository } from '@nestjs/typeorm';
@Controller("login")
export class LoginController {
constructor(
@InjectRepository(User)
private readonly userRepository: Repository<User>
) {}
//保存
@Post('save')
async createUser(@Body() user: User): Promise<User> {
console.log(user)
return await this.userRepository.save(user);
}
//查找全部
@Get('findAll')
async findAll(): Promise<User[]> {
return await this.userRepository.find();
}
//查找某一条
@Get('findOne')
async findOne(@Param('id') id: number): Promise<User> {
return await this.userRepository.findOneBy({
id: id // where id is your column name
});
}
//更新
@Post('update')
async update(@Body() userData: User): Promise<User> {
const data = new User();
data.name = userData.name;
data.password = userData.password;
await this.userRepository.update(userData.id, data);
return await this.userRepository.findOneBy({
id: userData.id // where id is your column name
});
}
//删除
@Post('delete')
async delete(@Body() userData: User): Promise<void> {
await this.userRepository.delete(userData.id);
}
}