如何優雅地操做數據庫?ORM瞭解一下

寫做不易,未經做者容許禁止以任何形式轉載!
若是以爲文章不錯,歡迎關注、點贊和分享!
持續分享技術博文,關注微信公衆號 👉🏻 前端LeBron前端

什麼是ORM

img

對象關係映射(Object Relational Mapping,簡稱ORM),是一種程序技術,實現面向對象編程語言中的內存對象與關係型數據庫中的業務實體之間的關係映射。這樣在咱們操做數據庫的時候,再也不須要和複雜的SQL語句打交道,只須要簡單地操做對象的屬性和方法就能夠直接實現對數據庫中對應實體表的CRUD(增刪改查)的操做。常見的ORM框架有Node.js 的TypeOrm、Sequlize,Java的Hibernate、Mybatis和Go的Gorm、GoRose等。git

  • ORM的方法論基於三個核心原則github

    • 簡單:以最基本的形式建模數據
    • 傳達性:數據庫結構被任何人都能理解的語言文檔化
    • 精確性:基於數據模型建立正確、標準化的結構

爲何會出現ORM

面向對象編程語言和關係型數據庫都是目前最流行的技術,但他們的模型是不同的。web

  • 幾乎全部的程序裏面,都存在對象和關係數據庫。在業務邏輯層和用戶界面層中,咱們是面向對象的。當對象信息發生變化的時候,咱們須要把對象的信息保存在關係數據庫中。
  • 以 MVC 分層模式爲例。Model 做爲數據承載實體,在用戶界面和業務邏輯層之間,數據以面向對象的形式傳遞;而當咱們須要經過 Controller 分發請求把數據持久化的時候,咱們就遇到了內存中的對象如何持久化成關係數據庫中存儲的一條實際數據記錄的問題。
  • 面向對象是從軟件工程的基本原則,即封裝,繼承,多態的基礎上發展起來的;而關係型數據庫則是從數學理論的基礎上發展起來的,二者之間是不匹配的。全部就出現了 ORM 以項目中間件的形式實現數據在不一樣場景下的數據關係映射。。而對象關係映射就是這樣一種爲了解決面向對象與關係數據庫存在的互不匹配的現象的技術。在其基礎上誕生不少對象和關係之間的映射框架,也即ORM技術。

ORM的使用 以Sequelize爲例

僅示例,更多操做可參考sql

Sequelize 是一個基於 Promise 的 Node.js ORM, 目前支持 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 它具備強大的事務支持, 關聯關係, 預讀和延遲加載,讀取複製等功能。typescript

Sequelize 聽從 語義版本控制。 支持 Node v10 及更高版本以便使用 ES6 功能。數據庫

鏈接數據庫

  • 設置使用sequlize插件,並配置要鏈接的數據庫

定義Model

經過面向對象Class 和 關係型數據庫的表創建鏈接編程

@Column 表示數據庫的一列緩存

@PrimaryKey 表示主鍵微信

import {
  Column,
  Model,
  PrimaryKey,
  Table,
} from '@gulu/sequelize/typescript';
​
enum GameType {
  micro_game = 'micro_game',
  mobile_game = 'mobile_game',
  micro_app = 'micro_app',
}
​
@Table({ modelName: 'game', timestamps: false })
export default class GameModel extends Model {
  @PrimaryKey
  @Column
  gameId!: string;
  @Column
  name!: string;
  @Column
  description?: string;
  @Column
  type!: GameType;
  @Column
  icon?: string;
  @Column
  isDelete!: number;
}
複製代碼

操做數據庫

經過Model的方法操做數據庫

import GameModel from '../model/game';
​
// 遊戲列表查詢服務
async query() {
  return GameModel.findAll({
    // 去除軟刪除字段
    attributes: {
      exclude: ['isDelete'],
    },
    // 查詢未被軟刪除的遊戲
    where: {
      isDelete: 0,
    },
  });
}
複製代碼

至關於如下SQL語句

select gameId, name, description, type, icon from game where isDelete = 0;
複製代碼

固然Sequlize也支持SQL語句查詢

import GameModel from '../model/game';
​
// 遊戲列表查詢服務
async query() {
  return GameModel.sequelize.query(
      'select gameId, name, description, type, icon from game where isDelete = 0',
  );
}
複製代碼

ORM的優缺點

優勢

  1. 隱藏了數據訪問的細節,「封閉」的通用數據庫交互是ORM的核心。他使得咱們的通用數據庫交互變得簡單易行,而且徹底不用考慮SQL語句。
  2. 開發效率更高,ORM使咱們構造固化數據變得簡單易行,在ORM誕生前,咱們須要見過咱們的對象模型轉化爲一條一條的SQL語句,經過直連或者是DB helper在關係數據庫構造咱們的數據庫體系。而如今,基本上全部的ORM框架都提供了經過對象模型構造關係數據庫結構的功能。
  3. 數據訪問更抽象、輕便,支持面向對象封裝。數據模型都在一個地方定義,更容易更新和維護,也利於重用代碼
  4. ORM有現成的工具,不少功能均可以自動完成,好比數據消毒、預處理、事務等等。
  5. 它迫使你使用MVC架構,ORM就是自然的Model,最終使代碼更清晰。
  6. 基於ORM的業務代碼比較簡單,代碼量少,語義性好,容易理解。
  7. 防範SQL注入攻擊
  8. 沒必要編寫性能不佳的SQL。

缺點

  1. 無可避免的,自動化意味着映射和關聯管理,代價是犧牲性能。如今的各類ORM框架都在嘗試使用各類方法來減輕性能上的損失,如懶加載技術、緩存技術等。
  2. 面向對象的查詢語言做爲一種數據庫與對象之間的過渡,雖然隱藏了數據層面的業務抽象,但並不能徹底屏蔽數據庫層的設計。ORM庫也不是輕量級的工具,須要花不少精力學習和設置,無疑將增長學習成本。
  3. ORM難以實現過於複雜的查詢。雖然能夠實現,可是須要花費很大的代價(性能不如原生SQL)。
  4. 持久化層缺少彈性,一旦出現業務需求變動,就必須修改持久化層的接口
  5. 持久化層同時與域模型與關係數據庫模型綁定,無論域模型仍是關係數據庫模型發生變化,都要修改持久化層相關程序代碼,增長了軟件的維護難度。

什麼是「持久化」 層

  • 持久(Persistence),即把數據(如內存中的對象)保存到可永久保存的存儲設備中(如磁盤)。持久化的主要應用是將內存中的數據存儲在關係型的數據庫中,固然也能夠存儲在磁盤文件中、XML數據文件中等等。
  • 總結:當下ORM的開發模式是主流,提升了代碼的封裝性和可讀性,同時防範了SQL注入攻擊。以較小量級的性能損失換來了明顯的開發效率提高,明顯的性能損失每每存在於複雜的查詢,這種狀況能夠選擇使用ORM提供的SQL語句接口進行查詢以優化性能。

相關文章
相關標籤/搜索