有沒有覺得 SQL 的語法很麻煩,不同的資料庫有不同的 SQL 語法,對資料庫不外乎進行新增、查詢、編輯、刪除,有甚麼方法可以降低程式與資料庫之間的耦合關係或者簡化 SQL 的語法嗎? 有的,它就是所謂的 ORM。
甚麼是 ORM
Object-Relational Mapping (ORM)是將關聯式資料庫映射至物件導向的資料抽象化技術,對這個物件進行新增、查詢、編輯、刪除,底層的實作會使用相對應的 SQL 語法去操作資料庫。此時程式設計師不用再去管料庫是使用哪一種類型(如:SQL Server、Oracle、DB2、MySQL、Sybase...),同一套語法便可以了,這便是因為 ORM 為程式設計師還有資料庫之間搭起了一道橋樑。
也許這麼想 ORM 會更好,它就像一個翻譯,原本你必須會資料庫的語言,用資料庫的語言跟資料庫溝通,但有了 ORM,你可以將需求用你熟悉的物件導向程式語言告訴 ORM,ORM 再用資料庫的語言將你的請求翻譯給資料庫。
ORM 的優點
- ORM 可以防止 SQL-Injection 的攻擊
- 方便轉移資料庫,當資料庫發生改變時,只需要修改映射關係即可
- 不用考慮該死的 SQL 語句,語法簡化
- 通用性:
舉例來說下面這兩個 MySQL、MsSQL 的語法做的其實是一樣的事情
// MySQL
SELECT * FROM Menu WHERE price=100 LIMIT 10
// MsSQL
SELECT TOP 10 * FROM TestTable WHERE price=100
ORM 的缺點
- 對於複雜的查詢,ORM 的使用上支援度不好,可能還要額外寫入原生的 SQL 語法。
- 延伸上一個缺點,使用 ORM 的使用者在需要用到 SQL 語法的時候經常不熟練。
看到一個有趣的關於 Ruby 案例是這樣子的,這便是額外使用原生 SQL 語法的案例。
User.where(“age between ? and ?”,10,30)