这次通过反射技术来实现一下数据库表的增删改查对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping)

注:引用时约束了以下几点:

  • 数据库表的表名类的类名一致
  • 数据库字段名类字段名一致

     注:如果用的是MySql数据库,有提供好的MySqlhelper非MySql数据库可以参考我写好的SqlHelper

SqlHelper参考位置:http://www.cnblogs.com/fengxuehuanlin/p/5271944.html

1.数据插入封装:


/// <summary>
/// 完成数据的插入
/// 要求:1.数据库表名为类名
/// 2.数据库字段名和类字段名相同
/// </summary>
/// <param name="obj">类的对象</param>
public static void Insert(object obj)
{
StringBuilder Sql = new StringBuilder();
Type type = obj.GetType();
FieldInfo[] fields = type.GetFields();//获取类中所有字段信息,(表中的所有字段)
string[] keys = new string[fields.Length-];//存取字段信息
string[] param = new string[fields.Length-];//存储参数化查询的参数
string[] values = new string[fields.Length-];//每个字段对应的值
MySqlParameter[] sqlParameter = new MySqlParameter[fields.Length-]; //参数化查询
string table = type.Name; //获取类名(表中的表名)
int count = ;
foreach (FieldInfo field in fields)
{
if (field.Name != "id") //过滤掉自增字段id
{
keys[count] = field.Name; //字段名
try
{
param[count] = "@" + (field.GetValue(obj)).ToString(); //参数名
values[count] = (field.GetValue(obj)).ToString(); //字段值
MySqlParameter sqlparam = new MySqlParameter();//进行参数化查询
sqlparam.ParameterName = param[count]; //参数化查询用于替换的名字
sqlparam.Value = values[count]; //对应的值
sqlParameter[count] = sqlparam;
count++;
}
catch(Exception e)
{
throw new Exception(keys[count]+"对象未初始化:"); //数据没有初始化时抛异常
}
}
}
string sqlkey = string.Join(",", keys); //将字段数组转换为字符串
string sqlparamstr = string.Join(",", param); //将参数数组转换字符串
Sql.Append("insert into " + table + " (" + sqlkey + ") values (" + sqlparamstr + ")");
SqlHelper.ExecuteNonQuery(Sql.ToString(), sqlParameter); //通过SqlHelper完成操作
}

2.数据删除封装:

/// <summary>
/// 更具id删除数据
/// </summary>
/// <typeparam name="T">T为类名</typeparam>
/// <param name="id">要删除的字段id</param>
public static void Delete<T>(int id)
{
Type type = typeof(T);
string table = type.Name;//获取表名
StringBuilder Sql = new StringBuilder();
Sql.Append("delete from "+table+" where id=@id");
if (SqlHelper.ExecuteNonQuery(Sql.ToString(), new MySqlParameter("@id", id)) <= )
{
throw new Exception("这条记录不存在");
}
}

3.数据更新封装:

/// <summary>
/// 更新一个字段
/// </summary>
/// <typeparam name="T">T为类名(也就是数据库表)</typeparam>
/// <param name="id">更新哪条数据</param>
/// <param name="name">更新哪个字段</param>
/// <param name="value">字段对应的值</param>
public static void Update<T>(int id,string name,object value)
{
Type type = typeof(T);
string table = type.Name;//获取表名
StringBuilder Sql = new StringBuilder();
Sql.Append("Update " + table + " set "+name+"=@value where id=@id");
MySqlParameter[] param = { new MySqlParameter("@value", value), new MySqlParameter("@id", id) };
if(SqlHelper.ExecuteNonQuery(Sql.ToString(), param)<=)
{
throw new Exception("这条记录不存在");
}
}

4.数据查询封装:

/// <summary>
/// 根据id查询值
/// </summary>
/// <typeparam name="T">T为类名(也就是数据库表)</typeparam>
/// <param name="id"></param>
/// <returns></returns>
public static object Select<T>(int id)where T:new()
{
Type type = typeof(T);
string table = type.Name;//获取表名
StringBuilder Sql = new StringBuilder();
Sql.Append("select *from "+table+" where id=@id");
DataTable tab = SqlHelper.ExecuteQuery(Sql.ToString(), new MySqlParameter("@id", id));
if (tab.Rows.Count <= )
{
//没有查询到数据
return default(T);
}
else if (tab.Rows.Count > )
{
throw new Exception("查询到了多条数据");
}
DataRow row =tab.Rows[];
T obj = new T();
FieldInfo[] fields= type.GetFields();
foreach (FieldInfo field in fields)
{
string Name = field.Name; //获取每一个字段名
object value = row[Name]; //将数据库中读取到的每一个值进行赋值
field.SetValue(obj, value);
}
return obj;
}

ORM 实现数据库表的增删改查的更多相关文章

  1. DjangoMTV模型之model层——ORM操作数据库(基本增删改查)

    Django的数据库相关操作 对象关系映射(英语:(Object Relational Mapping,简称ORM),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效果上说 ...

  2. django 利用ORM对单表进行增删改查

    牛小妹上周末,一直在尝试如何把数据库的数据弄到界面上.毕竟是新手,搞不出来,文档也看不懂.不过没关系,才刚上大学.今晚我们就来解释下,要把数据搞到界面的第一步.先把数据放到库里,然后再把数据从库里拿出 ...

  3. java-jdbc-mysql:实现数据库表的增删改查

    以数据库test下数据表student(sno,sname,ssex,sage,sdept)为例: student表中的已有的所有记录:

  4. MongoDB 基础命令——数据库表的增删改查——遍历操作表中的记录

    分组排序查询最大记录 //对 "catagory" 不等于 null 的数据进行分组查询,且查询结果倒序 db.getCollection('userAccount').aggre ...

  5. ORM对单表的增删改查

    表记录的增加: 1)b = Book(name='python', price=99) b.save() 2)Book.objects.create(name='python', price=99) ...

  6. 使用Servlet和JSp在浏览器上实现对数据库表的增删改查(新手)

    第一步:用户输入网址进入一个登陆界面. 里面要有账号密码输入. 登陆界面链接到登陆的Servlet类中. Servlet类 --> 1.接收参数(账户密码)  2.调用DAO层的 SQL语句 验 ...

  7. C# - VS2019 通过DataGridView实现对Oracle数据表的增删改查

    前言 通过VS2019建立WinFrm应用程序,搭建桌面程序后,通过封装数据库操作OracleHelper类和业务逻辑操作OracleSQL类,进而通过DataGridView实现对Oracle数据表 ...

  8. MySQL数据库之表的增删改查

    目录 MySQL数据库之表的增删改查 1 引言 2 创建表 3 删除表 4 修改表 5 查看表 6 复制表 MySQL数据库之表的增删改查 1 引言 1.MySQL数据库中,数据库database就是 ...

  9. Django学习笔记--数据库中的单表操作----增删改查

    1.Django数据库中的增删改查 1.添加表和字段 # 创建的表的名字为app的名称拼接类名 class User(models.Model): # id字段 自增 是主键 id = models. ...

随机推荐

  1. TSP问题(旅行商问题)[分支限界法]

    问题: 旅行商从 a 开始周游下图所有的城市一次,然后回到 a,城市之间的旅行代价在图中标明. 请选择一个最优的行走顺序使得周游所有城市的代价最小. 思路: 随便怎么周游,对于一个城市来说,一定有一条 ...

  2. Spark中的键值对操作-scala

    1.PairRDD介绍     Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...

  3. LNAMP 中的PHP探针

    <?php /* ----------------本探针基于YaHei.net探针------------------- */ error_reporting(0); //抑制所有错误信息 @h ...

  4. 国产数据库-KingbaseES在linux下的安装

    将KingbaseES软件从windows中传至Linux中并解压 [root@localhost ~]# ls anaconda-ks.cfg  install.log.syslog Desktop ...

  5. doubango简介

    1.doubango官网:http://www.doubango.org/ doubango常用项目国内镜像(放在淘宝的svn服务器),目前有4个项目:doubango, idoubs, imsdro ...

  6. sql数据库链接

    针对数据库只能链接计算机名称不能进行点(.)或者local本地链接的问题.主要会出现在刚装完系统的用户. 解决方法: 首先从SQL Server配置管理器中找到SQL Server网络配置的协议:TC ...

  7. Bagging决策树:Random Forests

    1. 前言 Random Forests (RF) 是由Breiman [1]提出的一类基于决策树CART的Bagging算法.论文 [5] 在121数据集上比较了179个分类器,效果最好的是RF,准 ...

  8. HTML5行业现状与未来 - 2016年终大盘点

    * { margin: 0; padding: 0 } .con { width: 802px; margin: 0 auto; text-align: center; position: inher ...

  9. 锁 和 CopyOnWrite的实现

    1.普通锁 只有lock功能, Java实现:ReentrantLock lock = new ReentrantLock(); lock和unlock: lock.lock(); lock.unlo ...

  10. 为 Jenkins 配置 .Net 持续集成环境

    去年年底,得益于公司引入 Jenkins,让我们在持续集成方面迈出了第一步,本文不赘述如何安装 Jenkins,主要关注点在于配置 .Net 环境.另外本文是在 Windows 环境下安装的 Jenk ...