zoukankan      html  css  js  c++  java
  • Dapper.NET

    Dapper.NET使用

    • 1、为什么选择Dapper
    • 2、以Dapper(4.0)为例。
    • 2.1 在数据库中建立几张表。
    • 2.2实体类。
    • 3.使用方法
    • 3.1  一对一映射
    • 3.2 一对多映射
    • 3.3 插入实体
    • 3.4 执行存储过程

    Dapper是一款轻量级ORM工具(Github)。如果你在小的项目中,使用Entity Framework、NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀。你又觉得ORM省时省力,这时Dapper 将是你不二的选择。

    1、为什么选择Dapper

    1. 轻量。只有一个文件(SqlMapper.cs),编译完成之后只有120k(好象是变胖了)
    2. 速度快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。
    3. 支持多种数据库。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server
    4. 可以映射一对一,一对多,多对多等多种关系。
    5. 性能高。通过Emit反射IDataReader的序列队列,来快速的得到和产生对象,性能不错。
    6. 支持FrameWork2.0,3.0,3.5,4.0,4.5

    2、以Dapper(4.0)为例。

    2.1 在数据库中建立几张表。

    复制代码
    CREATE TABLE [dbo].[CICUser]
    (
        [UserId]                [int] IDENTITY(1, 1) PRIMARY KEY NOT NULL,
        [Username]              [nvarchar](256) NOT NULL,
        [PasswordHash]          [nvarchar](500) NULL,
        [Email]                 [nvarchar](256) NULL,
        [PhoneNumber]           [nvarchar](30) NULL,
        [IsFirstTimeLogin]      [bit] DEFAULT(1) NOT NULL,
        [AccessFailedCount]     [int] DEFAULT(0) NOT NULL,
        [CreationDate]          [datetime] DEFAULT(GETDATE()) NOT NULL,
        [IsActive]              [bit] DEFAULT(1) NOT NULL
    )
    
    CREATE TABLE [dbo].[CICRole]
    (
        [RoleId]       [int] IDENTITY(1, 1) PRIMARY KEY NOT NULL,
        [RoleName]     [nvarchar](256) NOT NULL,
    )
    
    CREATE TABLE [dbo].[CICUserRole]
    (
         [Id]   [int] IDENTITY(1, 1) PRIMARY KEY NOT NULL,
         [UserId]  [int] FOREIGN KEY REFERENCES [dbo].[CICUser] ([UserId]) NOT NULL,
         [RoleId]  [int] FOREIGN KEY REFERENCES [dbo].[CICRole] ([RoleId]) NOT NULL
    )
    复制代码

    2.2实体类。

    在创建实体类时,属性名称一定要与数据库字段一一对应。

    复制代码
    public class User
        {
            public User()
            {
                Role = new List<Role>();
            }
            public int UserId { get; set; }
            public string UserName { get; set; }       
            public string Password { get; set; }
            public string Email { get; set; }
            public string PhoneNumber { get; set; }
            public bool IsFirstTimeLogin { get; set; }
            public int AccessFailedCount { get; set; }
            public DateTime CreationDate { get; set; }
            public bool IsActive { get; set; }
            public List<Role> Role { get; set; }
        }
     public class Role
        {
            public int RoleId { get; set; }
            public string RoleName { get; set; }
        }
     public class Customer
        {
            public int UserId { get; set; }
            public string UserName { get; set; }       
            public string Password { get; set; }
            public string Email { get; set; }
            public string PhoneNumber { get; set; }
            public bool IsFirstTimeLogin { get; set; }
            public int AccessFailedCount { get; set; }
            public DateTime CreationDate { get; set; }
            public bool IsActive { get; set; }
            public Role Role { get; set; }
        }    
    复制代码

    3.使用方法

    3.1  一对一映射

    复制代码
      private static SqlConnection GetSqlConnection(string sqlConnectionString)
      {
         SqlConnection conn = new SqlConnection(sqlConnectionString);
         conn.Open();
         return conn;
      }
     private static void OneToOne(string sqlConnectionString)
            {
                List<Customer> userList = new List<Customer>();
                using (IDbConnection conn = GetSqlConnection(sqlConnectionString))
                {
                    string sqlCommandText = @"SELECT c.UserId,c.Username AS UserName,
    c.PasswordHash AS [Password],c.Email,c.PhoneNumber,c.IsFirstTimeLogin,c.AccessFailedCount,
    c.CreationDate,c.IsActive,r.RoleId,r.RoleName 
        FROM dbo.CICUser c WITH(NOLOCK) 
    INNER JOIN CICUserRole cr ON cr.UserId = c.UserId 
    INNER JOIN CICRole r ON r.RoleId = cr.RoleId";
                    userList = conn.Query<Customer, Role, Customer>(sqlCommandText, 
                                                                    (user, role) => { user.Role = role; return user; },
                                                                    null,
                                                                    null,
                                                                    true, 
                                                                    "RoleId", 
                                                                    null,
                                                                    null).ToList();
                }
    
                if (userList.Count > 0)
                {
                    userList.ForEach((item) => Console.WriteLine("UserName:" + item.UserName +
                                                                 "----Password:" + item.Password + 
                                                                 "-----Role:" + item.Role.RoleName +
                                                                 "
    "));
    
                    Console.ReadLine();
                }
            }
    复制代码

    3.2 一对多映射

    复制代码
    private static void OneToMany(string sqlConnectionString)
            {
                Console.WriteLine("One To Many");
                List<User> userList = new List<User>();
    
                using (IDbConnection connection = GetSqlConnection(sqlConnectionString))
                {
    
                    string sqlCommandText3 = @"SELECT c.UserId,
           c.Username      AS UserName,
           c.PasswordHash  AS [Password],
           c.Email,
           c.PhoneNumber,
           c.IsFirstTimeLogin,
           c.AccessFailedCount,
           c.CreationDate,
           c.IsActive,
           r.RoleId,
           r.RoleName
    FROM   dbo.CICUser c WITH(NOLOCK)
           LEFT JOIN CICUserRole cr
                ON  cr.UserId = c.UserId
           LEFT JOIN CICRole r
                ON  r.RoleId = cr.RoleId";
    
                    var lookUp = new Dictionary<int, User>();
                    userList = connection.Query<User, Role, User>(sqlCommandText3,
                        (user, role) =>
                        {
                            User u;
                            if (!lookUp.TryGetValue(user.UserId, out u))
                            {
                                lookUp.Add(user.UserId, u = user);
                            }
                            u.Role.Add(role);
                            return user;
                        }, null, null, true, "RoleId", null, null).ToList();
                    var result = lookUp.Values;
                }
    
                if (userList.Count > 0)
                {
                    userList.ForEach((item) => Console.WriteLine("UserName:" + item.UserName +
                                                 "----Password:" + item.Password +
                                                 "-----Role:" + item.Role.First().RoleName +
                                                 "
    "));
    
                    Console.ReadLine();
                }
                else
                {
                    Console.WriteLine("No Data In UserList!");
                }
            }
    复制代码

    3.3 插入实体

    复制代码
     public static void InsertObject(string sqlConnectionString)
            {
                string sqlCommandText = @"INSERT INTO CICUser(Username,PasswordHash,Email,PhoneNumber)VALUES(
        @UserName,
        @Password,
        @Email,
        @PhoneNumber
    )";
                using (IDbConnection conn = GetSqlConnection(sqlConnectionString))
                {
                    User user = new User();
                    user.UserName = "Dapper";
                    user.Password = "654321";
                    user.Email = "Dapper@infosys.com";
                    user.PhoneNumber = "13795666243";
                    int result = conn.Execute(sqlCommandText, user);
                    if (result > 0)
                    {
                        Console.WriteLine("Data have already inserted into DB!");
                    }
                    else
                    {
                        Console.WriteLine("Insert Failed!");
                    }
    
                    Console.ReadLine();
                }
            }
    复制代码

    3.4 执行存储过程

    复制代码
             /// <summary>
            /// Execute StoredProcedure and map result to POCO
            /// </summary>
            /// <param name="sqlConnnectionString"></param>
            public static void ExecuteStoredProcedure(string sqlConnnectionString)
            {
                List<User> users = new List<User>();
                using (IDbConnection cnn = GetSqlConnection(sqlConnnectionString))
                {
                    users = cnn.Query<User>("dbo.p_getUsers", 
                                            new { UserId = 2 },
                                            null, 
                                            true, 
                                            null, 
                                            CommandType.StoredProcedure).ToList();
                }
                if (users.Count > 0)
                {
                    users.ForEach((user) => Console.WriteLine(user.UserName + "
    "));
                }
                Console.ReadLine();
            }
    复制代码
    复制代码
            /// <summary>
            /// Execute StroedProcedure and get result from return value
            /// </summary>
            /// <param name="sqlConnnectionString"></param>
            public static void ExecuteStoredProcedureWithParms(string sqlConnnectionString)
            {
                DynamicParameters p = new DynamicParameters();
                p.Add("@UserName", "cooper");
                p.Add("@Password", "123456");
                p.Add("@LoginActionType", null, DbType.Int32, ParameterDirection.ReturnValue);
                using (IDbConnection cnn = GetSqlConnection(sqlConnnectionString))
                {
                    cnn.Execute("dbo.p_validateUser", p, null, null, CommandType.StoredProcedure);
                    int result = p.Get<int>("@LoginActionType");
                    Console.WriteLine(result);
                }
    
                Console.ReadLine();
            }
    复制代码
     
     
    --//储存过程分页sql脚本
    USE [Xindongai_App]

    GO
    /****** Object: StoredProcedure [dbo].[sp_DapperPager] Script Date: 2017/02/10 12:23:40 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    Create PROCEDURE [dbo].[sp_DapperPager]
    ( @TableName VARCHAR(1000), --表名,多表是请使用 tA a inner join tB b On a.AID = b.AID
    @PrimaryKey NVARCHAR(100), --主键,可以带表头 a.AID
    @Fields NVARCHAR(2000) = '*',--读取字段
    @Condition NVARCHAR(3000) = '',--Where条件
    @PageIndex INT = 1, --开始页码
    @PageSize INT = 10, --页大小
    @Order NVARCHAR(200) = '', --排序字段
    @TotalItemCount INT = 0 OUT
    )
    AS
    DECLARE @strWhere VARCHAR(2000)
    DECLARE @strsql NVARCHAR(3900)
    IF @Condition IS NOT NULL AND len(ltrim(rtrim(@Condition)))>0
    BEGIN
    SET @strWhere = ' WHERE ' + @Condition + ' '
    END
    ELSE
    BEGIN
    SET @strWhere = ''
    END

    IF (charindex(ltrim(rtrim(@PrimaryKey)),@Order)=0)
    BEGIN
    IF(@Order='')
    SET @Order = @PrimaryKey + ' DESC '
    ELSE
    SET @Order = @Order+ ' , '+@PrimaryKey + ' DESC '
    END
    SET @strsql = 'SELECT @TotalItemCount = Count(1) FROM ' + @TableName + @strWhere
    EXECUTE sp_executesql @strsql ,N'@TotalItemCount INT output',@TotalItemCount OUTPUT
    IF @PageIndex = 1 --第一页提高性能
    BEGIN
    SET @strsql = 'SELECT TOP ' + str(@PageSize) +' '+@Fields
    + ' FROM ' + @TableName + ' ' + @strWhere + ' ORDER BY '+ @Order
    END
    ELSE
    BEGIN
    /* Execute dynamic query */
    DECLARE @START_ID NVARCHAR(50)
    DECLARE @END_ID NVARCHAR(50)
    SET @START_ID = CONVERT(NVARCHAR(50),(@PageIndex - 1) * @PageSize + 1)
    SET @END_ID = CONVERT(NVARCHAR(50),@PageIndex * @PageSize)
    SET @strsql = ' SELECT *
    FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@Order+') AS rownum,
    '+@Fields+ '
    FROM '+@TableName + @strWhere +') AS XX
    WHERE rownum BETWEEN '+@START_ID+' AND ' +@END_ID +' ORDER BY XX.rownum ASC'
    END
    EXEC(@strsql)
    RETURN

     
     
     
     
  • 相关阅读:
    Count on a tree
    图论1 1009
    DP2 1008
    DP1 1008
    NOIP 模拟 1006
    2019 CSP-S 初赛退役记
    9.13——TEST NOIP模拟测试
    [洛谷P2387][NOI2014]魔法森林
    [洛谷P2596][ZJOI2006]书架
    [BZOJ4241]历史研究
  • 原文地址:https://www.cnblogs.com/Gxiaopan/p/4242099.html
Copyright © 2011-2022 走看看