MySQL数据库安装和使用
1. MySQL下载与安装
方式1:下载官方安装包安装 https://dev.mysql.com/downloads/mysql/
方式2:使用Homebrew安装(推荐)
# 使用Homebrew安装MySQL
brew install mysql
# 查看安装版本号
mysql --version
# 启动MySQL服务(会自动配置为开机启动)
brew services start mysql
# 设置root密码和安全配置(按照提示操作,设置root密码、删除匿名用户、禁止root远程登录等,直接输入y回车)
# 注意root密码:要复杂一点,8位以上包含大小写字母、数字、特殊字符等。如:Admin@123456
mysql_secure_installation
# 可以尝试登录一下数据库的 root 账号,看root密码是否正确。
mysql -u root -p
# 推出登录
mysql> quit
- MySQL服务管理
# ======== 官方安装包版本 ========
# 启动MySQL
sudo /usr/local/mysql/support-files/mysql.server start
# 停止MySQL
sudo /usr/local/mysql/support-files/mysql.server stop
# 重启MySQL
sudo /usr/local/mysql/support-files/mysql.server restart
# 检查状态
sudo /usr/local/mysql/support-files/mysql.server status
# ======== Homebrew安装版本 ========
# 启动MySQL
brew services start mysql
# 停止MySQL
brew services stop mysql
# 重启MySQL
brew services restart mysql
# 检查所有服务状态
brew services list
-
启动完MySQL服务后,使用 Navicat Premium 可视化工具连接MySQL
新建连接
新建数据库
导入数据
NestJS连接MySQL开发
TypeORM 的使用
TypeORM 是 Node.js 领域的对象关系映射器(ORM),是用 TypeScript 编写,这里我们可以使用它来集成数据库。
# 安装 TypeORM 和必需的依赖项
npm install --save typeorm mysql2
1. 建立 MySQL 数据库连接
- 从
typeorm包导入的new DataSource().initialize()类建立与数据库的连接。
/// database.providers.ts
import { DataSource } from 'typeorm';
import { getMySQLConfig } from '../utils';
// 获取 MySQL 配置信息(用户名和密码存放本地磁盘文件中,更安全)
const { username, password } = getMySQLConfig();
// 建立 MySQL 数据库连接
export const databaseProviders = [
{
provide: 'DATA_SOURCE',
useFactory: async () => {
const dataSource = new DataSource({
type: 'mysql',
host: 'localhost',
port: 3306,
username: username || 'root',
password: password || 'root',
database: 'vben-book-dev',
entities: [
__dirname + '/../**/*.entity{.ts,.js}',
],
// synchronize: true, // 注意:生产环境中不应使用,否则可能导致生产数据丢失。(没有表的时候,创建好实体,会自动生成表)
});
return dataSource.initialize();
},
},
];
- 导出这些提供者,使它们对应用程序的其他部分可访问 。
/// database.module.ts
import { Module } from '@nestjs/common';
import { databaseProviders } from './database.providers';
@Module({
providers: [...databaseProviders],
exports: [...databaseProviders],
})
export class DatabaseModule {}
2. 数据库实体Entity创建
/// user.entity.ts
import { Column, Entity, PrimaryGeneratedColumn, Unique } from "typeorm";
// 定义实体,与数据库表和字段形成映射关系
@Entity('admin_user') // 指定映射的数据库表名为'user'
export class User {
@PrimaryGeneratedColumn() // 指定该属性为主键,且值自动自增生成
id: number;
@Column() // 指定该属性映射为数据库表的列
@Unique(['username']) // 设置唯一约束
username: string;
@Column()
password: string;
@Column()
avatar: string;
@Column()
role: string;
@Column()
nickname: string;
@Column()
active: number;
}
3. MySQL表关联和查询逻辑实现
Repository在 TypeORM 中通常翻译为“仓库”或“存储库”,也可以称为“数据访问对象”。它的作用是让开发者无需直接编写 SQL 语句,就能以面向对象的方式操作数据库。Repository 封装了对数据库表的常用 CRUD 操作(即:Create 增、Read 查、Update 改、Delete 删),简化了数据访问和管理流程。创建一个 Repository 提供者
/// user.providers.ts
// 导入 TypeORM 的 DataSource,用于连接和操作数据库。
import { DataSource } from "typeorm";
// 导入 User 实体类,代表数据库中的用户表结构。
import { User } from "./user.entity";
// 作用是把 User 实体的数据库操作对象(Repository)注册为 NestJS 的 provider,
// 方便在服务或控制器中通过依赖注入获取和操作用户数据。这样可以实现模块化、解耦和方便测试。
export const userProviders = [
{
// 指定 provider 的名字为 'USER_REPOSITORY',用于依赖注入时引用。
provide: 'USER_REPOSITORY',
// 使用工厂函数,传入 DataSource 实例,返回 User 实体的 Repository(数据库操作对象)。
useFactory: (dataSource: DataSource) => dataSource.getRepository(User),
// 指定工厂函数的参数从哪里注入,这里注入名为 'DATA_SOURCE' 的 provider。
inject: ['DATA_SOURCE'],
},
];
- 使用 @Inject() 装饰器将 Repository<User> 注入到 UserService 中:
在 NestJS 项目中,通过依赖注入获取 Repository,可以在服务或控制器里方便地进行数据操作和业务逻辑处理。
@Injectable()和@Inject()都是 NestJS 的装饰器,用于依赖注入机制:
@Injectable():标记一个类为可注入的服务(Provider),让 NestJS 能够在其他地方通过依赖注入使用这个类。没有这个装饰器,NestJS 不会自动管理该类的实例。
@Inject():用于在构造函数参数上,指定要注入的 provider 名称。比如 @Inject('USER_REPOSITORY') 表示把名为 'USER_REPOSITORY' 的 provider 注入到对应参数上。
总结:@Injectable() 让类能被 NestJS 管理和注入,@Inject() 用于指定具体注入哪个依赖。这样可以实现模块解耦和自动管理依赖。
/// user.service.ts
import { Inject, Injectable } from "@nestjs/common";
import { Repository } from "typeorm";
import { User } from "./user.entity";
@Injectable() // 标记该类为可注入的服务(Provider),让类能被注入
export class UserService {
// 构造函数会在 UserService 实例化时自动注入 userRepository,这样 UserService 就可以直接通过这个成员进行用户相关的数据库操作,无需自己创建或管理 Repository 实例。
constructor(
// 通过依赖注入,把名为 'USER_REPOSITORY' 的 provider 注入到 UserService 中。
@Inject('USER_REPOSITORY') // 用于指定注入哪个依赖
// 声明一个私有成员:用于操作用户数据表。
private userRepository: Repository<User>
) { }
async createUser(createUserDto: UserDto): Promise<User> {
const user = new User();
user.username = createUserDto.username;
user.password = createUserDto.password;
// 添加用户信息
return this.userRepository.save(user);
}
async findAllUsers(): Promise<User[]> {
// 查询所有用户
return this.userRepository.find();
}
async findUserById(id: string): Promise<User | null> {
// 根据ID查询用户
return this.userRepository.findOne({ where: { id: Number(id) } });
}
}
/// 定义 DTO(数据传输对象)模式,DTO 是一个规定了网络数据传输格式的对象
export class UserDto {
id: number;
username: string;
password: string;
}
在 module 中,注入提供者
/// user.module.ts
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { userProviders } from './user.providers';
import { UserService } from './user.service';
@Module({
controllers: [UserController],
providers: [...userProviders, UserService],
})
export class UserModule {}
提示 别忘了将 UserModule 导入根模块 AppModule 中。



