久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

        手機(jī)站
        千鋒教育

        千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

        千鋒教育

        掃一掃進(jìn)入千鋒手機(jī)站

        領(lǐng)取全套視頻
        千鋒教育

        關(guān)注千鋒學(xué)習(xí)站小程序
        隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

        當(dāng)前位置:首頁  >  技術(shù)干貨  > 什么是ORMapping?

        什么是ORMapping?

        來源:千鋒教育
        發(fā)布人:qyf
        時(shí)間: 2022-10-10 16:59:14 1665392354

          ORM :對(duì)象關(guān)系映射(英語:Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping),用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換。

          O(面向?qū)ο? <-----> ORMapping <-----> R(面向關(guān)系)

          在數(shù)據(jù)庫層面, 尤其是關(guān)系型數(shù)據(jù)庫. 是沒有對(duì)象概念的.

          有的只是表格, 和數(shù)據(jù)記錄

        圖片34

          想象一下, 如果你在某個(gè)視頻網(wǎng)站, 為某個(gè)視頻寫了一條評(píng)論

          接下來會(huì)發(fā)生什么呢?

          我們要更改用戶表的記錄, 增加評(píng)論數(shù)

          用SQL語句進(jìn)行操作

          update t_user set .......

          可是我們平時(shí)都是面向?qū)ο缶幊痰?/p>

          從邏輯上講

          我們的代碼應(yīng)該是這樣寫的

          video.cmmt_cnt++;

          這樣就夠了嗎? 當(dāng)然不夠

          我們還需要增加評(píng)論表

        圖片35

          還不止這些

          如果這條評(píng)論被置頂了呢

          如果這條評(píng)論對(duì)其他人不可見呢?

          如果這條評(píng)論@了其他人呢

          如果這條評(píng)論被人點(diǎn)贊了呢

          只要稍微增加一點(diǎn)功能, 邏輯都會(huì)變得復(fù)雜很多

          一個(gè)看似簡單的添加評(píng)論, 其實(shí)背后并不簡單

          顯然操作數(shù)據(jù)庫, 跟實(shí)現(xiàn)業(yè)務(wù)邏輯采用的思維方式是不同的

          一個(gè)是面向關(guān)系, 處理好每張表的變化, 以及表之間的關(guān)聯(lián)

          一個(gè)是面向?qū)ο笏季S, 將每一條記錄看做一個(gè)對(duì)象去操作

          在沒有ORMapping之前, 程序員必須要自己搞定這二者復(fù)雜的關(guān)系轉(zhuǎn)換

          而有了ORMapping框架之后

          程序員的代碼, 大概就會(huì)變成這樣

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

          這樣就夠了, 面向?qū)ο蟮拇a, 將自動(dòng)轉(zhuǎn)換成對(duì)應(yīng)的SQL語句

          更新所有關(guān)聯(lián)的表格

          下面簡單介紹一個(gè)nodeJS里面的 ORMapping 框架的使用

          sequelize

          在nodejs中,有不少ORM模塊,他們各有特點(diǎn),這里的話我們選擇一個(gè)ORM(sequelize)進(jìn)行介紹。

          使用流程

          1. 在mysql中創(chuàng)建要操作的數(shù)據(jù)庫

          2. 安裝ORM模塊:sequelize 與 mysql2

          yarn add mysql2 sequelize -S

          3. 開始寫nodejs代碼進(jìn)行操作

          · 目錄結(jié)構(gòu)

        圖片36

          · 根目錄下創(chuàng)建 db.js文件,里面進(jìn)行連接數(shù)據(jù)庫

          const Sequelize = require("sequelize")

          var DB = new Sequelize(

          'w1902-1', // 數(shù)據(jù)庫名

          'root', // 用戶名

          '123456A', // 用戶密碼

          //數(shù)據(jù)庫配置對(duì)象

          {

          'dialect': 'mysql', // 數(shù)據(jù)庫使用mysql

          'host': 'localhost', // 數(shù)據(jù)庫服務(wù)器ip

          'port': 3306, // 數(shù)據(jù)庫服務(wù)器端口

          'define': {

          // 字段以下劃線(_)來分割(默認(rèn)是駝峰命名風(fēng)格)

          'underscored': true,

          'charset': 'utf8',

          'collate': 'utf8_general_ci',

          'freezeTableName': true,

          'timestamps': true, //為模型添加 createdAt 和 updatedAt 兩個(gè)時(shí)間戳字段

          },

          'pool': { //連接池

          'maxConnections': 20,

          'minConnections': 0,

          'maxIdleTime': 10000 // 連接最大空置時(shí)間(毫秒),超時(shí)后將釋放連接

          },

          }

          );

          module.exports = DB;

          · 根目錄下創(chuàng)建 model文件夾,表示映射各個(gè)表的模型如model/User.js

          // 要定義模型和表之間的映射,請(qǐng)使用define方法。 隨后Sequelize將自動(dòng)添加createdAt和updatedAt屬性。

          // 因此,您將能夠知道數(shù)據(jù)庫條目何時(shí)進(jìn)入數(shù)據(jù)庫以及最后一次更新時(shí)。

          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創(chuàng)建的表名稱會(huì)是復(fù)數(shù) users

          // 如果指定的表名稱本就是復(fù)數(shù)形式則不變

          freezeTableName: false

          }

          );

          // 創(chuàng)建表

          // User.sync() 會(huì)創(chuàng)建表并且返回一個(gè)Promise對(duì)象

          // 如果 force = true 則會(huì)把存在的表(如果users表已存在)先銷毀再創(chuàng)建表

          // 默認(rèn)情況下 forse = false

          User.sync({

          force: false

          });

          // 添加新用戶

          module.exports = User;

          · 根目錄下創(chuàng)建serve.js文件,在此文件中操作user表

          完整代碼

          var User = require('./model/User');

          //添加(創(chuàng)建)用戶(直接添加)

          function create() {

          // 添加用戶(直接添加)

          User.create({

          userId: 38,

          userName: '老王2',

          }).then(function(user) {

          console.log('****************************');

          console.log('添加結(jié)果為:', user._options.isNewRecord);

          }).catch(function(err) {

          console.log("出錯(cuò)了:", err);

          });

          }

          // 添加(創(chuàng)建)用戶 (先查詢?cè)谔砑?

          function findOrCreate() {

          // 添加用戶:此方法會(huì)先查詢,如果查詢到有此條數(shù)據(jù)相同的就不會(huì)新增,返回created:false,得到查詢結(jié)果

          User.findOrCreate({

          where: {

          userId: 38,

          userName: '老王9'

          }

          })

          .spread((test, created) => {

          if (created == false) {

          //說明數(shù)據(jù)已存在,添加失敗

          console.log("-------------數(shù)據(jù)已存在,添加失敗--------------");

          var data = test.get({

          plain: true

          });

          console.log("已存在的數(shù)據(jù)為:", data);

          } else {

          console.log("添加成功...");

          }

          }).catch(function(err) {

          console.log("出錯(cuò)了:", err);

          })

          }

          //查詢單條數(shù)據(jù)(根據(jù)任意字段)

          function find() {

          User.findOne({

          where: {

          userId: 38

          }

          })

          .then(function(user) {

          console.log('****************************');

          console.log("查詢的數(shù)據(jù)為:", user.dataValues);

          console.log('****************************');

          console.log('user userName: ', user.userName);

          console.log('user userName: ', user.userId);

          });

          }

          //查詢所有數(shù)據(jù)

          function findAll() {

          //查詢所有數(shù)據(jù)

          User.findAll()

          .then(data => {

          // 從結(jié)果集中取出所有數(shù)據(jù)

          var users = [];

          data.forEach(function(ele) {

          users.push(ele.dataValues)

          })

          console.log("所有的數(shù)據(jù)為:", users)

          })

          }

          //刪除數(shù)據(jù)

          function destroy() {

          User.destroy({

          where: {

          userId: 38

          }

          })

          .then(function(result) { //表示刪除的數(shù)據(jù)的條數(shù)

          console.log('共刪除數(shù)據(jù)條數(shù)為:', result);

          });

          }

          //修改數(shù)據(jù)

          function update() {

          User.update({

          userName: "張三"

          }, {

          where: {

          userId: 36

          }

          })

          .then(function(result) {

          console.log('共修改數(shù)據(jù)條數(shù)為:', result);

          })

          }

          //調(diào)用相關(guān)方法

          update()

          感受一下, 有了ORMapping框架之后, 操作數(shù)據(jù)庫有多簡單

        tags:
        聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
        10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
        請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
        免費(fèi)領(lǐng)取
        今日已有369人領(lǐng)取成功
        劉同學(xué) 138****2860 剛剛成功領(lǐng)取
        王同學(xué) 131****2015 剛剛成功領(lǐng)取
        張同學(xué) 133****4652 剛剛成功領(lǐng)取
        李同學(xué) 135****8607 剛剛成功領(lǐng)取
        楊同學(xué) 132****5667 剛剛成功領(lǐng)取
        岳同學(xué) 134****6652 剛剛成功領(lǐng)取
        梁同學(xué) 157****2950 剛剛成功領(lǐng)取
        劉同學(xué) 189****1015 剛剛成功領(lǐng)取
        張同學(xué) 155****4678 剛剛成功領(lǐng)取
        鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
        董同學(xué) 138****2867 剛剛成功領(lǐng)取
        周同學(xué) 136****3602 剛剛成功領(lǐng)取
        相關(guān)推薦HOT
        大數(shù)據(jù)測試工程師需要具備哪些技能?

        一、理解大數(shù)據(jù)概念大數(shù)據(jù)測試工程師需要理解大數(shù)據(jù)的基本概念和原理,如分布式存儲(chǔ)、MapReduce、實(shí)時(shí)計(jì)算等。他們還需要了解如何處理大規(guī)模的...詳情>>

        2023-10-14 23:43:03
        為什么SpringBoot的 jar 可以直接運(yùn)行?

        一、JAR文件的結(jié)構(gòu)與執(zhí)行方式Spring Boot的JAR包是Java Archive的縮寫,它是一種壓縮文件格式,可以將Java項(xiàng)目的類文件、資源文件以及依賴庫等...詳情>>

        2023-10-14 23:01:49
        站群服務(wù)器是什么?

        站群服務(wù)器的含義與用途站群服務(wù)器主要用于支持站群,即由一組相互鏈接的網(wǎng)站組成的群體。這些網(wǎng)站通常由同一組織或個(gè)人擁有,并且經(jīng)常會(huì)互相鏈...詳情>>

        2023-10-14 22:46:12
        自編碼器是什么?

        一、自編碼器原理自編碼器的設(shè)計(jì)靈感源于神經(jīng)科學(xué)中關(guān)于感知系統(tǒng)的認(rèn)知原理,它的核心思想是將輸入數(shù)據(jù)經(jīng)過編碼過程,形成一個(gè)隱藏層的特征表示...詳情>>

        2023-10-14 22:41:10
        什么是云網(wǎng)融合?

        一、云網(wǎng)融合的定義云網(wǎng)融合是指將云計(jì)算與網(wǎng)絡(luò)技術(shù)相結(jié)合,實(shí)現(xiàn)資源的共享、業(yè)務(wù)的協(xié)同,將網(wǎng)絡(luò)與云端服務(wù)深度融合,提供更靈活、高效、安全的...詳情>>

        2023-10-14 22:31:47
        阿尔山市| 瑞安市| 徐汇区| 南通市| 东源县| 长宁县| 玉树县| 宁武县| 晋中市| 聂拉木县| 浦县| 宁夏| 柳州市| 景谷| 东安县| 子长县| 三门县| 信宜市| 丹东市| 阿巴嘎旗| 潜江市| 上犹县| 浙江省| 抚州市| 花莲县| 和政县| 东乌珠穆沁旗| 武义县| 康乐县| 正安县| 东光县| 延庆县| 海伦市| 张家口市| 土默特右旗| 利津县| 宣城市| 屏边| 安丘市| 浦县| 衡山县|