ADO.NET ORM数据库增删改查封装(工具一)
约束
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数据库增删改查封装(工具一)相关推荐
- Java+MyEclipse+Tomcat (六)详解Servlet和DAO数据库增删改查操作
此篇文章主要讲述DAO.Java Bean和Servlet实现操作数据库,把链接数据库.数据库操作.前端界面显示分模块化实现.其中包括数据的CRUD增删改查操作,并通过一个常用的JSP网站前端模板界面 ...
- beego原生mysql查询_go——beego的数据库增删改查
一直都不理解使用go语言的时候,为什么还要自己去装beego,以为使用go便可以解决所有的问题,结果在朋友的点拨下,才意识到: go与beego的关系就好比是nodejs与thinkjs的关系,因此也 ...
- Mybatis实现简单的数据库增删改查操作
简介: MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Ma ...
- 常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现
常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现 以下方法全部亲测可用 //测试查找全部@Testpublic void testSelectAll(){List<U ...
- Mysql (一)Mysql 数据库增删改查
mysql数据库增删改查增:create database DBname charset gbk; 删:drop database DBname; 改:alter database DBname ch ...
- sql增删改查_快速搞定数据库增删改查|附思维导图
数据库学习,增删改查一直是测试工程师面试笔试的必考知识点,对于常用sql语法我们一定要牢记于心,尤其是各种查询的用法,在面试的时候,一个小小的知识点,面试官都可以推断出求职者的基础是否扎实. 下面是关 ...
- php+mysql+into_PHP+Mysql 如何实现数据库增删改查
PHP+Mysql实现数据库增删改查的方法:1.创建入口文件[index.html]连接数据库.查询数据:2.点击增加按钮,通过[addnews.html]添加数据:3.点击删除按钮,通过服务端文件[ ...
- Java连接Mysql数据库增删改查实现
Java连接Mysql数据库增删改查实现 时间比较赶,我这里只实现查询,有时间再添加另外两个 难度 : ⭐⭐⭐(全星5颗星的情况下) 新建一个动态的网站工程, 把jar包全部复制进去,主要要那个mys ...
- flask对mysql数据库增删改查_Flask学习(三) - Flask-SQLAlchemy对数据库增删改查
Flask-SQLAlchemy对数据库增删改查 安装 pip install flask-sqlalchemy 具体不多说了,主要是对数据库进行简单的增删改查,上代码,看注释 @app.route( ...
最新文章
- 如何手动的用jigloo设计器关联java界面文件 jigloo 设计器失去关联解决
- 如何在IPFS里面上传一张图片
- c#操作word表格
- 学习、积累、交流-IC设计高手的成长之路
- typescript_如何掌握高级TypeScript模式
- 【转载】Linux下用ls和du命令查看文件以及文件夹大小
- H.264/AVC率失真优化( RDO) 策略研究
- c# redies 安装 和使用
- Rockchip BT.656 TX 和 BT.1120 TX 开发指南
- MATLAB 数学应用 微分方程 常微分方程 选择ODE求解器
- 连续时间傅立叶变换和拉普拉斯变换
- 软件工程-基本流程图
- 怎样从微博下载视频?
- 有什么适合小团队的协作工具?
- Kindle Paperwhite 越狱/加字体/支持PDF、EPUB、DjVu、FB2、CHM和DOC文档
- 阿里云云服务器 ECS SSHKEY登录
- VB6.0 google 地图显示GPS数据
- unity轻松制作塔防游戏
- ubuntu下修改host文件
- Working Effectively With Legacy Code 源码可运行