高性能,灵活,全自动,一站式ORM框架,0学习成本
Posted chaeyeon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高性能,灵活,全自动,一站式ORM框架,0学习成本相关的知识,希望对你有一定的参考价值。
Github https://github.com/1448376744/Dapper.Extension
QQ群:642555086
1.框架功能
1.1支持单表操作,CURD
2.2支持所有多表操作,需要自己构建模型
2.3事物与逻辑层分离,使用该框架开发的业务层,可以随意控制业务方法的事物依赖行为(控制反转)。
2.4强大的映射,对大小写,下划线通通不敏感
2.架构组成
2.10 SessionFactory:事物会话工厂,用于创建会话事物。
2.20 ISession:会话的顶级接口,用户事物提交回滚,执行SQL语句。
2.30 DbSession:会话的一个实现类,实现了ISession的全部接口
2.40 SessionProxy:实现了ISesion接口,用于对DbSession做静态代理增强扩展其功能:功能记录执行的SQL语句,查询耗时。
2.50 SqlBuilder:Linq To SQL表达式的实现(注意表达式和语句是两个不同的概念)
2.6 SqlFrom:构建动态完整的基于模型的SQL语句
2.70 AppContainer:IOC代理容器,完成代理业务类的注册,以及业务类的动态代理对象的实现(IOC采用的是Autofac,AOP采用的是Autofac的扩展包)
2.80 ColumnAttribute,TableAttribute:ORM映射注解,当表明与字段名不一致可以通过注解完成映射(一致时可以省略该注解,不分大小写,及大小写不敏感,忽略下划线,如字段ME_CODE自动映射到Me_Code,Mecode,meCode等等)
框架内置映射缓存机制。
2.90 SeviceBase:业务层的顶级接口,规范编程请继承改接口,以便可以基于事物代理,自动管理事物。
2.10 TransactionIntercept:事物拦截器,业务类中的virtual修饰的方法会被改类拦截,完成自动事物代理:事物提交方法,异常回滚,否则提交,回滚请主动抛出SessionException异常。事物依赖行为,如果A,B都是被virtual修饰的
A调用B则会给A创建一个事物,B在A事物中执行。
3.实现运算符重载
IN,NOT IN,Lt,Le,Gt,Ge,Ne,Eq,IS NULLL,IS NOT NULL,BETWEEN,NOT BETWEEN
4.基本CURD
using System;
using System.Drawing;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Common.Library.File;
using Mammothcode.Business.Services;
using Dapper.Extension.Model;
using Dapper.Extension;
using Autofac;
using Common.Library.Data;
using System.Collections.Generic;
using System.Data;
namespace UnitTest
{
[TestClass]
public class UnitTest1
{
#region 创建容器
public IContainer Container { get; set; }
/// <summary>
/// 启动时注册服务
/// </summary>
[TestInitialize]
public void Init()
{
Container = AppContainer.Builder("Mammothcode.Business");
}
[TestCleanup]
public void Dispose()
{
Container.Dispose();
}
/// <summary>
/// 解析组件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public T Resolve<T>()
{
return AppContainer.Resolve<T>();
}
#endregion
[TestMethod]
public void TestMethod1()
{
//获取一个代理会话
var session = SessionFactory.GetSession(true);
//开启事物/关闭自动提交
session.Open(true);
var row = 0;
//Inset
row = session.From<T_SYSTEM_MENUS>().Insert(new T_SYSTEM_MENUS()
{
IsChild = 1,
MuName = "Main",
});
//Update:根据主键字段更新,及更新Id1==3的
session.From<T_SYSTEM_MENUS>().Update(new T_SYSTEM_MENUS()
{
Id = 3,
MuName = "Root"
});
//更新所有字节点的MuName和MuDesc为Child
session.From<T_SYSTEM_MENUS>()
.Set(s => s.MuName, "Child")
.Set(s => s.MuDesc, "Child")
.Where(s => s.IsChild == 1)
.Update();
//Delete:根据Id删除,及删除Id==2的
row = session.From<T_SYSTEM_MENUS>().Delete(new T_SYSTEM_MENUS()
{
Id = 2
});
//Delete:删除所有子节点
row = session.From<T_SYSTEM_MENUS>()
.Where(s => s.IsChild == 1)
.Delete();
//Select ALL:查询菜单子节点并且id在1~23之间的,按Id升序,Sort降序查第一页所有数据
var list = session.From<T_SYSTEM_MENUS>()
.Where(m => m.IsChild == 1 && m.Id.Between(1, 23) && m.MuType.In(new int[] { 1, 2, 3 }))
.Asc(s => s.Id)
.Desc(s => s.Sort)
.Top(0, 10)
.Select();
//Select Single
var entity = session.From<T_SYSTEM_MENUS>()
.Where(m => m.IsChild == 1)
.Asc(s => s.Id)
.Desc(s => s.Sort)
.Single();
//dynamic Select 动态查询
//前台请求参数:分页
var req = new SystemMenusModel()
{
PageIndex = 1,
PageSize = 10,
MuName = "cc"
};
//分页查询:必须条件IsChild==1,动态条件MuName不为空则MuName必须包含cc
req.Query
.And(s => s.IsChild == 1)
.AndThen(req.MuName != null, s => s.MuName.Like(req.MuName));
list = session.From<T_SYSTEM_MENUS>()
.Where(req.Query)
.Asc(s => s.MuType)
.SkipPage(req)
.Select();
//多表链接
session.From<Student_Coures>()
.Where(s => s.Sid > 10)
.SelectMap(s=>new//由于a.id无法映射到Id自动,通过SelectMap映射查询可以得到 a.id as id(注解+属性)
{
s.Id,
s.Date,
s.CourseNAme,
s.StudentName
});
session.Commit();
session.Rollback();//应该写在catch里
session.Close();//应该写在finally里
}
[Table("student as a join course as b on a.id=b.sid")]//灵活的完成表链接
public class Student_Coures
{
[Column("a.id")]
public int Id { get; set; }
[Column("b.id")]
public int Sid { get; set; }
[Column("a.name")]
public string StudentName { get; set; }
[Column("b.name")]
public int CourseNAme { get; set; }
[Column("DATE(a.createtime)")]//灵活的调用mysql函数
public string Date { get; set; }
}
}
}
5.使用事物代理开发:MVC
//在Global.asax文件中完成组件注册
namespace Mammothcode.AdminWeb
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
//注册:Mammothcode.Business程序集中,所有实现了ServiceBase类的组件
AppContainer.Builder("Mammothcode.Business");
}
}
}
namespace Mammothcode.Business.Services
{
public class AdminService : SeviceBase
{
#region 用户登入接口
/// <summary>
/// 用户登入
/// 王剑锋
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public virtual ActionModel Login(SystemAdminModel req)
{
var message = string.Empty;
var result = false;
var data = new object();
while (true)
{
#region 非空验证
if (string.IsNullOrEmpty(req.Account))
{
message = "账号不能为空";
break;
}
if (string.IsNullOrEmpty(req.Password))
{
message = "密码不能为空";
break;
}
#endregion
#region 判断用户名是否正确
var user = Session.From<T_SYSTEM_ADMIN>()
.Where(a => a.Account == req.Account && a.Password == req.Password.ToMd5_16Bit())
.Single();
if (user == null)
{
message = "用户名或密码错误";
break;
}
#endregion
#region 登入成功返回模型
result = true;
data = new
{
user.AuName,
Token = new
{
user.AuCode,
user.AuName,
user.Account,
ExpiryTime = DateTime.Now.AddDays(3)
}.ToJson().ToBase64(),
};
#endregion
break;
}
return new ActionModel()
{
data = data,
description = message,
issuccess = result
};
}
/// <summary>
/// 验证Token是否失效
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public virtual ActionModel CheckLogin(SystemAdminModel req)
{
var message = string.Empty;
var result = false;
var data = new object();
while (true)
{
if (string.IsNullOrEmpty(req.Token))
{
break;
}
var token = req.Token.FromBase64().FromJson();
if (Convert.ToDateTime(token["ExpiryTime"]) != null && Convert.ToDateTime(token["ExpiryTime"]) > DateTime.Now)
{
result = true;
}
break;
}
return new ActionModel()
{
data = data,
description = message,
issuccess = result
};
}
#endregion
}
}
以上是关于高性能,灵活,全自动,一站式ORM框架,0学习成本的主要内容,如果未能解决你的问题,请参考以下文章