什么是ORMapping?

ORM :对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),用于实现面向对象编程语言里不同类型系统的数据之间的转换。

O(面向对象) <-----> ORMapping <-----> R(面向关系)

在数据库层面, 尤其是关系型数据库. 是没有对象概念的.

有的只是表格, 和数据记录

想象一下, 如果你在某个视频网站, 为某个视频写了一条评论

接下来会发生什么呢?

我们要更改用户表的记录, 增加评论数

用SQL语句进行操作

update t_user set .......

可是我们平时都是面向对象编程的

从逻辑上讲

我们的代码应该是这样写的

video.cmmt_cnt++;

这样就够了吗? 当然不够

我们还需要增加评论表

还不止这些

如果这条评论被置顶了呢

如果这条评论对其他人不可见呢?

如果这条评论@了其他人呢

如果这条评论被人点赞了呢

只要稍微增加一点功能, 逻辑都会变得复杂很多

一个看似简单的添加评论, 其实背后并不简单

显然操作数据库, 跟实现业务逻辑采用的思维方式是不同的

一个是面向关系, 处理好每张表的变化, 以及表之间的关联

一个是面向对象思维, 将每一条记录看做一个对象去操作

在没有ORMapping之前, 程序员必须要自己搞定这二者复杂的关系转换

而有了ORMapping框架之后

程序员的代码, 大概就会变成这样

video.addComment(new Comment(......));

这样就够了, 面向对象的代码, 将自动转换成对应的SQL语句

更新所有关联的表格

下面简单介绍一个nodeJS里面的 ORMapping 框架的使用

sequelize

在nodejs中,有不少ORM???,他们各有特点,这里的话我们选择一个ORM(sequelize)进行介绍。

使用流程

1. 在mysql中创建要操作的数据库
2. 安装ORM??椋簊equelize 与 mysql2

 yarn add mysql2 sequelize -S

3. 开始写nodejs代码进行操作

  • 目录结构
image
  • 根目录下创建 db.js文件,里面进行连接数据库
const Sequelize = require("sequelize")
var DB = new Sequelize(
    'w1902-1', // 数据库名  
    'root', // 用户名  
    '123456A', // 用户密码 
    //数据库配置对象
    {
    'dialect': 'mysql', // 数据库使用mysql 
    'host': 'localhost', // 数据库服务器ip  
    'port': 3306, // 数据库服务器端口  
    'define': {
        // 字段以下划线(_)来分割(默认是驼峰命名风格)  
        'underscored': true,
        'charset': 'utf8',
        'collate': 'utf8_general_ci',
        'freezeTableName': true,
        'timestamps': true, //为模型添加 createdAt 和 updatedAt 两个时间戳字段
    },
    'pool': { //连接池
        'maxConnections': 20,
        'minConnections': 0,
        'maxIdleTime': 10000 // 连接最大空置时间(毫秒),超时后将释放连接
    },
    }
);
module.exports = DB;

  • 根目录下创建 model文件夹,表示映射各个表的模型如model/User.js
// 要定义模型和表之间的映射,请使用define方法。 随后Sequelize将自动添加createdAt和updatedAt属性。 
// 因此,您将能够知道数据库条目何时进入数据库以及最后一次更新时。
var Sequelize = require('sequelize');
var DB = require('../DB');

var User = DB.define(
    'user', //模型名
    {
        userId: {
            field: 'user_id',
            primaryKey: true,
            type: Sequelize.BIGINT,
            allowNull: false
        },
        userName: {
            field: 'user_name',
            type: Sequelize.STRING,
            allowNull: false
        },
    }, {
        // 如果为 true 则表的名称和 model 相同,即 user
        // 为 false MySQL创建的表名称会是复数 users
        // 如果指定的表名称本就是复数形式则不变
        freezeTableName: false
    }
);
// 创建表
// User.sync() 会创建表并且返回一个Promise对象
// 如果 force = true 则会把存在的表(如果users表已存在)先销毁再创建表
// 默认情况下 forse = false
User.sync({
    force: false
});
// 添加新用户
module.exports = User;

  • 根目录下创建serve.js文件,在此文件中操作user表

完整代码

var User = require('./model/User');
//添加(创建)用户(直接添加)
function create() {
    // 添加用户(直接添加)
    User.create({
        userId: 38,
        userName: '老王2',
    }).then(function(user) {
        console.log('****************************');
        console.log('添加结果为:', user._options.isNewRecord);
    }).catch(function(err) {
        console.log("出错了:", err);
    });
}
// 添加(创建)用户 (先查询在添加)
function findOrCreate() {
    // 添加用户:此方法会先查询,如果查询到有此条数据相同的就不会新增,返回created:false,得到查询结果
    User.findOrCreate({
            where: {
                userId: 38,
                userName: '老王9'
            }
        })
        .spread((test, created) => {
            if (created == false) {
                //说明数据已存在,添加失败
                console.log("-------------数据已存在,添加失败--------------");
                var data = test.get({
                    plain: true
                });
                console.log("已存在的数据为:", data);
            } else {
                console.log("添加成功...");
            }
        }).catch(function(err) {
            console.log("出错了:", err);
        })
}
//查询单条数据(根据任意字段)
function find() {
    User.findOne({
            where: {
                userId: 38
            }
        })
        .then(function(user) {
            console.log('****************************');
            console.log("查询的数据为:", user.dataValues);
            console.log('****************************');
            console.log('user userName: ', user.userName);
            console.log('user userName: ', user.userId);
        });
}
//查询所有数据
function findAll() {
    //查询所有数据
    User.findAll()
        .then(data => {
            // 从结果集中取出所有数据
            var users = [];
            data.forEach(function(ele) {
                users.push(ele.dataValues)
            })
            console.log("所有的数据为:", users)
        })
}
//删除数据
function destroy() {
    User.destroy({
            where: {
                userId: 38
            }
        })
        .then(function(result) { //表示删除的数据的条数
            console.log('共删除数据条数为:', result);
        });
}
//修改数据
function update() {
    User.update({
            userName: "张三"
        }, {
            where: {
                userId: 36
            }
        })
        .then(function(result) {
            console.log('共修改数据条数为:', result);
        })
}
//调用相关方法
update()

感受一下, 有了ORMapping框架之后, 操作数据库有多简单

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351