这个之前我们首先要做一点前期准备:
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 };
}
}
调用下接口
新增
修改
删除
查询