通过反射来手写简单的ORM SQlserver

不说废话,直接上干货,如发现问题,欢迎大家指出,谢谢!

//------------------------------------MySQlServerORM 【简单 CURD】

using System;
using System.Collections.Generic;
using System.Linq;
namespace COMMOM
{
using C10.ZRF.Model.Filter;
using System.Configuration;
using System.Data.SqlClient;
using Dapper;
using System.Reflection;
using static COMMOM.SqlEnum;

public static class MySQlServerORM
{
private static readonly string con = ConfigurationManager.ConnectionStrings["sqlc"].ConnectionString;

#region 查询单个实体 T GetEntityByID<T>(int id)
public static T GetEntityByID<T>(int id) where T : class, new()
{
string pkName = ReflectionAttriHelper.GetPrimaryKey(typeof(T));
string sql = SuperSQlGet<T>.GetSQL(SQLType.GetEntityByID_SQL);
using (SqlConnection conn = new SqlConnection(con))
{
DynamicParameters parem = new DynamicParameters();
parem.Add(pkName, id);
T result = conn.QueryAsync<T>(sql, parem).Result.FirstOrDefault();
return result ?? default(T);
}
}
#endregion

#region 查询一张表的所有集合数据 IEnumerable<T> GetAllList<T>()
public static List<T> GetAllList<T>() where T : class, new()
{
string sql = SuperSQlGet<T>.GetSQL(SQLType.GetAllList_SQL);
using (SqlConnection conn = new SqlConnection(con))
{
return (conn.QueryAsync<T>(sql).Result.ToList()) ?? default(List<T>);
}
}
#endregion

#region 新增 bool Insert<T>(T entity)
public static bool Insert<T>(T entity) where T : class,new()
{
string sql = SuperSQlGet<T>.GetSQL(SQLType.Insert_SQl);
PropertyInfo[] pylist = typeof(T).GetProperties().IgnorePKID();
using (SqlConnection conn = new SqlConnection(con))
{
DynamicParameters pa = new DynamicParameters();
pylist.ToList().ForEach(p => { pa.Add($"{p.Name}", p.GetValue(entity)); });
return conn.ExecuteAsync(sql,pa).Result > 0 ? true : false;
}
}
#endregion

#region 删除操作DeleteByPrimaryKey<T>(int id)
public static bool DeleteByPrimaryKey<T>(int id) where T : class, new()
{
string sql = SuperSQlGet<T>.GetSQL(SQLType.DeleteByPrimaryKey_SQL);
using (SqlConnection conn = new SqlConnection(con))
{
DynamicParameters parameters = new DynamicParameters();
parameters.Add(ReflectionAttriHelper.GetPrimaryKey(typeof(T)), id);
return conn.ExecuteAsync(sql, parameters).Result > 0;
}
}
//删除操作DeleteByEntity<T>(T entity)
public static bool DeleteByEntity<T>(T entity) where T : class, new()
{
if (entity != null)
{
try
{
Type ty = entity.GetType();
object obj = null;
// ty.GetProperties().Any(c =>..... 两个都可以,还是使用下面的防止报错,效率也高些
ty.GetProperties().FirstOrDefault(c =>
{
if (c.IsDefined(typeof(PKAttribute)))
{
obj = c.GetValue(entity); return true;
}
else { return false; }
});
return obj != null ? DeleteByPrimaryKey<T>(int.Parse(obj.ToString())) : false;
}
catch (Exception ex) { throw new Exception("删除操作失败,原因:" + ex.Message); }
}
return false;
}
#endregion
}
}

//--------------------------------------SuperSQlGet<T> 静态构造函数来初始化SQL语句 【获取SQL语句】
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using static COMMOM.SqlEnum;

namespace COMMOM
{
public static class SuperSQlGet<T> where T : class, new()
{
private static string GetEntityByID_SQL = string.Empty;
private static string GetAllList_SQL = string.Empty;
private static string Insert_SQl = string.Empty;
private static string DeleteByPrimaryKey_SQL = string.Empty;

static SuperSQlGet()
{
//-----------1GetEntityByID
Type ty = typeof(T);
string pkName = ReflectionAttriHelper.GetPrimaryKey(ty);
GetEntityByID_SQL = $"select top 1 * from [{ReflectionAttriHelper.GetTBName(ty)}] where {pkName}[email protected]{pkName}";

//-----------2 GetAllList
GetAllList_SQL = $"select * from [{ReflectionAttriHelper.GetTBName(ty)}] ";

//------------3 insert
PropertyInfo[] pylist = ty.GetProperties().IgnorePKID();
string tabPro = string.Join(",", pylist.Select(c => $"{c.Name}"));
string vastrSafe = string.Join(",", pylist.Select(c => $"@{c.Name}"));
Insert_SQl = $"insert into [{ReflectionAttriHelper.GetTBName(ty)}]({tabPro}) values({vastrSafe})";

//----------4 DeleteByPrimaryKey
DeleteByPrimaryKey_SQL = $"delete from [{ReflectionAttriHelper.GetTBName(ty)}] where {pkName}[email protected]{pkName}";
}

public static string GetSQL(SQLType sqltype)
{
switch (sqltype)
{
case SQLType.GetEntityByID_SQL: return GetEntityByID_SQL;
case SQLType.GetAllList_SQL: return GetAllList_SQL;
case SQLType.Insert_SQl: return Insert_SQl;
case SQLType.DeleteByPrimaryKey_SQL: return DeleteByPrimaryKey_SQL;
default:
throw new Exception("SQl获取异常.....");
}
}
}
}

//----------------------------SqlEnum 【生成SQL使用的枚举】
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace COMMOM
{
public static class SqlEnum
{
public enum SQLType
{
GetEntityByID_SQL,
GetAllList_SQL,
Insert_SQl,
DeleteByPrimaryKey_SQL
}
}
}

//---------------------------------------ReflectionAttriHelper 【帮助类】
using C10.ZRF.Model.Filter;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace COMMOM
{
public static class ReflectionAttriHelper
{
#region GetPrimaryKey(Type ty) 获取主键的属性
public static string GetPrimaryKey(Type ty)
{
var prolist = ty.GetProperties();
string proName = string.Empty;
prolist.FirstOrDefault(c =>
{
if (c.IsDefined(typeof(PKAttribute), false))
{
proName = c.Name; return true;
}
else { return false; }
});
return !string.IsNullOrEmpty(proName) ? proName : "id";
}
#endregion

#region 获取表的映射名称 string GetTBName(Type type)
public static string GetTBName(Type type)
{
Type ty = typeof(TabNameAttribute);
return type.IsDefined(ty) ? ((TabNameAttribute)type.GetCustomAttribute(ty, false)).name : type.Name;
}
#endregion

#region 去掉主键的属性 PropertyInfo[] IgnorePKID(this PropertyInfo[] py )
public static PropertyInfo[] IgnorePKID(this PropertyInfo[] py)
{
List<PropertyInfo> pylist = new List<PropertyInfo>();
py.ToList().ForEach(c => { if (!c.IsDefined(typeof(PKAttribute))) pylist.Add(c); });
return pylist.ToArray();
}
#endregion
}
}

//---------------------------Filter 【过滤器及Attribute】
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace C10.ZRF.Model.Filter
{
using System.Reflection;
[AttributeUsage(AttributeTargets.Class)]
public class TabNameAttribute : Attribute
{
public string name { get; set; }
public TabNameAttribute(string tabName)
{
this.name = tabName;
}
}

[AttributeUsage(AttributeTargets.Property)]
public class PKAttribute : Attribute
{
}

[AttributeUsage(AttributeTargets.Property)]
public class ProNameAttribute : Attribute
{
public string pname { get; set; }
public ProNameAttribute(string pname)
{
this.pname = pname;
}
}
}

//-------------------model【实体】
using System;
namespace C10.ZRF.Model.ModelView
{
using Filter;
[TabName("User")]
public class UserView
{
[PK]
public int uid { get; set; }
public string userName { get; set; }
public string userPwd { get; set; }
public string userPhone { get; set; }
public int? userAge { get; set; }
public bool isdel { get; set; }
[ProName("creatime")]
public DateTime? addTime { get; set; }
public override string ToString()
{
return $"uid={this.uid},userName={this.userName},userPwd={this.userPwd},userPhone={this.userPhone},userAge={this.userAge},";
}
}
}

//-----------------------UI 【显示的界面】
#region ORM
public ActionResult GetEntityByID()
{
UserView obj = MySQlServerORM.GetEntityByID<UserView>(6);
List<UserView> ulist = MySQlServerORM.GetAllList<UserView>();
ViewBag.objinfo =obj==null?"没有查找到": $"uid={obj.uid},姓名={obj.userName},TEL={obj.userPhone}";
string str = string.Empty;
ulist.ForEach(c => { str += (c.ToString() + "<br/>"); });
ViewBag.list = str;
return View();
}

public ActionResult AddEntity()
{ //------参数需要全部提供 需要参数 ‘@userName‘,但未提供该参数
bool flag = MySQlServerORM.Insert<UserView>(new UserView()
{
addTime = DateTime.Now,
isdel = false,
userAge = 19,
userName = "qqAdd",
userPhone = "182191777668",
userPwd = "pwd123"
});
ViewBag.addflag = flag ? "Addok" : "AddError";
return View();
}

public ActionResult DeleteORM()
{
// string deleteResult= MySQlServerORM.DeleteByPrimaryKey<UserView>(5) ? "成功" : "失败";//--根据PK来删除
UserView obj = new UserView { uid = 22 };
//--------根据实体来删除
string deleteResult = MySQlServerORM.DeleteByEntity<UserView>(obj) ? "成功" : "失败";
ViewBag.deleteok = $"数据删除{deleteResult}";
return View();
}
#endregion

原文地址:https://www.cnblogs.com/Fengge518/p/11725522.html

时间: 2024-10-15 18:10:02

通过反射来手写简单的ORM SQlserver的相关文章

手写简单的jq雪花飘落

闲来无事,准备写个雪花飘落的效果,没有写太牛逼的特效,极大的简化了代码量,这样容易读取代码,用起来也很简单,对于那些小白简直是福利啊,简单易读易学.先直接上代码吧,然后再一一讲解,直接复制粘贴就可以拿来用了,改起来更是容易. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>雪花飘落</title> </head> <style

利用Java手写简单的httpserver

前言: 在看完尚学堂JAVA300中讲解如何实现一个最简单的httpserver部分的视频之后, 一.前置知识 1.HTTP协议 当前互联网网页访问主要采用了B/S的模式,既一个浏览器,一个服务器,浏览器向服务器请求资源,服务器回应请求,浏览器再将接收到的回应解析出来展现给用户.这一问一答的过程可以抽象成浏览器向服务器发送一个Request然后服务器返回一个Response的过程 其中Request和Reponse在HTTP中有有具体的格式要求 一个Request的例子 Method Path-

手写简单PE

环境工具:Windows 10 010Editor 目标程序功能: 调用MessageBoxA弹出消息框. 1.构造DOS头 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic number WORD e_cblp; // Bytes on last page of file WORD e_cp; // Pages in file WORD e_crlc; // Relocations WORD

手写简单的php生成Html网页

这个是基本功,以前用到laravel及thinkphp时,这一步,都被设置好了吧. 这里只依靠纯的php环境,而没有任何框架, 而框架,只是将这一切规范化,加快代码效率及减小沟通成本,维护升级也方便,而且还是最佳实践. <?php $looking = isset($_GET['title']) || isset($_GET['author']) ?> <!DOCTYPE html> <html lang='en'> <head> <meta char

手写简单的线程池

线程池的基本原理 声明任务队列.线程数量这两者数量主要由自己init,往队列中添加任务,如果超过数量则等待(阻塞),否则加入线程执行 import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingDeque; public cla

尝试手写orm框架

前言: 在使用各种的orm框架的过程中,菜鸟的我始终没有搞懂底层实现技术,最近刚好没事找了些视频和资料了解一点皮毛,想记录下,大家勿喷. 所谓的ORM(Object Relational Mapping) 对象关系映射 官方解释是通过使用描述对象和数据库之间映射的元数据,将面向对象程序的对象自动持久化到关系数据库中. 个人理解就是一个数据库访问的帮助类,可以让我们不用手写sql,就完成数据库的访问 使用的技术: 泛型.反射.特性.扩展 摸索步骤: step1 新建项目,建几个类库,大家熟悉的三层

手写MyBatis ORM框架实践

一.实现手写Mybatis三个难点 1.接口既然不能被实例化?那么我们是怎么实现能够调用的? 2.参数如何和sql绑定 3.返回结果 下面是Mybatis接口 二.Demo实现 1.创建Maven工程(开发工具Eclipse) 下一步 下一步 然后点击“完成” 2.配置pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema

简单的神经网络算法-手写数字识别

本文通过BP神经网络实现一个简单的手写识别系统. 一.基础知识 1环境 python2.7 需要numpy等库 可利用sudo apt-get install python-安装 2神经网络原理 http://www.hankcs.com/ml/back-propagation-neural-network.html 讲的特别清楚,本实验过程中涉及矩阵运算都用numpy库的函数 3.js的基础知识 http://www.w3school.com.cn/tags/html_ref_canvas.a

简单QT应用到通过手写布局实现QT应用

 新建QT项目 项目结构: 2.打开QT图形编辑界面,通过拖动组件的方式生成如下界面: 3.为确定按钮添加事件.选中按钮à转到槽,截图如下: 点击clicked按钮,添加事件代码如下: 4下面是手动编写一个QT案例: 5.新建QT项目 项目结构: 编写widget.h头文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPushButton>  //按钮对应的头文件 #include <QV