高性能,灵活,全自动,一站式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学习成本的主要内容,如果未能解决你的问题,请参考以下文章

高性能RPC框架——Dubbo一站式快速入门

Mybatis源码解析MyBatis解析全局配置文件

MyBatis学习总结——ORM概要与MyBatis快速起步

ORM框架EF

手把手带你从0搭建一个Golang ORM框架(全)!

手把手带你从0搭建一个Golang ORM框架(全)!