ORM到底是个什么呢,简单的说就是利用放射的方法,来对类class进行操作。
ORM:Object Relational Mapping对象关系映射,是解决了面向对象语言和关系型数据库不匹配的问题。
ORM是一种思想,实现这种思想的技术有很多,如C#中的Entity Framework,NHibernate,Java中的Hibernate。
废话不多说,进入正题。
新建一个控制台应用程序,添加一个类,Person.cs
public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } }
添加一个类,MyORM.cs
public class MyORM { private static readonly string connstr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; //假设:表名和类名一致 ////// 插入一条数据 /// /// 插入的对象 ///受影响函数 public int Insert(object obj) { Type type = obj.GetType(); string className = type.Name;//person //insert into Person(Name,Age)values("哈哈",10) PropertyInfo[] props = type.GetProperties(); ListpropNames = new List ();//属性名列表 List paraNames = new List ();//参数名列表 List paramters = new List ();//参数 foreach (PropertyInfo prop in props) { string propName = prop.Name; if (propName != "Id") { propNames.Add(propName); paraNames.Add("@" + propName); MySqlParameter para=new MySqlParameter(propName,prop.GetValue(obj)); paramters.Add(para); } } StringBuilder sqlsb = new StringBuilder(); sqlsb.Append("insert into ").Append(className).Append("(").Append(string.Join(",", propNames)).Append(")values(").Append(string.Join(",", paraNames)).Append(")"); return MySqlHelper.ExecuteNonQuery(connstr, sqlsb.ToString(), paramters.ToArray()); } //根据Id查询 public object SelectById(Type type, int id) { object obj= Activator.CreateInstance(type); //select * from Person where Id=1 string className = type.Name; string sql = "select * from " + className + " where Id=@Id"; MySqlParameter para = new MySqlParameter("@Id",id); DataSet ds= MySqlHelper.ExecuteDataset(connstr, sql, para); DataTable table = ds.Tables[0]; if (table.Rows.Count<=0) { return null;//没有查到数据 } else if (table.Rows.Count>1) { throw new Exception("出大问题了"); } DataRow row = table.Rows[0]; foreach (var prop in type.GetProperties()) { prop.SetValue(obj,row[prop.Name]); } return obj; } }
这里有一个先决条件:类名要和数据库表名一致
Insert方法实现的是只要传一个类Object就可以将这个类对应的数据添加到数据库表中,主要是通过反射的方法获取类名、属性名和属性值,通过这些拼接sql语句,完成insert操作。
SelectById方法是根据类的Type和属性Id的值,从数据库中查询数据并且赋值给Object.先从数据库中查询数据,通过反射的方法为object的每个属性赋值,返回object.
为了事先规定Type的类型,我们还可以把SelectById方法更改为泛型的方法
//根据Id查询 public T SelectById( int id) where T:new()//泛型约束有无参的构造函数 { Type type = typeof(T); //object obj= Activator.CreateInstance(type); T obj = new T(); //select * from Person where Id=1 string className = type.Name; string sql = "select * from " + className + " where Id=@Id"; MySqlParameter para = new MySqlParameter("@Id",id); DataSet ds= MySqlHelper.ExecuteDataset(connstr, sql, para); DataTable table = ds.Tables[0]; if (table.Rows.Count<=0) { return default(T);//没有查到数据 } else if (table.Rows.Count>1) { throw new Exception("出大问题了"); } DataRow row = table.Rows[0]; foreach (var prop in type.GetProperties()) { prop.SetValue(obj,row[prop.Name]); } return obj;//T类型的 }
在主程序中调用的代码
//插入数据到数据库 Person p1 = new Person(); MyORM orm = new MyORM(); p1.Name = "哈哈"; p1.Age = 20; orm.Insert(p1); Console.ReadKey(); //根据查询数据 Person p2 = (Person)orm.SelectById(typeof(Person), 1); Console.WriteLine(p2.Name); Console.ReadKey(); //泛型的方法查询 Person P3=orm.SelectById(1); Console.WriteLine(p3.Name); Console.ReadKey();
这样一个简单的ORM我们就做好了,现在比较流行ORM框架有EF和dapper,大家有时间的话可以去研究研究这两个,各有优点,都是非常不错的框架,用起来也是比较方便的。