C 資料操作系列 4 自己實現乙個ORM

2021-10-13 02:14:42 字數 3253 閱讀 4628

前言

在之前的幾篇內容中,我們了解了如何通過ado.net 訪問資料庫,如何修改、新增資料。如何通過dataset和dataadapter獲取資料,我們將在這一篇試試自己實現乙個簡單的orm框架或者說orm工具類。

涉及到的知識點:

反射(初級)

ado.net 已有知識

在c#中,曾經entity framework光芒萬丈,遮蓋了其他orm框架的光輝(甚至如今都是如此)。

後來慢慢湧現除了其他的一些orm框架,進一步豐富了市場。所以現有比較流行的大概有以下幾種:

這一篇的主要目的不是介紹這些框架(這是以後的內容),而是通過我們自己實現乙個類orm框架來了解底層核心。

設計我們先分析一下,如果我們設計乙個實體物件與資料庫之間轉換的工具類應該具有哪些功能?

乙個屬性與資料庫欄位的對映關係

增刪改查的sql模板

查詢結果與物件的轉換

3. 實現

首先,宣告乙個類,因為不能僅支援一種型別,所以這個類的所有與資料庫有關的方法都是泛型方法,或者這個類是泛型類,所以定義為泛型類:

public

class

ormutil

我們事先約定類名即表名,屬性名即表的列名,所以我們可以快速得到以下內容:

/// 

/// t的型別例項

///

private

type dtype;

///

/// t的屬性表

///

private propertyinfo[

] properties;

public

ormutil()

宣告乙個資料庫連線:

public sqlconnection connection

建立乙個私有方法,檢查連線是否可用:

/// 

/// 檢查連線是否可用

///

///

private

bool

checkconnection()

準備工作完成,然後開始編寫具體的業務方法:

insert:

public

intinsert

(t entity)

()";

var values = properties.

select

(p =

> p.

getvalue

(entity));

var commandtext = $" values('')"

;var command = connection.

createcommand()

; command.commandtext = commandtext;

var result = command.

executenonquery()

;return result;

}

首先按照屬性名與列名之間的對映拼接 sql,然後執行sql命令。

update:

public

intupdate

(t entity,

string keyname,

object keyvalue)'")

;var setsql =

string

.join

(","

, setvalues.

select

(pair=

>$"=''"))

;var sql = $"update set where = ''"

;var command = connection.

createcommand()

; command.commandtext = sql;

return command.

executenonquery()

;}

update需要注意的就是如何正確拼接賦值sql。

delete:

刪除滿足條件的物件:

public

intdelete

(t entity)

= ''");

var sql = $"delete from where "

;var command = connection.

createcommand()

; command.commandtext = sql;

return command.

executenonquery()

;}

這裡寫法有時候根據實際業務不同,大多數情況下刪除主鍵對應的元素,或者滿足某乙個條件的所有元素。這裡只是做了個演示,小夥伴們可以試試自己改造一下。

search:

先建立乙個從datatable轉成物件的工具方法:

private list

convert

(datatable table)

list.

add(entity);}

return list;

}

好,我們寫乙個查詢方法:

public list

searchall()

", connection)

;var

set=

newdataset()

; adapter.

fill

(set);

return

convert

(set

.tables[0]

);}

這樣乙個簡單的orm框架就這樣vb.net教程形成雛形了,當然實際上的orm底層比這複雜,因為需要支援不同的資料庫,所以connection 就不能簡簡單單的是乙個sqlconnection了,或者底層不是像我們一樣取巧使用datatable了。

實際上的datatable到類物件的轉換要比我寫的c#教程複雜一點,因為還要判斷這個屬性是否是可讀、可寫的。

總結在這裡我做了個拋磚引玉,帶領小夥伴們一起構思了乙個簡陋的orm框架,也讓大夥對此有了一定的印象。嗯,今天就到這了。同時ado.net 也告一段落了,接下來就是上entity framework了。當然,dataset、dataadapter這兩個類並沒有講完。這部分內容可能會在後續的番外篇內補全。

自己實現乙個Redux。

redux是乙個用於狀態管理的js框架,是flux架構的一種實現 如圖 reducer 為乙個使用者自定義的函式,在store分發 dispacth action時提供處理方法去更新狀態樹中的狀態。應該為乙個純函式。action 為乙個使用者自定義的物件,裡面包含乙個type屬性,標識乙個動作型別。...

C 自己實現的乙個testSuite 框架

前言 c 整合的unit test框架常用的是boost和cpptest,更多的是在測試語法對否。而我需要的單元測試是針對功能而言,旨在檢測該函式的計算結果是否正確。為了方便新增並維護後續的unit test,自己實現了乙個簡易的unit test框架。該框架主要有基類 派生類和suite類。基類是...

C語言自己手動實現乙個棧

include include define stack init size 100 儲存空間的初始分配 define stack increment 10 儲存空間分配增量 typedef structstack void init stack stack s 構造乙個空棧 void destro...