PK创意闹新春,我正在参加「春节创意投稿大赛」,详情请看:春节创意投稿大赛
TypeORM
TypeORM 是一个 ORM(Object Relational Mapping, 对象关系映射), 可以运行在 NodeJS, Browser, Cordova, PhoneGap, Ionic, React Native, NativeScript, Expo, 以及Electron; 可以与 TypeScript 和 JavaScript(ES5、ES6、ES7、ES8)一起使用
事前准备
- 安装mysql (自行安装)
- 安装
typeorm和mysql2;yarn add typeorm mysql2 - 创建数据库和表
- 可以使用可视化工具, 例如: Navicat
- 命令行
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;
使用
1. 连接数据库
从 typeorm 导入 createConnection 和 Connection;
createConnection是用来根据传入的配置, 进行连接数据库;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 会被加载, 并且被连接器使用;
- 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中了
4. 查询数据
Repository<Author> 实例
- 查询全部数据: find() 方法 , 可以传入配置, 这里返回全部数据
- 查询单个数据: 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.更新数据
- 使用
findOne()查出需要修改的数据 - 修改数据
- 使用
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' }