• asp.net core系列 66 Dapper介绍--Micro-ORM


    一.概述

      目前对于.net的数据访问ORM工具很多,EF和EF Core是一个重量级的框架。最近在搭建新的项目架构,来学习一下轻量级的数据访问ORM工具Dapper。Dapper支持SQL Server,MySQL,Sqlite,SqlCE,Firebird等的高性能Micro-ORM(微ORM框架)。最新版本是1.60.16。

        Dapper扩展了IDbConnection接口,例如实现一个查询方法,Dapper定义的一个Query查询方法如下:

      public static IEnumerable<T> Query<T>(this IDbConnection cnn, string sql, object param = null, SqlTransaction transaction = null, bool buffered = true)

        原生态ado.net的System.Data.SqlClient也实现了IDbConnection接口,可参考如下:

        https://docs.microsoft.com/en-us/dotnet/api/system.data.idbconnection?redirectedfrom=MSDN&view=netframework-4.8

        Dapper开源地址:https://github.com/StackExchange/Dapper

        Dapper Nuget包: https://www.nuget.org/packages/Dapper/

      Dapper的主要特征包括:

        (1)     支持强类型。如查询 Query<T>

        (2)     支持动态对象。在Dapper. Rainbow扩展包中有实现

        (3)     使用Execute执行执行T-SQL脚本块,不返回结果。

        (4)     批量执行SQL语句。

        (5)     “性能”是Dapper的一个亮点。官方列出了查询(select)与其它的ORM工具性能的对比参数。

        (6)     参数化查询

        (7)     列表支持

        (8)     字面替换

        (9)     对于查询的缓冲与无缓冲,默认行为是缓冲将数据交给了后端List,获得数据后,就释放了任何资源(减少了数据库共享锁等)。对于大量查询(比如:>100条),需要将缓冲行为关闭,避免占用太多内存,设置buffered:false的Query方法。  “注意缓冲不是缓存”。

            dapper buffer/cache

        (10)  实体中外键关系表映射。

        (11)  允许单个查询请求,查询多个表。如:select table1,select table2

        (12)  支持程序中数据库事务处理。

      Dapper注意事项:

        (1) Dapper缓存用来保存每个查询的信息,缓存在ConcurrentDictionary对象中,如果不使用参数的情况下动态生成sql字符串,则可能会遇到内存问题。

        (2) Dapper的简洁性意味着ORM附带的许多功能都被剥离了。它担心95%的情况,并为您提供大多数时间所需的工具。它并不试图解决所有问题。

    二. Dapper源代码包

      2.1 Dapper.Contrib包

        Dapper.Contrib是包含许多用于CURD的辅助方法Contrib的关键组成部分是它为您的实体提供跟踪,以确定是否已进行更改。与EF一样GET出来的实现,在Update方法时,仅更新已更改的属性所需的SQL。Dapper.Contrib中的扩展方法的完整列表,可以看出方法都是强类型

    T Get<T>(id);
    IEnumerable<T> GetAll<T>();
    int Insert<T>(T obj);
    int Insert<T>(Enumerable<T> list);
    bool Update<T>(T obj);
    bool Update<T>(Enumerable<T> list);
    bool Delete<T>(T obj);
    bool Delete<T>(Enumerable<T> list);
    bool DeleteAll<T>();

        Dapper将自动使用名为“ id”(不区分大小写)的属性作为Key 属性(所以数据表中最好以ID名称为主键), 如果实体不遵循此约定,请使用[Key][ExplicitKey]属性修饰特定属性。[Key]应该用于数据库生成的键(例如自动增量列),而[ExplicitKey]应该用于代码中生成的显式键值

    public class User
    {
        [Key]
        int TheId { get; set; }
        string Name { get; set; }
        int Age { get; set; }
    }

        Dapper.Contrib使用了一些可选属性:[Table("Tablename")] - 使用另一个表名而不是类的名称,如下示例:

    [Table ("emps")]
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
    } 

        [Write(true/false)] - 这个属性是(不)可写的
        [Computed] - 此属性已计算,不应作为更新的一部分

       具体参考 https://github.com/StackExchange/Dapper/tree/master/Dapper.Contrib

      2.2 Dapper.EntityFramework包

        Dapper.EntityFramework和Dapper.EntityFramework.StrongName依赖了entityframework 6.1.3 的DbGeography类和Microsoft.SqlServer.Types的SqlGeography类,  从数据库中读取几何和地理值时,我们需要明确指定SRID以将其保留在DbGeometry / DbGeography类型中。

      2.3 Dapper. Rainbow包

        Rainbow是一个Abstract类,可以将其用作Dapper类的基类,实现CURD的方法,以Dynamic为主的动态类型用于插入、更新、以及查询参数的实现,输出返回强类型。Rainbow希望你的所有表都有一个名为“Id”的标识列,在Dapper源代码解决方案下没有Dapper. Rainbow组件的测试案例

        Contrib和Rainbow之间的主要区别在于:一个跟踪您实体的变化,另一个不跟踪:

        (1)  如果希望能够跟踪实体中的更改,请使用Contrib。

        (1)  当您想要使用更符合标准ADO.NET方法的内容时,请使用Rainbow。

      2.4 Dapper.SqlBuilder包

        Dapper.SqlBuilder组件,用于动态构建SQL查询。

      2.5  Dapper.StrongName与Dapper包

        StrongName包下的所有类文件都是来源于Dapper包中的类,支持SQL Server,MySQL,Sqlite,SqlCE,Firebird等的高性能Micro-ORM, 用于强名称,使用SqlMapper来实现ADO.NET的轻量级对象映射器。

    三.其它扩展包

      3.1 Dapper. SimpleCRUD

        SimpleCRUD是一个简单CRUD助手,可以选择更改数据库方言。默认为Microsoft SQL Server,但可以更改为PostgreSQL或MySQL。放弃了.Net Core版本的SQLite支持(在新项目中实用)。

      3.2 Dapper.Extensions.NetCore

        Dapper是一个简单的CRUD助手。在Nuget上还有其它Dapper.Extensions.xx的扩展包。

  • 相关阅读:
    Spark-sql windows 下 执行错误.
    notepad ++ 注册表
    log4j 配置文件 示例
    linux 查看 进程 内存占用
    spring boot 常见错误解决
    python 轻量 web 框架 Bottle 使用
    Spring cloud eureka 添加 spring-security
    vue can‘ not resolver sass-loader 的 解决办法。
    外国人眼中的珍珠奶茶是啥?
    75.2亿美元:诺基亚、微软终于在一起
  • 原文地址:https://www.cnblogs.com/MrHSR/p/11082111.html
Copyright © 2020-2023  润新知