摘要:技術廣義上,指的是面向對象的對象模型和關系型數據庫的數據結構之間的相互轉換。狹義上,可以被認為是,基于關系型數據庫的數據存儲,實現一個虛擬的面向對象的數據訪問接口。
數據庫隨筆 背景
目前軟件開發行業中,無論是移動端開發還是后端開發,基本上都會碰到數據庫的開發,這里就談談筆者對于數據庫的感想
沖突在移動端亦或是后端開發中,很多時候,我們會感覺到無論是 ORM 還是其他方案,都會存在著一些缺點,其實這來源于數據庫本身和開發語言本身的沖突,現代化的語言基本上都是面向對象開發,面向對象是從軟件工程基本原則(如耦合、聚合和封裝)的基礎上發展起來的,而關系數據庫則是從數學理論發展而來的,兩套理論存在顯著的區別。
數據庫最初的時候就是起源于文件,一個程序打開一個文件,然后將一些數據存入文件中,最后關閉文件,從這個需求開發,發展出了數據庫。目前主流關系型數據庫主要有兩種,一種是基于網絡傳輸的數據庫,一種則是嵌入式數據庫,這兩種數據庫區別就在于是否存在完善的權限管理和是否服務端代碼嵌入到了程序中。
無論是哪種關系型數據庫,開發者都是通過 SQL 語言和其打交道,主流的 ORM 技術實際上只是由數據庫中查詢數據,按條讀取結果集中每一個字段,然后裝配成對象,或者需要把對象的每一個屬性拆出來,拼湊成SQL字符串,再提交數據庫。
廣義上,ORM指的是面向對象的對象模型和關系型數據庫的數據結構之間的相互轉換。 狹義上,ORM可以被認為是,基于關系型數據庫的數據存儲,實現一個虛擬的面向對象的數據訪問接口。這里指的 ORM 是指 Hibernate 這樣的框架,至于 ORM 框架的好處就不說了,ORM 一般情況下,一個持久化類和一個表對應,類的每個實例對應表中的一條記錄,類的每個屬性對應表的每個字段。 但是,這本身 SQL 語言是存在沖突的,我們先來拆分一下要求
數據庫需要做 Migration(比如建表,增加字段,刪除字段,描述默認值,增加索引,增加約束等)
表和表通過關系產生聯系
SQL 語句可以讓你只選擇自己需要的列
SQL 語句參數和結果不保證類型安全
結果可能是虛的,比如存儲過程和視圖
面向對象和上面的行為實際上是格格不入的,比如將表抽象為一個類,每個類的實例是一行數據,看起來確實很完美,但是其實存在一個隱藏的缺陷。
首先,主要的數據庫操作,基本都是 CRUD 組成,一般來說,增加、刪除、更新語法都是差不多的,很容易將其抽象,但是查詢就不簡單了,對數據的關注度不一樣,所需要的查詢語句就不同,在針對查詢的方面,ORM 很難覆蓋全部的情況。
其次,面向對象中,存在著繼承,如果兩個對象存在繼承關系,那如何設計表結構,
目前的主流 ORM 技術有好多種,Hibernate 是一種比較典型的如上面所述的 ORM 技術,Mybatis 則是一種半自動化的 ORM 技術,這里講一講 Mybatis
Mybatis 不存在 Migration 功能,必須要通過第三方功能支持
Mybatis 只做了 SQL 到對象的映射,類本身不代表數據表,而轉化出的對象都以 POJO 的形式提供。這實際上是一種字段綁定
也就是說,ORM 本身,需要做兩件事
映射表的本身和遷移
屬性和數據庫的字段綁定
Mybatis 由于過于依賴 SQL,因此如果將底層數據庫進行替換,則會導致很大的遷移工作量,Hibernate 就不存在這個問題,但是 Hibernate 確實不夠靈活,剛才也講到了 SQL 查詢的問題,因此 Hibernate 如果要做到靈活,實在是代價太大了。兩者各有優缺點。
ORM 的意義ORM 主要有兩個意義
防止注入,保證 SQL 安全
抽象 OOP,便于開發
除了上面這兩種 ORM 以外,還有一種更加輕量級的技術方案,就是提供一整套類似于函數調用方式來寫 SQL 查詢,借助 IDE 的代碼提示和編譯器語法檢查,來保證安全,這種方案是靈活度最高的。但是更加繁瑣
在針對防注入方面,通常做法是使用綁定參數和預處理語句,避免字符串的拼接,或者采用手段,防止傳入的單引號提前截斷 SQL
由于數據庫查詢存在這么大的問題,而且需要保證 SQL 安全,筆者有兩條思路
封裝常用的操作,覆蓋大多數場景
提供安全的底層手段,解決特殊查詢情況
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/17639.html
摘要:最終給前端返回的數據格式如下賽冷思內容管理其他字段文章管理文章列表文章詳情隨筆管理添加修改隨筆大致思路就是這樣,回頭在實現的過程中發現不完善的,將會持續更新。最新更新在我的博客 權限是一塊設計挺繁瑣的功能,尤其是設計到前端SPA應用,前后端的耦合性太強,先屢屢思路,再實現,如果您有好的建議,也可評論留言。 基本的表結構如下 用戶表。user 字段 說明 id 用戶ID u...
摘要:你只可以看到在滑動窗口內的數字。滑動窗口每次只向右移動一位。返回滑動窗口最大值。 這篇文章我們來看一道題目求滑動窗口最大值問題(在leetcode上的地址:滑動窗口最大值) 題目描述 給定一個長度為N的數組 nums,有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口 k 內的數字。滑動窗口每次只向右移動一位。返回滑動窗口最大值。 示例: 輸入: nu...
閱讀 1155·2021-11-24 10:43
閱讀 3112·2021-11-22 09:34
閱讀 3552·2021-10-08 10:04
閱讀 3936·2021-09-23 11:58
閱讀 3119·2019-08-30 15:44
閱讀 489·2019-08-30 13:01
閱讀 1163·2019-08-28 18:07
閱讀 1452·2019-08-26 13:42