【nodejs】让nodejs像后端mvc框架(asp.net mvc)一orm篇【如EF般丝滑】typeorm介绍(8/8)
文章目录
前情概要
在使用nodejs开发过程中,刚好碰到需要做一个小工具,需要用到数据库存储功能。而我又比较懒,一个小功能不想搞一个nodejs项目,又搞一个后端项目。不如直接在nodejs里面把对数据库的操作也做掉。
结果百度一圈下来发现nodejs这边还都是比较原始的、类似后端的通过coneection连数据库,接着open,在写sql语句干嘛干嘛的。经过后端这么多年的脚手架工具熏陶,实在懒得写这些没营养的简单增删改查sql语句了。
typeorm github地址
typeorm github地址
遂通过baidu、google找到了typeorm这个orm框架。果然不错,作者自己也说大量参考了如entityframework、hibernate、dapper等等众多orm框架。吸收了各家之所长。
更多介绍和各种示例可以参考它的demo项目,基本每个数据库都有一个demo,然后对特性也基本都介绍到的。
比如mongodb如何映射复杂对象,关系型数据怎么弄级联删除之类的功能
使用总结
mysql、sqlite、mongodb3个数据库下都使用过,使用感觉虽然没有后端的orm那么强大,但是在nodejs领域内,orm我觉得它已经可以说是no.1啦。当然不排除我孤陋寡闻漏了更NB的其他框架。
绝大多数的后端orm该有的功能它都有,没有可能是没找到正确的使用方式。为此我还发过几条issue给开发者。基本上自己最后google找到解决方或者组件作者给与了回复。
基本功能介绍可以直接去GitHub看,基本上orm应该要有的功能它都有了。
typeorm 项目介绍
此项目github上的第一句介绍:
ORM for TypeScript and JavaScript (ES7, ES6, ES5). Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, WebSQL databases. Works in NodeJS, Browser, Ionic, Cordova and Electron platforms.
remark:
TypeORM is highly influenced by other ORMs, such as Hibernate, Doctrine and Entity Framework.
Some TypeORM features:
- supports both DataMapper and ActiveRecord (your choice)
- entities and columns
- database-specific column types
- entity manager
- repositories and custom repositories
- clean object relational model
- associations (relations)
- eager and lazy relations
- uni-directional, bi-directional and self-referenced relations
- supports multiple inheritance patterns
- cascades
- indices
- transactions
- migrations and automatic migrations generation
- connection pooling
- replication
- using multiple database connections
- working with multiple databases types
- cross-database and cross-schema queries
- elegant-syntax, flexible and powerful QueryBuilder
- left and inner joins
- proper pagination for queries using joins
- query caching
- streaming raw results
- logging
- listeners and subscribers (hooks)
- supports closure table pattern
- schema declaration in models or separate configuration files
- connection configuration in json / xml / yml / env formats
- supports MySQL / MariaDB / Postgres / SQLite / Microsoft SQL Server / Oracle / sql.js
- supports MongoDB NoSQL database
- works in NodeJS / Browser / Ionic / Cordova / React Native / NativeScript / Expo / Electron platforms
- TypeScript and JavaScript support
- produced code is performant, flexible, clean and maintainable
- follows all possible best practices
- CLI
And more...
个人的一些用法-mongodb
都是一些非常简单的封装,直接贴代码啦。
typeorm mongodb 初始化配置
比如数据库链接字符串,实体类,还有一些其他配置等等
InitMongoDb({
url: _appConfig.mongodb.url,
entities: ['bin/Entity/*.js'],
synchronize: true,
logging: false
});
export function InitMongoDb(dbName: string, mongoOptions: MongoConnectionOptions): void;
export function InitMongoDb(mongoOptions: MongoConnectionOptions): void;
export function InitMongoDb(): void {
var options: MongoConnectionOptions = arguments[0];
var dbName: any;
if (typeof arguments[0] === 'string') {
dbName = arguments[0];
options = arguments[1];
}
var dbName = dbName || 'default';
ManangerMongoConnection.ConnectOptions[dbName] = {
hasGetConnection: false,
options: options
};
}
typeorm mongodb repository管理器
export async function getMongoRepositoryAsync<Entity>(entityClass: ObjectType<Entity>): Promise<GDMongoRepository<Entity>>;
export async function getMongoRepositoryAsync<Entity>(entityClass: ObjectType<Entity>, dbName: string): Promise<GDMongoRepository<Entity>>
export async function getMongoRepositoryAsync<Entity>(): Promise<GDMongoRepository<Entity>> {
var entityClass = arguments[0] as ObjectType<Entity>;
var dbName = (arguments.length > 1 ? arguments[1] : undefined) || 'default';
var conn = await new ManangerMongoConnection().getConnection(dbName);
var repo = conn.getMongoRepository(entityClass);
var gdRepo = new GDMongoRepository(repo)
return gdRepo;
}
class ManangerMongoConnection {
static ConnectOptions: any = {};
async getConnection(dbName: string): Promise<Connection> {
var conf = ManangerMongoConnection.ConnectOptions[dbName];
if (!conf)
throw Error(`找不到(${dbName})的数据库配置`);
if (conf.hasCreated)
return conf.connection;
var options = conf.options as MongoConnectionOptions;
var conn = await createConnection({
type: 'mongodb',
url: options.url,
synchronize: options.synchronize,
logging: options.logging,
entities: options.entities
});
conf.connection = conn;
conf.hasCreated = true;
return conn;
}
}
typeorm mongodb repository 简单封装
import { ObjectType, FindManyOptions, MongoRepository, ObjectLiteral, Connection, createConnection, Entity, ObjectIdColumn, Column, ObjectID, getManager } from "typeorm";
import { ObjectId } from 'mongodb'
export class GDMongoRepository<TEntity extends ObjectLiteral> {
private _repo: MongoRepository<TEntity>;
constructor(repo: MongoRepository<TEntity>) {
this._repo = repo;
}
SaveAsync(docment: TEntity): Promise<TEntity> {
if (!docment.createdTime) docment.createdTime = new Date();
return this._repo.save(docment);
}
FindByIdAsync(id: number | string) {
return this._repo.findOneById(new ObjectId(id));
}
FindByIdsAsync(ids: number[] | string[]) {
var _id: ObjectId[] = [];
for (let index = 0; index < ids.length; index++) {
const element = ids[index];
_id.push(new ObjectId(element));
}
return this._repo.findByIds(_id);
}
FindAsync(optionsOrConditions?: FindManyOptions<TEntity> | Partial<TEntity> | ObjectLiteral): Promise<TEntity[]> {
return this._repo.find(optionsOrConditions)
}
CountAsync(optionsOrConditions?: FindManyOptions<TEntity> | Partial<TEntity> | ObjectLiteral): Promise<number> {
var query: any = Object.assign({}, optionsOrConditions);
if (query.take) delete query.take;
if (query.skip) delete query.skip;
if (query.order) delete query.order;
query = query.where || query;
return this._repo.count(query)
}
FindAndCount(optionsOrConditions?: FindManyOptions<TEntity> | Partial<TEntity>): Promise<[TEntity[], number]> {
return this._repo.findAndCount(optionsOrConditions)
}
AggregateAsync(pipeline: ObjectLiteral[]): Promise<TEntity[]> {
return this._repo.aggregate(pipeline).toArray()
}
async RemoveByIdAsync(id: number | string): Promise<number> {
var r = await this._repo.deleteOne({ _id: new ObjectId(id) });
if (r.deletedCount)
return r.deletedCount
return 0;
}
async RemoveAsync(conditions: ObjectLiteral): Promise<number> {
var r = await this._repo.deleteMany(conditions);
if (r.deletedCount)
return r.deletedCount
return 0;
}
async UpdateByIdAsync(id: number | string, update: ObjectLiteral | Partial<TEntity>): Promise<number> {
if (update.$set || update.$unset || update.$rename) { }
else {
update = { $set: update }
}
update.$set.lastModifyTime = new Date();
var r = await this._repo.updateOne({ _id: new ObjectId(id) }, update);
return r.modifiedCount;
}
async UpdateAsync(query: FindManyOptions<TEntity> | Partial<TEntity> | ObjectLiteral, update: ObjectLiteral | Partial<TEntity>): Promise<number> {
if (update.$set || update.$unset || update.$rename) { }
else {
update = { $set: update }
}
update.$set.lastModifyTime = new Date();
var r = await this._repo.updateMany(query, update);
return r.modifiedCount;
}
}
一些简单的使用例子
public async list() {
var repo = await getMongoRepositoryAsync(Host);
var b = await repo.FindAsync();
return b
}
public async info() {
var repo = await getMongoRepositoryAsync(Host);
var b = await repo.FindAsync({ Ip: this.request.query.ip, HostEnv: this.request.query.env });
return b
}
给开源项目点赞!给国际友人点赞!
【nodejs】让nodejs像后端mvc框架(asp.net mvc)一orm篇【如EF般丝滑】typeorm介绍(8/8)的更多相关文章
- 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理
第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实现方式,创建数据访问层和数据入口,处理Post数据,以及数据验证等功能. 系列文章 七天学会ASP.NET M ...
- 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理 【转】
http://www.cnblogs.com/powertoolsteam/p/MVC_three.html 第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实 ...
- 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递
通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容.本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MV ...
- 【MVC】ASP.NET MVC Forms验证机制
http://www.cnblogs.com/bomo/p/3309766.html 随笔 - 121 文章 - 0 评论 - 92 [MVC]ASP.NET MVC Forms验证机制 ASP. ...
- 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性
[索引页][源码下载] 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 5.0 新 ...
- asp.net mvc ,asp.net mvc api 中使用全局过滤器进行异常捕获记录
MVC下的全局异常过滤器注册方式如下:标红为asp.net mvc ,asp.net mvc api 注册全局异常过滤器的不同之处 using SuperManCore; using System. ...
- 返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller
原文:返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller [索引页][源码下载] 返璞归真 asp.net mvc (7) - asp.net ...
- 返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model
原文:返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model [索引页][源码下载] 返璞归真 asp.net mvc (8) - asp.net mvc ...
- 返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性
原文:返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性 [索引页][源码下载] 返璞归真 asp.net mvc (12) - asp.net mvc ...
随机推荐
- python第七天-作业[购物车]
作业要示: 购物车程序:启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表允许用户根据商品编号购买商品用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出 ...
- LDAP Filter用法
#根据Pager过滤域用户 $pagers = gc D:\Operations\tmp\u.txt foreach ($p in $pagers) { $user = Get-ADUser -Fil ...
- [MapReduce_1] 运行 Word Count 示例程序
0. 说明 MapReduce 实现 Word Count 示意图 && Word Count 代码编写 1. MapReduce 实现 Word Count 示意图 1. Map:预 ...
- awk实战演示
awk:报告生成器,格式化文本输出. 我们一般使用的awk命令其实就是gawk,在centos7系统下,awk是gawk的链接文件. 基本用法:gawk [options] 'program' FI ...
- gcc库链接
转载于https://blog.csdn.net/zhangdaisylove/article/details/45721667 1.库的分类 库有静态库和动态库,linux下静态库为.a,动态库为. ...
- C++基础算法学习——汉洛塔问题
汉诺塔问题古代有一个梵塔,塔内有三个座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图).有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中, ...
- Spring容器技术内幕之内部工作机制
引言 Spring容器就像一台构造精妙的机器,我们通过配置文件向机器传达控制信息,机器就能够按照设定的模式工作.如果将Spring容器比作一辆车,那么可以将BeanFactory看成汽车的发动机,而A ...
- <20180930>故障解决记录Cisco RV系列低端路由
故障描述: 今日网络瘫痪 , 浏览器提示报 DNS出错, 故障现象: 网关能正常分配到IP但内网机器却无法上网. 其中一个WiFi设备竟然还可以通讯(聊天工具)! 故障思路和排查: 1.1 怀疑是上次 ...
- java中的深复制和浅复制
Java 语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能通过简单 的赋值来解决对象复制的问题,在开发过程中,也 ...
- Component name与package name/class name的关系?
谢谢,那就是component name是package name + activity name?那class name呢?是.java中定义的class MyClass ???