约束

public abstract class BaseModel
{public int Id { get; set; }
}

连接字符串

public static readonly string Customers = ConfigurationManager.ConnectionStrings["Customers"].ToString();

通用数据库字符串

public class SqlBuilder<T> where T : BaseModel
{public static readonly string FindSql = null;public static readonly string DeleteSql = null;public static readonly string FindAllSql = null;public static readonly string UpdateSql = null;static SqlBuilder(){Type type = typeof(T);FindSql = $"SELECT {string.Join(",", type.GetProperties().Select(a => $"[{a.Name}]")) } FROM [{type.Name}] where Id=@Id";DeleteSql = $"Delete from [{type.Name}] where Id=@Id"; ;FindAllSql = $"SELECT {string.Join(",", type.GetProperties().Select(a => $"[{a.Name}]")) } FROM [{type.Name}]";UpdateSql = $"update [{type.Name}] set {string.Join(",", type.GetProperties().Where(a => !a.Name.Equals("Id")).Select(a => $"[{a.Name}]=@ {a.Name}"))} where Id =@Id";}
}

一:添加

public bool Add<T>(T t) where T : BaseModel
{Type type = typeof(T);object oCompany = Activator.CreateInstance(type);// Id 是自动增长的,sql语句中应该去除Id的字段// GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)  过滤掉继承自父类的属性string props = string.Join(",", type.GetProperties().Where(p => !p.Name.Equals("Id")).Select(a => $"[{a.Name}]"));//获取属性名不等于id的所有属性数组string paraValues = string.Join(",", type.GetProperties().Where(p => !p.Name.Equals("Id")).Select(a => $"@[{a.Name}]"));//获取属性名不等于id的所有参数化数组string sql = $"Insert [{type.Name}] ({props}) values({paraValues})";var parameters = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly).Select(item => new SqlParameter(){ParameterName = $"@{item.Name}",SqlValue = $"{item.GetValue(t)}"});//在拼接sql语句的时候,尽管ID 是Int类型,还是建议大家使用Sql语句参数化 (防止sql注入)using (SqlConnection connection = new SqlConnection(Customers)){SqlCommand sqlCommand = new SqlCommand(sql, connection);sqlCommand.Parameters.AddRange(parameters.ToArray());connection.Open();return sqlCommand.ExecuteNonQuery() > 0;}
}

二:删除

public bool Delete<T>(T t) where T : BaseModel
{Type type = t.GetType();string sql = SqlBuilder<T>.DeleteSql;//string sql = $"Delete from [{type.Name}] where Id=@Id";using (SqlConnection connection = new SqlConnection(Customers)){SqlCommand sqlCommand = new SqlCommand(sql, connection);sqlCommand.Parameters.Add(new SqlParameter("@Id", t.Id));connection.Open();return sqlCommand.ExecuteNonQuery() > 0;}
}

三:修改

public bool Update<T>(T t) where T : BaseModel
{Type type = typeof(T);object oCompany = Activator.CreateInstance(type);//string sql = $"update [{type.Name}] set {string.Join(",", type.GetProperties().Where(a => !a.Name.Equals("Id")).Select(a => $"[{a.Name}]=@ {a.Name}"))} where Id =@Id";string sql = SqlBuilder<T>.UpdateSql;var parameters = type.GetProperties().Select(item => new SqlParameter(){ParameterName = $"@{item.Name}",SqlValue = $"{item.GetValue(t)}"});//  在拼接sql语句的时候,尽管ID 是Int类型,还是建议大家使用Sql语句参数化防止sql注入)using (SqlConnection connection = new SqlConnection(Customers)){SqlCommand sqlCommand = new SqlCommand(sql, connection);sqlCommand.Parameters.AddRange(parameters.ToArray());connection.Open();return sqlCommand.ExecuteNonQuery() > 0;}
}

四:查询

//根据id查询public T Find<T>(int id) where T : BaseModel
{Type type = typeof(T);object oCompany = Activator.CreateInstance(type);//string sql = $"SELECT {string.Join(",", type.GetProperties().Select(a => $"[{a.Name}]")) } FROM [{type.Name}] where Id=@Id";string sql = SqlBuilder<T>.FindSql;//  在拼接sql语句的时候,尽管ID 是Int类型,还是建议大家使用Sql语句参数化 (防止sql注入)using (SqlConnection connection = new SqlConnection(Customers)){SqlCommand sqlCommand = new SqlCommand(sql, connection);sqlCommand.Parameters.Add(new SqlParameter("@Id", id));connection.Open();SqlDataReader reader = sqlCommand.ExecuteReader();if (reader.Read()) {ReaderToList(type, oCompany, reader);return (T)oCompany;}else{return null;}}
}//查询所有public List<T> FindAll<T>() where T : BaseModel
{Type type = typeof(T);//string sql = $"SELECT {string.Join(",", type.GetProperties().Select(a => $"[{a.Name}]")) } FROM [{type.Name}]";string sql = SqlBuilder<T>.FindAllSql;using (SqlConnection connection = new SqlConnection(Customers)){SqlCommand sqlCommand = new SqlCommand(sql, connection);connection.Open();SqlDataReader reader = sqlCommand.ExecuteReader();List<T> datalist = new List<T>();while (reader.Read()) {object oCompany = Activator.CreateInstance(type);ReaderToList(type, oCompany, reader);datalist.Add((T)oCompany);}return datalist;}
}//私有函数封装通用代码,引用类型可以不用返回private static void ReaderToList(Type type, object oCompany, SqlDataReader reader)
{foreach (var prop in type.GetProperties()){prop.SetValue(oCompany, reader[prop.Name] is DBNull ? null : reader[prop.Name]);}
}

ADO.NET ORM数据库增删改查封装(工具一)相关推荐

  1. Java+MyEclipse+Tomcat (六)详解Servlet和DAO数据库增删改查操作

    此篇文章主要讲述DAO.Java Bean和Servlet实现操作数据库,把链接数据库.数据库操作.前端界面显示分模块化实现.其中包括数据的CRUD增删改查操作,并通过一个常用的JSP网站前端模板界面 ...

  2. beego原生mysql查询_go——beego的数据库增删改查

    一直都不理解使用go语言的时候,为什么还要自己去装beego,以为使用go便可以解决所有的问题,结果在朋友的点拨下,才意识到: go与beego的关系就好比是nodejs与thinkjs的关系,因此也 ...

  3. Mybatis实现简单的数据库增删改查操作

    简介: MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Ma ...

  4. 常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现

    常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现 以下方法全部亲测可用 //测试查找全部@Testpublic void testSelectAll(){List<U ...

  5. Mysql (一)Mysql 数据库增删改查

    mysql数据库增删改查增:create database DBname charset gbk; 删:drop database DBname; 改:alter database DBname ch ...

  6. sql增删改查_快速搞定数据库增删改查|附思维导图

    数据库学习,增删改查一直是测试工程师面试笔试的必考知识点,对于常用sql语法我们一定要牢记于心,尤其是各种查询的用法,在面试的时候,一个小小的知识点,面试官都可以推断出求职者的基础是否扎实. 下面是关 ...

  7. php+mysql+into_PHP+Mysql 如何实现数据库增删改查

    PHP+Mysql实现数据库增删改查的方法:1.创建入口文件[index.html]连接数据库.查询数据:2.点击增加按钮,通过[addnews.html]添加数据:3.点击删除按钮,通过服务端文件[ ...

  8. Java连接Mysql数据库增删改查实现

    Java连接Mysql数据库增删改查实现 时间比较赶,我这里只实现查询,有时间再添加另外两个 难度 : ⭐⭐⭐(全星5颗星的情况下) 新建一个动态的网站工程, 把jar包全部复制进去,主要要那个mys ...

  9. flask对mysql数据库增删改查_Flask学习(三) - Flask-SQLAlchemy对数据库增删改查

    Flask-SQLAlchemy对数据库增删改查 安装 pip install flask-sqlalchemy 具体不多说了,主要是对数据库进行简单的增删改查,上代码,看注释 @app.route( ...

最新文章

  1. 如何手动的用jigloo设计器关联java界面文件 jigloo 设计器失去关联解决
  2. 如何在IPFS里面上传一张图片
  3. c#操作word表格
  4. 学习、积累、交流-IC设计高手的成长之路
  5. typescript_如何掌握高级TypeScript模式
  6. 【转载】Linux下用ls和du命令查看文件以及文件夹大小
  7. H.264/AVC率失真优化( RDO) 策略研究
  8. c# redies 安装 和使用
  9. Rockchip BT.656 TX 和 BT.1120 TX 开发指南
  10. MATLAB 数学应用 微分方程 常微分方程 选择ODE求解器
  11. 连续时间傅立叶变换和拉普拉斯变换
  12. 软件工程-基本流程图
  13. 怎样从微博下载视频?
  14. 有什么适合小团队的协作工具?
  15. Kindle Paperwhite 越狱/加字体/支持PDF、EPUB、DjVu、FB2、CHM和DOC文档
  16. 阿里云云服务器 ECS SSHKEY登录
  17. VB6.0 google 地图显示GPS数据
  18. unity轻松制作塔防游戏
  19. ubuntu下修改host文件
  20. Working Effectively With Legacy Code 源码可运行

热门文章

  1. yum技巧[Terry]
  2. html艺术字在线制作,@font-face制作Web Icon
  3. QT之桌面精灵实现(一) --- 透明窗体和图片绘制
  4. Matlab fig文件另存为的eps图片 Helvetica Times-Roman字体不能嵌入
  5. 电力智能运维是什么?有哪些优势?
  6. UI - 怎么用PS设计出艺术字体的样式
  7. restTemplate请求重发的相关设置-通过配置
  8. matlab gui电机,基于MATLAB GUI的感应电机性能分析界面设计.docx
  9. C:bzero与memset
  10. C语言--读书笔记(二)