日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自己动手写ORM框架(六):实现查询功能FindById方法

發(fā)布時間:2025/3/17 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自己动手写ORM框架(六):实现查询功能FindById方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??? 通過配置實(shí)體與表的關(guān)系映射后,就可以實(shí)現(xiàn)對表的操作了,接下來實(shí)現(xiàn)簡單對象的新增功能。下面代碼1-1是定義的操作數(shù)據(jù)對象方法的接口:

using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.SqlClient;System.Orm.EntityManager {public {Transaction { get; set; } <T> FindAll<T>() where T : (); ? <T> FindBySql<T>( strSql) where T : (); ? <T> FindById<T>( id) where T : (); int Save<T>(T entity);int Update<T>(T entity);int Remove<T>(T entity);int Remove<>( id) where : ();} }

??? 下面先實(shí)現(xiàn)比較簡單的查詢方法,代碼1-2:

using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Orm.CustomAttributes; using System.Data.SqlClient; using System.Collections; using System.Data; using System.Orm.DBUtility; using System.Orm.Common;namespace System.Orm.EntityManager {public class : {//......實(shí)現(xiàn)EntityManager接口... } }

??? 下面是PropertyImpl 類中FindById方法的代碼1-3:

通過主鍵ID查詢數(shù)據(jù) public <T> FindById<T>(object id) : new() {<T> listArr = new <T>();? ? type = ().GetType();? [] properties = .GetProperties(type); tableInfo = .GetTableInfo(type, .SELECT); String strSql = .GetFindByIdSql(tableInfo); [] parms = .CreateDbParameters(1);parms[0].ParameterName = tableInfo.Id.Key;parms[0].Value = id; sdr = null;try{ sdr = .ExecuteReader(.ConnectionString, .Text, strSql, parms); while (sdr.Read()){ entity = new ();foreach ( property in properties){ name = tableInfo.PropToColumn[property.Name].ToString(); .SetPropertyValue(entity, property, sdr[name]);} listArr.Add(entity);}}catch ( ex){throw ex;}finally{if (sdr != null) sdr.Close();}return listArr; } ?

??? 1-3中第一行代碼:TableInfo tableInfo = DbEntityUtils.GetTableInfo(entity,DbOperateType.SELECT);

將實(shí)體對象和操作類型傳入DbEntityUtils.GetTableInfo方法中,下面是GetTableInfo代碼1-4:

public static GetTableInfo(object entity, dbOpType) { bool breakForeach = false; string strPrimaryKey = string.Empty; type = entity.GetType(); tableInfo = new ();tableInfo.TableName = GetTableName(type); [] properties = .GetProperties(type);foreach ( property in properties){object propvalue = null; string columnName = string.Empty; string propName = columnName = property.Name; if(dbOpType != .SELECT)propvalue = .GetPropertyValue(entity, property); object[] propertyAttrs = property.GetCustomAttributes(false);for (int i = 0; i < propertyAttrs.Length; i++) {object propertyAttr = propertyAttrs[i]; if (.IsCaseColumn(propertyAttr, dbOpType))break; string tempName = GetColumnName(propertyAttr); columnName = tempName == string.Empty ? propName : tempName; if (propertyAttr is ){if (dbOpType == .INSERT){ if (.IsNullOrEmpty(propvalue)){

????????????????????????????????????? //獲取主鍵生成方式,存入tableInfo.Strategy屬性中

????????????????????????????????????? IdAttribute idAttr = propertyAttr as IdAttribute;
????????????????????????????????????? tableInfo.Strategy = idAttr.Strategy;

? strPrimaryKey = .GetPrimaryKey(propertyAttr);if (!string.IsNullOrEmpty(strPrimaryKey))propvalue = strPrimaryKey;}} tableInfo.Id.Key = columnName;tableInfo.Id.Value = propvalue; tableInfo.PropToColumn.Put(propName, columnName); breakForeach = true} }? if (breakForeach) { breakForeach = false; continue; } tableInfo.Columns.Put(columnName, propvalue); tableInfo.PropToColumn.Put(propName, columnName);} return tableInfo; }

??? 在代碼1-3中用到了獲取實(shí)體對象中自定義屬性所配置的表名、列名代碼分別為1-5:

public static string GetTableName( classType) { string strTableName = string.Empty;string strEntityName = string.Empty;strEntityName = classType.FullName;object classAttr = classType.GetCustomAttributes(false)[0];if (classAttr is ){tableAttr = classAttr as ;strTableName = tableAttr.Name;}if (string.IsNullOrEmpty(strTableName)){throw new ("實(shí)體類:" + strEntityName + "的屬性配置[Table(name=\"tablename\")]錯誤或未配置");}return strTableName; }

??? 上面是獲取表名,下面這段代碼是獲取列名,如下代碼1-6:

public static string GetColumnName(object attribute) {string columnName = string.Empty;if (attribute is ){columnAttr = attribute as ;columnName = columnAttr.Name;}if (attribute is ){idAttr = attribute as ;columnName = idAttr.Name;}return columnName; }

1-3中第二行代碼:String strSql = DbEntityUtils.GetFindByIdSql(tableInfo);
根據(jù)已經(jīng)存入表信息的對象tableInfo來生成SQL語句,代碼1-7:

public static GetFindByIdSql( tableInfo) {sbColumns = new ();if (tableInfo.Columns.ContainsKey(tableInfo.Id.Key)) tableInfo.Columns[tableInfo.Id.Key] = tableInfo.Id.Value;elsetableInfo.Columns.Put(tableInfo.Id.Key, tableInfo.Id.Value); foreach (String key in tableInfo.Columns.Keys){sbColumns.Append(key).Append(",");}sbColumns.Remove(sbColumns.ToString().Length - 1, 1);string strSql = "SELECT {0} FROM {1} WHERE {2} = " + .DbParmChar + "{2}";strSql = string.Format(strSql, sbColumns.ToString(), tableInfo.TableName, tableInfo.Id.Key); return strSql; }

??? 下面是幾個工具類代碼,ReflectionUtils,根據(jù)反射獲取或設(shè)置對象屬性值、DynamicMethodCompiler動態(tài)方法編譯,可提高反射的性能。

ReflectionUtilsusing System; using System.Collections.Generic; using System.Text; using System.Reflection;namespace System.Orm.Common {public class {public static [] GetProperties( type){return type.GetProperties(.Public | .Instance);}public static [] GetFields( type){return type.GetFields(.Public | .Instance);}public static void SetPropertyValue(obj, property, //創(chuàng)建Set委托setter = .CreateSetHandler(obj.GetType(),property);//先獲取該私有成員的數(shù)據(jù)類型type = property.PropertyType;//通過數(shù)據(jù)類型轉(zhuǎn)換value = .ConvertForType(value, type);//將值設(shè)置到對象中setter(obj, value); } public static GetPropertyValue(obj, property){//創(chuàng)建Set委托getter = .CreateGetHandler(obj.GetType(), property);//獲取屬性值return getter(obj);}public static void SetFieldValue(obj, field, value){//創(chuàng)建Set委托setter = .CreateSetHandler(obj.GetType(), field);//先獲取該私有成員的數(shù)據(jù)類型type = field.FieldType;//通過數(shù)據(jù)類型轉(zhuǎn)換value = .ConvertForType(value, type);//將值設(shè)置到對象中setter(obj, value);}public static GetFieldValue(obj, field){//創(chuàng)建Set委托getter = .CreateGetHandler(obj.GetType(), field);//獲取字段值return getter(obj); } } }


DynamicMethodCompiler代碼:

DynamicMethodCompilerusing System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Reflection.Emit;namespace System.Orm.Common {//定義GetHandler委托public delegate object (object source);
//定義SetHandler委托public delegate void (object source, object value);
//定義InstantiateObjectHandler委托public delegate object ();public sealed class {// DynamicMethodCompilerprivate DynamicMethodCompiler() { }// 創(chuàng)建InstantiateObject委托internal static CreateInstantiateObjectHandler( type){constructorInfo = type.GetConstructor(.Public |.NonPublic | .Instance, null, new [0], null);if (constructorInfo == null){throw new (string.Format("The type {0} must declare an empty constructor (the constructor may be private, internal, protected, protected internal, or public).", type));}dynamicMethod = new ("InstantiateObject",.Static |.Public, .Standard, typeof(object),null, type, true);generator = dynamicMethod.GetILGenerator();generator.Emit(.Newobj, constructorInfo);generator.Emit(.Ret);return ()dynamicMethod.CreateDelegate(typeof());}// 創(chuàng)建Get委托internal static CreateGetHandler( type, propertyInfo){getMethodInfo = propertyInfo.GetGetMethod(true);dynamicGet = CreateGetDynamicMethod(type);getGenerator = dynamicGet.GetILGenerator();getGenerator.Emit(.Ldarg_0);getGenerator.Emit(.Call, getMethodInfo);BoxIfNeeded(getMethodInfo.ReturnType, getGenerator);getGenerator.Emit(.Ret);return ()dynamicGet.CreateDelegate(typeof());}// 創(chuàng)建Get委托internal static CreateGetHandler( type, fieldInfo){dynamicGet = CreateGetDynamicMethod(type);getGenerator = dynamicGet.GetILGenerator();getGenerator.Emit(.Ldarg_0);getGenerator.Emit(.Ldfld, fieldInfo);BoxIfNeeded(fieldInfo.FieldType, getGenerator);getGenerator.Emit(.Ret);return ()dynamicGet.CreateDelegate(typeof());}// 創(chuàng)建Set委托internal static CreateSetHandler( type, propertyInfo){setMethodInfo = propertyInfo.GetSetMethod(true);dynamicSet = CreateSetDynamicMethod(type);setGenerator = dynamicSet.GetILGenerator();setGenerator.Emit(.Ldarg_0);setGenerator.Emit(.Ldarg_1);UnboxIfNeeded(setMethodInfo.GetParameters()[0].ParameterType, setGenerator);setGenerator.Emit(.Call, setMethodInfo);setGenerator.Emit(.Ret);return ()dynamicSet.CreateDelegate(typeof());}// 創(chuàng)建Set委托internal static CreateSetHandler( type, fieldInfo){dynamicSet = CreateSetDynamicMethod(type);setGenerator = dynamicSet.GetILGenerator();setGenerator.Emit(.Ldarg_0);setGenerator.Emit(.Ldarg_1);UnboxIfNeeded(fieldInfo.FieldType, setGenerator);setGenerator.Emit(.Stfld, fieldInfo);setGenerator.Emit(.Ret);return ()dynamicSet.CreateDelegate(typeof());}// 創(chuàng)建Get動態(tài)方法private static CreateGetDynamicMethod( type){return new ("DynamicGet", typeof(object),new [] { typeof(object) }, type, true);}// 創(chuàng)建Set動態(tài)方法private static CreateSetDynamicMethod( type){return new ("DynamicSet", typeof(void),new [] { typeof(object), typeof(object) }, type, true);}// BoxIfNeededprivate static void BoxIfNeeded(type, ILGenerator generator){if (type.IsValueType){generator.Emit(.Box, type);}}// UnboxIfNeededprivate static void UnboxIfNeeded(Type type, generator){if (type.IsValueType){generator.Emit(.Unbox_Any, type);}}} }

?

TypeUtils代碼:

TypeUtilsusing System; using System.Collections.Generic; using System.Text;namespace System.Orm.Common {public class {public static object ConvertForType(object value,type){switch (type.FullName){case "System.String":value = value.ToString();break;case "System.Boolean":value = bool.Parse(value.ToString());break;case "System.Int16":case "System.Int32":case "System.Int64":value = int.Parse(value.ToString());break;case "System.Double":value = double.Parse(value.ToString());break;case "System.Decimal":value = new decimal(double.Parse(value.ToString()));break; }return value;}} }

?

??? 好了,FindById方法所需的代碼和工具類代碼都在上面,到此已經(jīng)完成。

Technorati 標(biāo)簽: ORM

轉(zhuǎn)載于:https://www.cnblogs.com/wangwei123/archive/2010/07/03/1770396.html

總結(jié)

以上是生活随笔為你收集整理的自己动手写ORM框架(六):实现查询功能FindById方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: xxxx69国产| 999视频| 人人妻一区二区三区 | av片网站 | 狠狠操很很干 | 在线观看国产一区二区三区 | 国产极品粉嫩 | 国产高清一二三区 | 欧美成人精品在线 | 国产二区精品视频 | 国产人成免费视频 | 成人在线视频免费观看 | 成人国产精品一区 | 天堂中文在线观看 | 91精品国产综合久久福利 | 91视频看片 | 色老头一区二区三区在线观看 | xxxx.国产 | 粉嫩aⅴ一区二区三区四区五区 | 青青草视频污 | 中文字幕五码 | 黄色成人小视频 | 欧美怡春院 | 搞逼综合网 | 色婷婷狠狠 | 自拍偷拍第一页 | 日日麻批 | 欧美又大粗又爽又黄大片视频 | 日产欧产va高清 | 成年人在线视频 | 在线观看国产 | 成人黄色网页 | 亚洲成人乱码 | 丁香婷婷一区二区三区 | 久久久久久久九九九九 | av大片免费观看 | 久久免费看片 | 日韩五码在线 | 91丨九色丨丰满 | 久久久久久无码精品人妻一区二区 | 亚洲精品久久久蜜桃 | 猛1被调教成公厕尿便失禁网站 | www.av麻豆 | 亚洲一二三不卡 | 三上悠亚在线观看一区二区 | 欧美激情精品久久 | 91综合国产| 人人人人干 | 丰满人妻一区二区三区53 | av黄在线观看 | 国产伦理久久精品久久久久 | 日本不卡视频一区 | 国产免费一区二区三区三州老师 | 欧美激情综合五月色丁香 | 在线观看黄色网页 | av操操操| 99国产精品免费视频 | 国产精品一级 | 亚洲综合色吧 | 日韩黄色av网站 | 欧美有码在线 | 免费在线看污 | 国产ts人妖系列高潮 | 黄色片一区二区三区 | 一级黄色欧美 | 热久久精品 | 精品国产aⅴ一区二区三区四川人 | 青青草精品在线视频 | 色老头免费视频 | 韩国av免费在线 | 久久久涩 | 国产videos| 福利视频99| 成人免费观看视频大全 | 日韩av中文字幕在线播放 | 色av吧| 熟妇人妻精品一区二区三区视频 | 爱的天堂| 非洲黑妞xxxxhd精品 | 91亚洲精品久久久蜜桃 | 国产欧美日韩在线观看 | 男人添女人下部高潮全视频 | 在线观看欧美一区二区三区 | 一区二区内射 | 浪潮av网站 | 国产三级精品在线观看 | 国内毛片毛片毛片毛片毛片 | 免费看女生裸体视频 | 国产一区精品在线观看 | 免费网站黄色 | 一本色道久久综合无码人妻 | 久久久国产一区二区三区 | 国产精品一区二区视频 | 少女与动物高清版在线观看 | 香港三级在线视频 | 福利精品 | 亚洲石原莉奈一区二区在线观看 | 亚洲视频在线观看一区二区三区 | 男生女生插插插 |