【管理后台】MySQL数据库接入

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 中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容