高性能,灵活,全自动,一站式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 } }
复制代码

猜你喜欢

转载自www.cnblogs.com/chaeyeon/p/10016478.html