• ORM框架学习(四)


    ORM框架----删除数据

    本节是ORM框架学习的第四节,主要内容是用户数据的删除

    Delete方法也是一个通用的泛型方法,其定义如下所示:

    public bool Delete<T>(int id) where T : BaseModel
            {
                Type type=typeof(T);
                string sql = string.Format("delete  from [{0}] where id=@id",type.Name);
                SqlParameter[] sqlparas = new SqlParameter[]{ new SqlParameter("@id",id)};
    
                try
                {
                    return ExecuteSql<bool>(sql, sqlparas, command =>
                    {
                        int result = command.ExecuteNonQuery();
                        return result > 0;
                    });
                    //using (SqlConnection conn = new SqlConnection(conStr))
                    //{
                    //    SqlCommand cmd = new SqlCommand(sql, conn);
                    //    cmd.Parameters.AddRange(sqlparas);
                    //    conn.Open();
                    //    int result = cmd.ExecuteNonQuery();
                    //    return result > 0;
                    //}
                }
                catch (Exception ex)
                {
    
                    Console.WriteLine(ex.Message);
                }
                
                return true;
            }

    上述代码和我们之前的查询、新增、更新代码类似,唯一区别就是用委托,做了代码优化。其实我们的查询、新增、更新和现在的删除代码,都存在相同点,所有的ADO .NET代码都包含下图所示部分:

     为了提高代码的复用性以及分离逻辑,我们采用委托的方法复用相同代码,然后委托回调各自特定的方法。泛型委托方法定义如下所示:

    private T ExecuteSql<T>(string sql, SqlParameter[] paras, Func<SqlCommand, T> command)
            {
                string conStr = "Server=127.0.0.1;Database=master; integrated security=SSPI";
                using (SqlConnection conn = new SqlConnection(conStr))
                {
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    cmd.Parameters.AddRange(paras);
                    conn.Open();
                    return command.Invoke(cmd);
                }
                
            }

    如上代码所示,用户只需要提供操作的sql语句和参数化列表,以及需要回调的函数即可。该方法的好处有:

    1.提高代码复用性 

    2.可以规范ADO .Net的操作 

    3.我们需要打印日志之类的只需在该方法定义即可

    通过ExecuteSql方法,我们把之前的查询、新增、更新代码做了下升级

    查询代码:

    public T Query<T>(int id) where T : BaseModel
            {
               
                try
                {
                    Type t= typeof(T);
                    string sql = SqlBuilder<T>.GetSql(SqlBuilder<T>.SqlType.FindSql);
                    SqlParameter[] pa = new SqlParameter[]{ new SqlParameter("@id",id)};
                    return ExecuteSql<T>(sql, pa, command =>
                    {
                        SqlDataReader reader = command.ExecuteReader();
                        T ti = Activator.CreateInstance<T>();
                        while (reader.Read())
                        {
                            foreach (var prop in t.GetProperties())
                            {
                                var pro = prop.GetMappingName();
                                prop.SetValue(ti, reader[pro] is DBNull ? null : reader[pro], null);
                            }
                        }
                        return ti;
                    });
                    //using (SqlConnection con = new SqlConnection(conStr))
                    //{
                    //    SqlCommand cmd = new SqlCommand(sql, con);
                    //    con.Open();
                    //    cmd.Parameters.Add(pa);
                       
                    //}
                }
                catch (Exception ex)
                {
                    return null;
                }
            }

    新增代码:

    public bool AddData<T>(T t) where T:BaseModel
            {
                try
                {
                    Type type=typeof(T);
                    string AddStr = SqlBuilder<T>.GetSql(SqlBuilder<T>.SqlType.AddSql);
                    var sqlpara = type.GetProperties().FilterKey().Select(p => new SqlParameter("@" + p.GetMappingName(), p.GetValue(t) ?? DBNull.Value)).ToArray();
    
                    return ExecuteSql<bool>(AddStr, sqlpara, command =>
                    {
                        int result = command.ExecuteNonQuery();
                        return result > 0;
                    });
                    //using (SqlConnection conn = new SqlConnection(conStr))
                    //{
                    //    SqlCommand cmd = new SqlCommand(AddStr, conn);
                    //    cmd.Parameters.AddRange(sqlpara);
                    //    conn.Open();
                    //    int result= cmd.ExecuteNonQuery();
                    //    return result > 0;
                    //}
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }

    更新代码:

    public bool Update<T>(T t) where T : BaseModel
            {
    
                try
                {
                    Type type = typeof(T);
                    string UpdateStr = SqlBuilder<T>.GetSql(SqlBuilder<T>.SqlType.UpdateSql);
                    var sqlpara = type.GetProperties().Select(p => new SqlParameter("@" + p.GetMappingName(), p.GetValue(t) ?? DBNull.Value)).ToArray();
                    return ExecuteSql<bool>(UpdateStr, sqlpara, command =>
                    {
                        int result = command.ExecuteNonQuery();
                        return result > 0;
                    });
                    //using (SqlConnection conn = new SqlConnection(conStr))
                    //{
                    //    SqlCommand cmd = new SqlCommand(UpdateStr, conn);
                    //    cmd.Parameters.AddRange(sqlpara);
                    //    conn.Open();
                    //    int result = cmd.ExecuteNonQuery();
                    //    return result > 0;
                    //}
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }

    观察升级过后的代码,有没有发现ExecuteSql的妙处了。我们不管操作数据库sql语句返回的是bool类型还是一个实体对象,我们都可以调用该方法。对于每个操作返回的数据做下单独处理,就实现了所有的类型操作。

    到目前为止,ORM框架基本知识已经差不多学习完成了。博主所写内容都是自己学习过程的总结和拙见,如有不妥之处,欢迎给位园友批评指正.

  • 相关阅读:
    JAVA的向上转型 和 向下转型
    Mobx 常用函数整理
    HTTP错误代码对应
    D3官网上的力导图
    用D3画简单的力导图
    nodejs 爬图片
    nodejs 爬热搜
    canvas 图片旋转 导出下载
    canvas 电子签名
    canvas 音乐跳动效果
  • 原文地址:https://www.cnblogs.com/zxwDont/p/11491602.html
Copyright © 2020-2023  润新知