首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

反射學習系列 2-特性 (四) ORM 實戰完整代碼

     編輯:關於C語言

ORMHelper 實作

利用特性與反射,將物件自動轉換為 SQL INSERT 語句:

public class ORMHelp
{
    public void Insert(object table)
    {
        Type type = table.GetType();
        var columValue = new Dictionary();
        var sql = new StringBuilder("insert into ");

        // 取得 TableAttribute 指定的資料表名
        var tableAttr = (TableAttribute)type.GetCustomAttributes(false).First();
        sql.Append(tableAttr.TableName).Append("(");

        // 遍歷屬性,尋找 ColumAttribute
        foreach (var prop in type.GetProperties())
        {
            foreach (var attr in prop.GetCustomAttributes(false))
            {
                var colum = attr as ColumAttribute;
                if (colum != null)
                {
                    var value = type.InvokeMember(prop.Name,
                        BindingFlags.GetProperty, null, table, null).ToString();
                    columValue.Add(colum.ColumName, value);
                }
            }
        }

        // 拼接欄位與值
        foreach (var kv in columValue) sql.Append(kv.Key).Append(",");
        sql.Remove(sql.Length - 1, 1).Append(") values('");
        foreach (var kv in columValue) sql.Append(kv.Value).Append("','");
        sql.Remove(sql.Length - 2, 2).Append(")");

        Console.WriteLine(sql.ToString());
        // 輸出範例: insert into User(userID,UserName) values('1','lfm')
    }
}

前端使用

static void Main()
{
    var orm = new ORMHelp();
    var user = new User { UserID = 1, UserName = "lfm" };
    orm.Insert(user);
}

關鍵點

  • 特性標記實體類別與屬性對應的資料表/欄位名稱。
  • 反射取得特性實例與屬性值,動態組裝 SQL。
  • 此為簡化示範,實際 ORM 框架需處理參數化、型別映射、關聯、事務等複雜問題。

本文配套原始碼可供下載參考。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved