TypeORM操作Mysql(一)

1,958 阅读3分钟

PK创意闹新春,我正在参加「春节创意投稿大赛」,详情请看:春节创意投稿大赛

TypeORM

TypeORM 是一个 ORM(Object Relational Mapping, 对象关系映射), 可以运行在 NodeJS, Browser, Cordova, PhoneGap, Ionic, React Native, NativeScript, Expo, 以及Electron; 可以与 TypeScript 和 JavaScript(ES5、ES6、ES7、ES8)一起使用

事前准备

  1. 安装mysql (自行安装)
  2. 安装 typeormmysql2; yarn add typeorm mysql2
  3. 创建数据库和表
    1. 可以使用可视化工具, 例如: Navicat
    2. 命令行
    mysql -h 127.0.0.1 -u root -p # 登录数据库, 输入密码
    
    # 创建名为 typeorm的数据库
    create database typeorm; 
    
    # 切换到新建的表
    use typeorm; 
    
    # 创建作者表
    CREATE TABLE `author` ( 
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '作者编号',
      `name` varchar(20) NOT NULL COMMENT '作者姓名',
      `password` varchar(255) NOT NULL COMMENT '登陆密码',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    这样, 我们一个简单的数据库以及表就建好了;

image.png

使用

1. 连接数据库

typeorm 导入 createConnectionConnection

  1. createConnection 是用来根据传入的配置, 进行连接数据库;
  2. Connection 是连接后的句柄类型
import { createConnection, Connection } from "typeorm";
createConnection({
  type: "mysql",
  host: "localhost", // 主机
  port: 3306, // 端口
  username: "root", // 用户名
  password: "root", // 密码
  database: "typeorm", // 数据库
  synchronize: false, // 是否同步 ; 正式环境 不要打开, 因为 它会干掉你的数据
})
  .then(async (connect: Connection) => {
    console.log("连接成功");
  })
  .catch((err) => {
    console.log(err);
  });

如果在根目录创建一个ormconfig[.json,.js, .ts, .env, .yml, .xml]的文件, 那么 typeorm 会自动引入这个文件, 这样的话 createConnection可以不用传入参数;

2. 建立表实体

建立表实体, 并且

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
/**
 * Author 实体
 */
@Entity()
class Author {
  @PrimaryGeneratedColumn() // 自增建
  id: number; // 用户ID

  @Column()
  name: string; // 姓名

  @Column()
  password: string; // 密码
}

createConnection 的配置参数中, 新增以下参数, 这样 Author 会被加载, 并且被连接器使用;

  1. entities: 是一个数组对象, 可以是 Entity类, entity schema类 ,也可以是一个 路径; 比如 [Post, Category, "entity/*.js", "modules/**/entity/*.js"]
createConnection({
   ...,
  entities: [Author],
})

3. 插入数据

在我们成功连接数据库之后, createConnection 会返回一个 Connection 的实例, 通过 connect 获取 Author 对应的仓库Repository<Author>, 使用 仓库的 save 方法,对新建的 Author 的实例进行 保存, 返回的是一个Promise<Author>对象, 包含了所有 信息 以及 自增的id

// Author { name: '请叫我张先森', password: '123456', id: 1 }
import { Repository } from 'typeorm';

const authorRepository: Repository<Author> = connect.getRepository(Author);
const author: Author = new Author();
author.name = "请叫我张先森";
author.password = "123456";
await authorRepository.save(author); // 这样 我们的数据就被保存到 mysq中了

image.png

4. 查询数据

Repository<Author> 实例

  1. 查询全部数据: find() 方法 , 可以传入配置, 这里返回全部数据
  2. 查询单个数据: findOne(id), 可以传入配置, 这里传入的是id
const authorRepository: Repository<Author> = connect.getRepository(Author);
// 1. 返回所有数据
const authors: Author[] = await authorRepository.find();
// [ Author { id: 1, name: '请叫我张先森', password: '123456' } ]
// 2. 返回id 为1 的数据
const author: Author = await repository.findOne(1);
// Author { id: 1, name: '请叫我张先森', password: '123456' }

5. 删除数据

使用Repository<Author>delete方法; 返回 处理结果

const repository: Repository<Author> = connect.getRepository(Author);
const res = await repository.delete(1);
// DeleteResult { raw: [], affected: 1 }  成功
// DeleteResult { raw: [], affected: 0 }  失败

6.更新数据

  1. 使用findOne()查出需要修改的数据
  2. 修改数据
  3. 使用save() 保存数据, 返回 修改后的数据
const repository: Repository<Author> = connect.getRepository(Author);
const author: Author = await repository.findOne(2);
author.name = "Call Me Mr.zhang";
const res: Author = await repository.save(author);
console.log(res);
// Author { id: 2, name: 'Call Me Mr.zhang', password: '123456' }

相关链接

  1. repository-design-pattern
  2. TypeORM
  3. NestJs