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

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

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

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

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

1.数据插入封装:


  1. /// <summary>
  2. /// 完成数据的插入
  3. /// 要求:1.数据库表名为类名
  4. /// 2.数据库字段名和类字段名相同
  5. /// </summary>
  6. /// <param name="obj">类的对象</param>
  7. public static void Insert(object obj)
  8. {
  9. StringBuilder Sql = new StringBuilder();
  10. Type type = obj.GetType();
  11. FieldInfo[] fields = type.GetFields();//获取类中所有字段信息,(表中的所有字段)
  12. string[] keys = new string[fields.Length-];//存取字段信息
  13. string[] param = new string[fields.Length-];//存储参数化查询的参数
  14. string[] values = new string[fields.Length-];//每个字段对应的值
  15. MySqlParameter[] sqlParameter = new MySqlParameter[fields.Length-]; //参数化查询
  16. string table = type.Name; //获取类名(表中的表名)
  17. int count = ;
  18. foreach (FieldInfo field in fields)
  19. {
  20. if (field.Name != "id") //过滤掉自增字段id
  21. {
  22. keys[count] = field.Name; //字段名
  23. try
  24. {
  25. param[count] = "@" + (field.GetValue(obj)).ToString(); //参数名
  26. values[count] = (field.GetValue(obj)).ToString(); //字段值
  27. MySqlParameter sqlparam = new MySqlParameter();//进行参数化查询
  28. sqlparam.ParameterName = param[count]; //参数化查询用于替换的名字
  29. sqlparam.Value = values[count]; //对应的值
  30. sqlParameter[count] = sqlparam;
  31. count++;
  32. }
  33. catch(Exception e)
  34. {
  35. throw new Exception(keys[count]+"对象未初始化:"); //数据没有初始化时抛异常
  36. }
  37. }
  38. }
  39. string sqlkey = string.Join(",", keys); //将字段数组转换为字符串
  40. string sqlparamstr = string.Join(",", param); //将参数数组转换字符串
  41. Sql.Append("insert into " + table + " (" + sqlkey + ") values (" + sqlparamstr + ")");
  42. SqlHelper.ExecuteNonQuery(Sql.ToString(), sqlParameter); //通过SqlHelper完成操作
  43. }

2.数据删除封装:

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

3.数据更新封装:

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

4.数据查询封装:

  1. /// <summary>
  2. /// 根据id查询值
  3. /// </summary>
  4. /// <typeparam name="T">T为类名(也就是数据库表)</typeparam>
  5. /// <param name="id"></param>
  6. /// <returns></returns>
  7. public static object Select<T>(int id)where T:new()
  8. {
  9. Type type = typeof(T);
  10. string table = type.Name;//获取表名
  11. StringBuilder Sql = new StringBuilder();
  12. Sql.Append("select *from "+table+" where id=@id");
  13. DataTable tab = SqlHelper.ExecuteQuery(Sql.ToString(), new MySqlParameter("@id", id));
  14. if (tab.Rows.Count <= )
  15. {
  16. //没有查询到数据
  17. return default(T);
  18. }
  19. else if (tab.Rows.Count > )
  20. {
  21. throw new Exception("查询到了多条数据");
  22. }
  23. DataRow row =tab.Rows[];
  24. T obj = new T();
  25. FieldInfo[] fields= type.GetFields();
  26. foreach (FieldInfo field in fields)
  27. {
  28. string Name = field.Name; //获取每一个字段名
  29. object value = row[Name]; //将数据库中读取到的每一个值进行赋值
  30. field.SetValue(obj, value);
  31. }
  32. return obj;
  33. }

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. idea 15破解方法记录

    So easy! Only one step.     注册时选择 License server ,填 http://idea.lanyus.com  对于Clion等同样适用.

  2. Spark调优与调试

    1.使用SparkConf配置Spark (1)在java中使用SparkConf创建一个应用: SparkConf conf =;i++){ javaBean bean =new javaBean( ...

  3. delphi bitbutton和speedbutton.button有什么区别

    http://zhidao.baidu.com/link?url=LT9_iwv47GfSp3m0MmUSablZrPOxzjKtqWW1yVMTbHnIs2DdCE-0qX2bwXZ2020x_Jl ...

  4. php绘图-报表

    1.PHP报表的创建,通过绘图,过程 要先开启gb库, 可以使用jpgraph(绘图框架)快速制作一些图形 报表的作用:可以制作一些统计图,地形图,分布图等,还可以做验证码图片(通过在画布上加字和干扰 ...

  5. MySQL 替换部分电话号码为000

    要做敏感信息剔除,要求又不能全换成同一个号码影响测试,想了几个方法,最终采用替换部分电话号码为000来做到敏感信息覆盖. mysql>update phone setb=replace(b,su ...

  6. MapReduce深度分析(二)

    MapReduce深度分析(二) 五.JobTracker分析 JobTracker是hadoop的重要的后台守护进程之一,主要的功能是管理任务调度.管理TaskTracker.监控作业执行.运行作业 ...

  7. 使用Flex4容器若干技巧

    本文适用于正在寻找使用Flex 4容器和布局的快速参考指南的开发人员. 尽管这不一定是一个复杂问题,但这似乎是许多开发人员的挫折的来源,特别是对于那些Flex刚刚入门的开发人员. 当开发人员不知道如何 ...

  8. Java泛型类型擦除导致的类型转换问题

    初步结论:泛型类型转换不靠谱: 源码: package com.srie.testjava; public class TestClassDefine4<T> { public stati ...

  9. 利用谷歌开源工具cAdvisor 结合influxdb存储+Grafana前端展示进行Docker容器的监控

    一.Docker 监控方式 1.利用docker 的 docker stats API 命令: docker stats [容器ID/容器名称] [root@docker ~]# docker sta ...

  10. Activity生命周期完全解析

    **转载请注明出处:http://www.cnblogs.com/landptf/p/6309108.html** 生命周期是个老生常谈的问题了,今天做个汇总,全当是记个笔记,以后查找起来方便一些.下 ...