前言
相信很多前端的玩家,在刚开始使用Node.js连接sql并且使用的时候,会感觉相当繁琐,甚至是有些困难。
不用怕!TypeORM帮你解决关于一切关于操作sql的问题!
本篇文章只作一个安利作用,不详细描述TypeORM的使用,如有需要,请访问官网或者Gitee介绍
1.先看看效果
-
增
//在tag表中加入一条新记录 const insertOne = async (name: string,memo:string) => { try { let tag = new Tag(); tag.name = name; tag.memo = memo; await getConnection().manager.save(tag); return true; } catch (err) { return err; } };
-
删
//传入一个实体和id,删除这个实体(表)中id为传入值的记录 const deleteOne = async (entity, id: number) => { try { const repository = getRepository(entity); await repository.delete(id); return true; } catch (err) { return err; } };
-
改
//传入需要操作的实体(表),id,以及需要更新的参数 const updateOne = async (entity, id: number, params: object) => { try { const repository = getRepository(entity); let result = await repository.update(id, params); return true ; } catch (err) { return err; } };
-
查
//根据传入的实体(表)和id精确查询 const findOne = async (entity, id:number) => { try { const repository = getRepository(entity); let result = await repository.findOne(id); return result; } catch (err) { return err; } }; //根据传入的实体查询全部 const findAll = async (entity, relations: string[] = null) => { try { const repository = getRepository(entity); return await repository.find({ relations, //查表的时候把外键所在表的信息也查出来 order: { //根据createTime这个列来进行排序 createTime: "DESC" } }); } catch (err) { return err; } }; //分页查询 export const $_findPaginated = async ( entity, pageIndex, pageSize, relations: string[] = null ) => { try { const repository = getRepository(entity); return await repository.findAndCount({ skip: (pageIndex - 1) * pageSize,//跳过多少 take: pageSize,//取多少 relations, order: { createTime: "DESC" } }); } catch (err) { return err; } };
非常简单!!非常纯粹的js写法!!而且封装起来使用非常方便,上面列出的方法除了第一个(因个人项目原因未封装),其他的我都封装起来使用了,不用一遍一遍写sql拼接字符串啦,只需要调方法就可以啦~
2.什么是TypeORM
- 首先说说ORM
ORM(Object Relational Mapping)
框架采用元数据来描述对象与关系映射
的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。 - 意思就是我们可以通过
操作对象来操作数据库
- 而
TypeORM
呢,自然就是一款适用于Node.js的ORM
框架啦
3.如何通过操作对象来操作数据库
我们首先肯定要定义一种映射关系,告诉这个框架,我操作这个对象是要改哪个数据库,不然那就瞎JB
改了阿。
那么这种关系如何确定呢?
TypeORM使用了一个实体的概念(第一部分我的注释里也一直强调操作实体就是操作表),实体是一个映射到数据库表(或使用MongoDB时的集合)的类,如下所示
import { Entity, Column, PrimaryGeneratedColumn,CreateDateColumn,UpdateDateColumn } from "typeorm";
//下面使用了的列,别忘了在上面import噢
//一个照片实体,对应的数据库一个Photo表
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
//一个自增的并且是主键
id: number;
@Column({
length: 100
})
//长度限制为100的string列,对应数据库里就是varchar类型
name: string;
@Column("text")
//长度不限,对应数据库里就是text类型
description: string;
@Column()
//什么都不设置的时候需要注意!!会默认设置NOT NULL!插入时一定要设定这一字段的值
filename: string;
@column({
default:"默认值"
})
//如果设置了默认值,那么当插入的时候可以不设定这一值
memo:string
@Column("double")
//对应数据库里double类型
views: number;
@Column()
isPublished: boolean;
@CreateDateColumn()
//这个列会在插入的时候自动以当前时间赋值,更新时不改变值
createTime:string
@UpdateDateColumn()
//这个列会在插入和更新的时候以当前时间赋值
updateTime:string
//至于剩下的连表相关的列(@ManyToOne,@OneToMany,@ManyToMany),请在以上给出的两个网站中进行学习,博文字数有限,不作详细展开
}
显而易见的是,我们写好了以上的定义以后,数据库里就会生成一个表Photo
,这样我们就用js写好了一个创建表的sql语句!
id | name | description | fileName | memo | views | isPublished | createTime | updateTime |
---|---|---|---|---|---|---|---|---|
** | ** | ** | ** | ** | ** | ** | ** | ** |
4.操作实体(操作数据库)
当我们把项目搭建好,创建好实体以后呢,我们就可以通过操作实体来操作数据库啦!
操作实体有两种方法
- 使用实体管理器
EntityManager
- 使用储存库
Repository
这两个东西有什么区别呢?
emm,没什么不同。EntityManager
就像单个位置上所有实体存储库的集合一样。而Repository
虽然与EntityManager
类似,但是Repository
操作仅限于具体实体,所以Repository
需要传入实体
来创建!
如下
import "reflect-metadata";
import { getManager,getRepository } from "typeorm";
import {Photo} from "./entity/Photo"
let manager = getManager();
let repository = getRepository(Photo);
然后你就可以使用这两个玩意儿来为所欲为啦!
后语
本文只简单介绍了TypeORM的使用,如果要详细使用请查看官网噢。官方文档写得比较详细,虽然是英文的,但是右键翻译成中文
想来对大家也不是难事。
祝生活愉快
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。