如鹏网学习的ORM小练习代码

自己刚刚学完反射,看着老师留着的作业写的代码。希望今后能够有用。

DOG类

namespace RupengORM
{
    public class Dog
    {
        public Dog()
        {
        }

        /// <summary>
        ///     显示提供无参构造函数
        /// </summary>
        /// <param name="aa"></param>
        public Dog(int aa)
        {
        }

        public int Id { get; set; }

        public string Name { get; set; }

        public int Weight { set; get; }
    }
}

Sqlhelper:

using System.Collections.Generic;
using System.Configuration;
using System.Data;
using MySql.Data.MySqlClient;

namespace RupengORM
{
    public class DbSqlhelper
    {
        private static readonly string Sqlconnstr = ConfigurationManager.ConnectionStrings["mysqlconn"].ConnectionString;

        public static MySqlConnection CreateConnection()
        {
            MySqlConnection conn = new MySqlConnection(Sqlconnstr);
            conn.Open();
            return conn;
        }

        public static int ExecuteNonQuery(MySqlConnection conn, string sql, params MySqlParameter[] parameters)
        {
            using (MySqlCommand cmd=conn.CreateCommand())
            {
                cmd.CommandText = sql;
                 cmd.Parameters.AddRange(parameters);

                return   cmd.ExecuteNonQuery();
            }
        }

        public static int ExecuteNonQuery(string sql, params MySqlParameter [] parameters)
        {
            using (MySqlConnection conn = CreateConnection())
            {
                return ExecuteNonQuery(conn, sql, parameters);

            }
        }

        public static object ExecuteScalar(MySqlConnection conn, string sql, Dictionary<string, object> dictionary)
        {
            using (MySqlCommand cmd=conn.CreateCommand())
            {
                cmd.CommandText = sql;
                foreach (var kvp in dictionary)
                {
                    IDbDataParameter parameter = cmd.CreateParameter();
                    parameter.ParameterName = kvp.Key;
                    parameter.Value = kvp.Value;
                    cmd.Parameters.Add(parameter);
                }
                return cmd.ExecuteScalar();

            }

        }

        public static object ExecuteScalar(string sql, Dictionary<string, object> dictionary)
        {
            using (MySqlConnection conn=CreateConnection())
            {
                return ExecuteScalar(conn, sql, dictionary);
            }
        }

        public static DataTable ExecuteQuery(MySqlConnection conn, string sql, Dictionary<string, object> dictionary)
        {
            DataTable dataTable=new DataTable();
            using (MySqlCommand cmd=conn.CreateCommand())
            {
                cmd.CommandText = sql;
                foreach (var kvp in dictionary)
                {
                    IDbDataParameter parameter = cmd.CreateParameter();
                    parameter.ParameterName = kvp.Key;
                    parameter.Value = kvp.Value;
                    cmd.Parameters.Add(parameter);
                    using (IDataReader reader=cmd.ExecuteReader())
                    {
                        dataTable.Load(reader);
                    }

                }
            }

            return dataTable;
        }

        public static DataTable ExecuteQuery(  string sql, Dictionary<string, object> dictionary)
        {
            using (MySqlConnection conn=CreateConnection())
            {
                return ExecuteQuery(conn, sql, dictionary);
            }
        }

    }

}

RProm 实现过程:

using System;
using System.Collections.Generic;
using System.Text;
using MySql.Data.MySqlClient;

namespace RupengORM
{
    internal class RPorm
    {
        //约定:1、类名要和表名一样
        //2、字段名和数据库列名一样
        //3、主键的名字必须叫Id,必须是自动递增,int类型
        //
        //
        //
        //
        //
        public static void Insert(object obj)
        {
            //获得obj对象的类名
            var type = obj.GetType(); //typeof(Person)
            var className = type.Name; //类名:Person
            //propertyInfos获得类里面所有的属性
            var propertyInfos = type.GetProperties();
            var propNames = new string[propertyInfos.Length - 1]; //排除掉Id
            var paramNames = new string[propertyInfos.Length - 1];
            var sqlParameters = new MySqlParameter[propertyInfos.Length - 1];
            //    Dictionary<string, object>  dic = new Dictionary<string, object>();
            var count = 0;
            foreach (var propInfo in propertyInfos)
            {
                var propName = propInfo.Name;

                if (propName != "Id") //排除Id
                {
                    //遍历赋值,包含ID不进入赋值
                    propNames[count] = propName;
                    paramNames[count] = "@" + propName;
                    var mySqlParameter = new MySqlParameter();
                    mySqlParameter.ParameterName = "@" + propName;
                    mySqlParameter.Value = propInfo.GetValue(obj); //去obj对象属性的值
                    sqlParameters[count] = mySqlParameter;
                    count++;
                }
            }

            //拼接生成insert语句
            var sbSql = new StringBuilder();

            sbSql.Append("insert into ")
                .Append(className)
                .Append("(")
                .Append(string.Join(",", propNames))
                .Append(")");
            sbSql.Append(" values (").Append(string.Join(",", paramNames)).Append(")");

            DbSqlhelper.ExecuteNonQuery(sbSql.ToString(), sqlParameters); //params可变长度参数本质上就是一个数组
        }

        public static object SelectById(Type type, int id)
        {
            //将表名获取到
            var classname = type.Name;

            var sql = "select * from " + classname + " where [email protected]";
            var dictionary = new Dictionary<string, object>();
            dictionary["@id"] = id;
            var dataTable = DbSqlhelper.ExecuteQuery(sql, dictionary);

            if (dataTable.Rows.Count <= 0)
            {
                return null;
            }
            if (dataTable.Rows.Count > 1)
            {
                throw new Exception("查到多条ID=" + id + "的数据");
            }
            var row = dataTable.Rows[0];
            //创建type类的一个对象
            var obj = Activator.CreateInstance(type);

            //给obj对象的每一个属性(包括Id)赋值,得到id name weight
            foreach (var propInfo in type.GetProperties())
            {
                var propName = propInfo.Name; //属性名就是别名

                var value = row[propName]; //获取数据库中列的值

                propInfo.SetValue(obj, value); //给obj对象的propinfo属性赋值为value
            }
            return obj;
        }

        public static T SelectById<T>(int id) where T : new() //泛型约束,约束T必须有一个无参的构造函数
        {
            var type = typeof (T); //typeof(Person)

            var classname = type.Name;

            var sql = "select * from " + classname + " where [email protected]";
            var dictionary = new Dictionary<string, object>();
            dictionary["@id"] = id;
            var dataTable = DbSqlhelper.ExecuteQuery(sql, dictionary);

            if (dataTable.Rows.Count <= 0)
            {
                return default(T); //default(T)运算符用来获得类型的默认值
                //default(int)→0 default(bool)→false default(Person)→null
            }
            if (dataTable.Rows.Count > 1)
            {
                throw new Exception("查到多条ID=" + id + "的数据");
            }
            var row = dataTable.Rows[0];
            //创建type类的一个对象
            //   var obj = Activator.CreateInstance(type);
            var obj = new T(); //泛型约束

            //给obj对象的每一个属性(包括Id)赋值 返回当前 Type 的所有公共属性。
            foreach (var propInfo in type.GetProperties())
            {
                var propName = propInfo.Name; //属性名就是别名

                var value = row[propName]; //获取数据库中列的值

                propInfo.SetValue(obj, value); //给obj对象的propinfo属性赋值为value
            }
            return obj;
        }

        public static bool DeleteById(Type type, int id)
        {
            var classname = type.Name;

            var sql = "delete from " + classname + " where [email protected] ";
            var i = DbSqlhelper.ExecuteNonQuery(sql, new MySqlParameter {ParameterName = "@id", Value = id});
            //delete from dog where name=‘孔老二4‘
            return i > 0;
        }

        public static bool UpdateById(object obj)
        {
            var type = obj.GetType();

            var classname = type.Name; //获得表名

            var propertyInfos = type.GetProperties(); //获得表名中的功能属性
            var propNames = new string[propertyInfos.Length]; //获取该属性的长度
            var paramNames = new string[propertyInfos.Length];
            var sqlParameters = new MySqlParameter[propertyInfos.Length];
            var count = 0;
            foreach (var propInfo in propertyInfos)
            {
                var propName = propInfo.Name;
                var mySqlParameter = new MySqlParameter();
                mySqlParameter.ParameterName = "@" + propName;
                mySqlParameter.Value = propInfo.GetValue(obj); //去obj对象属性的值
                sqlParameters[count] = mySqlParameter;

                if (propName != "Id") //排除Id
                {
                    //遍历赋值,包含ID不进入赋值
                    propNames[count] = propName; //name

                    paramNames[count] = propName + "[email protected]" + propName; //@name
                }
                count++;
            }
            var oop = string.Join("  ,  ", paramNames).Substring(4);
            // sqlParameters;
            var sb = new StringBuilder();
            sb.Append("update ").Append(classname).Append(" set ").Append(oop).Append(" where [email protected]");
              var sqltxt = sb.ToString();
            var i = DbSqlhelper.ExecuteNonQuery(sqltxt, sqlParameters);
            //生成update语句
            //update dog set [email protected] [email protected] where [email protected]
            //怎么知道那一列被修改了呢
            //把所有列都更新一下。反正不变的还是不变

            return i > 0;
        }
    }
}

主程序:

using System;

namespace RupengORM
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            //ORM:EF(entity framework,Dapper,Nhibernate)
            // Person p1=new Person();
            // p1.Name = "rupeng";
            // p1.Age = 7;
            // RPorm.Insert(p1);

            for (var i = 0; i < 10; i++)
            {
                var d1 = new Dog();
                d1.Name = "孔老二" + i;
                d1.Weight = 30;
                RPorm.Insert(d1);
            }

            //Person p1 = (Person)RPorm.SelectById(typeof(Person),1);
            //Console.WriteLine(p1.Name+"的年龄是"+p1.Age);

            //   Dog p2 = (Dog)RPorm.SelectById(typeof(Dog), 1);
            //if (p2 == null)
            //{
            //    Console.WriteLine("没找到狗");
            //}
            //else
            //{
            //    Console.WriteLine(p2.Name);
            //}

            //Dog dog = RPorm.SelectById<Dog>(1);

            //Console.WriteLine(dog.Name);
            //  Type type = new Type typeof(Dog);

            //bool aa=    RPorm.DeleteById(typeof(Dog),2);
            //Console.WriteLine(aa);
            var dog = new Dog();
            dog.Weight++;
            dog.Name = "孔老二";
            dog.Id = 9;
            var update = RPorm.UpdateById(dog);

            Console.WriteLine(update);
            Console.ReadKey();
        }
    }
}
时间: 2024-10-12 15:58:07

如鹏网学习的ORM小练习代码的相关文章

如鹏网学习笔记(七)HTML基础

HTML笔记 一.HTML简介 1,HTML (Hyper Text Mark-up Language) 超文本标记语言,是一种编程语言,也可以说是一种标准.规范. 2,HTML提供了一系列标记(标签),每个标记都有不同的含义和作用,浏览器根据标记的含义把内容显示到浏览器页面上 3,超文本:页面不仅可以包含普通文本,还可以包含图片.链接.音乐.程序等非文本内容 4,学习HTML主要是学习常用标签的用法和语法规范 二.基本标签 <!DOCTYPE> 定义文档类型,表明该文档的类型和版本(了解)

如鹏网学习笔记(四).Net常用类库

.Net常用类库 一.String成员方法(常用) 1,bool Contains(string str) 判断字符串对象是否包含给定的内容 2,bool StartsWith(String str):判断字符串对象是否以给定的字符串开始. 3,bool EndsWith(String str):判断字符串对象是否以给定的字符串结束. 案例:判断是否是网址:以http://开头.以.com或者.cn结尾. 案例:判断用户输入的邮件是否是QQ邮箱,用户输入的用户名是否包含"毛ze东"等敏

如鹏网学习笔记(五)MySql基础

MySQL基础 一.数据库概念 1,网友装备信息.论坛帖子信息.QQ好友关系信息.学籍管理系统中的学生信息等都要"持久化"的保存到一个地方, 如果通过IO写到文件中,那么会非常麻烦,而且不利于多人共享数据 2,我们开发大部分软件.网站都要大量用到书库,甚至开发游戏.手机App也要用到数据库,公司面试的时候数据库的考核在三分之一以上 3,数据库(DataBase)是保存数据的仓库,可以方便的把数据放进去,并且把数据根据各种需要取出来. 数据库管理系统(Database Managemen

如鹏网学习笔记(十)DOM

DOM笔记一.DOM简介 Document Object Model 文档对象模型 DOM的节点树模型:整个文档按照从大到小的节点划分,每一个内容都算作一个节点 DOM API 编程接口 可以用来操作页面的任意一部分内容 js+DOM编程的思想:由js基本语法控制程序的执行逻辑,由DOM API进行元素的查找获取,进而再对元素进行增删改等操作 学习DOM,除开学习设计思想外,更多的是学习DOM API的用法 二.document对象 document对象, 是Windows对象的一个属性, 表示

如鹏网学习笔记(十四)ASP.NET

Asp.net笔记 一.Socket类 进行网络编程的类,可以在两台计算机之间进行网络通讯 过程: 向服务器发送指令: GET /index.html HTTP/1.1 Host:127.0.0.1:8080 回车空行 二.浏览器是什么 浏览器就是一个Socket网络客户端,帮助用户请求网站服务器上的内容并且将返回的内容渲染为图形化内容 浏览器的过程: 用户在浏览器输入网址,浏览器向DNS服务器发出Socket请求, 服务器把请求的内容返回给浏览器, 浏览器将内容进行解析并渲染绘制成页面展现,

如鹏网学习笔记(八)CSS

CSS 一.CSS简介 1,CSS (Cascading Style Sheets) 级联样式表 ,是一种计算机语言,用来控制HTML内容的显示效果 2,CSS预先定义了众多的和显示效果有关的样式属性,比如color.font-size等.如果希望html内容显示某个效果,就应用对应的CSS样式属性即可 3,CSS对样式的控制是非常精确和精细的 二.CSS语法 1,CSS语言的基本单位是样式声明:proppertyName:value; 2,CSS语言的使用方式: 1,把CSS样式声明作为HTM

如鹏网学习笔记(九)JavaScript

JavaScript笔记 一.JavaScript简介 1,JavaScript是一种计算机编程语言,可以像等其他编程语言那样定义变量,执行循环等. 2,JavaScript代码主要执行在浏览器上,为HTML页面提供动态效果 3,而且JavaScript是一种脚本语言,它的代码是解释执行的,也就是解释一句代码后就会执行这句代码 4,JavaScript可简称为 js 二.js变量声明 1,js是弱类型语言,弱类型并不是说数据本身没有类型,而是变量没有类型. 如一个变量a,a的值既可以是字符串类型

如鹏网学习笔记(六)ADO.Net基础

ADO.Net基础 一.ADO.Net简介 1,程序要通过SQL语句自动化的操作数据库,必须要用一个类库, 类库要提供execute("insert into ...")/executeQuery("select * from ...")类似的方法 2,ADO.Net是.Net中提供的标准访问数据库的接口,访问不同的DBMS的底层方法是不一样的,ADO.Net把访问数据库的方法进行了统一, 访问MYSql.Oracle.SqlServer等不同数据库的方法几乎是一样

如鹏网学习笔记(十三)EasyUI

一.EasyUI简介 是一组基于JQuery的UI插件集合 主要作用:为JQuery对象提供新的方法,实现新的功能 可以快速创建出简洁.友好.美观的页面,非常适合做网站后台管理页面(不够漂亮,不适合做前台页面) 官方文档:http://www.jeasyui.com/documentation/index.php 二.panel组件的创建 分两步: 1,引入需要的样式文件和js文件 <link rel="styleSheet" type="text/css"