1. 程式人生 > >高效能,靈活,全自動,一站式ORM框架,0學習成本

高效能,靈活,全自動,一站式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 } }
複製程式碼