• <sup id="6cuck"><object id="6cuck"></object></sup>
  • 一聚教程网:一个值得你收藏的教程网站

    最新下载

    .NET Core Dapper操作mysql数据库的实现教程

    时间:2019-05-06 17:53:09 编辑:猪哥 来源:转载

    现在ORM盛行,市面上已经出现了N款不同的ORM套餐了。今天,我们不谈EF,也不聊神马黑马,就说说 Dapper。如何在.NET Core中使用Dapper操作Mysql数据库呢,让我们跟随镜头(手动下翻)一看究竟。

    配置篇

    俗话说得好,欲要善其事必先利其器。首先,我们要引入MySql.Data 的Nuget包。有人可能出现了黑人脸,怎么引入。也罢,看在你骨骼惊奇的份上,我就告诉你,两种方式:

    第一种方式

    Install-Package MySql.Data -Version 8.0.15

    复制上面命令行 在程序包管理控制台中执行,什么?你不知道什么是程序包管理控制台?OMG,也罢,看在你骨骼惊奇的份上,我就告诉你

    手点路径:工具 → NuGet包管理器 → 程序包管理控制台

    第二种方式

    手点路径:右键你需要引入包的项目的依赖项 → 管理NuGet程序包  → 浏览里面输入 MySql.Data

    直接安装即可,因为我已经安装过了,所以这里是卸载或者更新

    同样的方式你需要引入:

    Microsoft.AspNetCore.All
    MySql.Data.EntityFrameworkCore、
    Dapper
    Microsoft.Extensions.Configuration.Abstractions
    Microsoft.Extensions.Configuration.FileExtensions
    Microsoft.Extensions.Configuration.Json

    教学篇

    玩儿过.NET Core 的都知道配置文件我们一般都放在appsettings.json 文件中,但是有个问题,如果我们使用数据库连接字符串,直接存放明文的user name和passWord,真的安全吗?这里我们不对安全性做讨论,我们在连接字符串中 用占位符控制我们的多数据库情况,然后用userName以及passWord充当我们密码(后面会被替换掉),所以看起来是这个样子:

     "ConnectionStrings": {
      "DefaultConnection": "server=服务器;port=端口号;database=regatta{0};SslMode=None;uid=userName;pwd=passWord;Allow User Variables=true"
     },

    接下来,我们新建一个BaseRepository 用于读取Configuration,以及设置MySqlConnection:

    public class BaseRepository : IDisposable
      {
        public static IConfigurationRoot Configuration { get; set; }
    
        private MySqlConnection conn;
    
        public MySqlConnection GetMySqlConnection(int regattaId = 0, bool open = true,
          bool convertZeroDatetime = false, bool allowZeroDatetime = false)
        {
          IConfigurationBuilder builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json");
    
          Configuration = builder.Build();
          
    
          string cs = Configuration.GetConnectionString("DefaultConnection");
          cs = regattaId == 0 ? string.Format(cs, string.Empty) : string.Format(cs, "_" + regattaId.ToString());
    
          cs = cs.Replace("userName", "真正的账号").Replace("passWord", "真正的密码");
          var csb = new MySqlConnectionStringBuilder(cs)
          {
            AllowZeroDateTime = allowZeroDatetime,
            ConvertZeroDateTime = convertZeroDatetime
          };
          conn = new MySqlConnection(csb.ConnectionString);
          return conn;
        }
    public void Dispose()
    {
    if (conn != null && conn.State != System.Data.ConnectionState.Closed)
    {
    conn.Close();
    }
    }
    
    }
    

    好了,创建完毕,我们该如何使用呢,比方说 现在有个CrewManagerRepository类用于操作数据库,我们只需要让此类 继承BaseRepository , 示例如下

      /// 
        /// 根据赛事Id、用户Id获取用户基本信息
        /// 
        /// 赛事Id
        /// 用户Id
        /// 
        public async Task<实体对象> FindUserByAccount(int regattaId, int userId)
        {
          try
          {
            var cmdText =
              @"select b.id_number as IdentifierId,b.isvalid as Isvalid,a.name as Name,a.userid as InternalId,a.sex as Sexual,a.sex as SexTypeId,a.age as Age,
                    c.isprofessional as IsProfessional,c.role_type as RoleTypeId,a.weight as Weight,a.height as Height, a.phone as PhoneNumber,a.thumb_image as ThubmnailImage,
                    a.image as Image,c.athlete_id as AthleteId from 表1 a left join 表2 b on a.userid=b.id 
                    left join 表3 c on b.id=c.centralid where a.userid=@userId;";
              //此处可以根据传入的regattaId访问不同的数据库
            using (var conn = GetMySqlConnection(regattaId))
            {
              if (conn.State == ConnectionState.Closed)
              {
                await conn.OpenAsync();
              }
    
              var memberModel = conn
                .Query<实体对象>(cmdText, new { userId = userId }, commandType: CommandType.Text)
                .FirstOrDefault();
              return memberModel ?? new MemberDetail();
            }
          }
          catch (Exception ex)
          {
            _logger.LogError(ex, "FindUserByAccount by Id Failed!");
            throw;
          }
    
    
        }
    
    

    那有同学可能有黑人脸出现了,如果需要事务呢(露出嘴角的微笑)?

    public async Task DeleteXXX(int regattaId, int id, int userId)
        {
          var result = false;
          using (var conn = GetMySqlConnection(regattaId))
          {
            if (conn.State == ConnectionState.Closed)
            {
              await conn.OpenAsync();
            }
    
            using (var transaction = conn.BeginTransaction())
            {
              try
              {
                const string sqlDelClub =
                  @"delete from 表名 where 字段1=@clubId;
                   delete from 表名2 where 字段2=@clubId;
                   delete from 表名3 where 字段3=@userId and clubinfo_id=@clubId;";
    
                await conn.QueryAsync(sqlDelClub, new
                {
                  clubId = id,
                  userId = userId,
                }, commandType: CommandType.Text);
    
                transaction.Commit();
    
                result = true;
              }
              catch (Exception e)
              {
                Console.WriteLine(e);
                transaction.Rollback();
                result = false;
                throw;
              }
            }
    
            return result;
          }
        }
    
    

    这样,用Transaction将执行代码块包起来,如果出现异常,在catch中 进行Rollback(回滚事务),就可以保证了数据的一致性。如果是高并发场景,可能还会需要用到锁,这里暂时不做延伸讨论。

    如果是返回集合,也很容易处理:

    public async Task> GetClubsByUserId(int regattaId, int userId)
        {
          using (var conn = GetMySqlConnection(regattaId))
          {
            if (conn.State == ConnectionState.Closed)
            {
              await conn.OpenAsync();
            }
    
            const string sql =
              @"select b.club_id as id,c.name,c.image as ImageData,c.year,c.address,c.creator,c.description,b.contact ,b.phone,b.isvalid from 表1 a left join 表2 b on 
               a.clubinfo_id=b.club_id left join 表3 c on 
               b.clubbase_id=c.club_id where a.authorize_userid=@user_Id";
            List<实体> clubDetailList =
              (await conn.QueryAsync<实体>(sql, new { user_Id = userId }, commandType: CommandType.Text))
              .ToList();
    
            return clubDetailList;
          }
        }
    
    

    关于Dapper的示例 本文就讲到这儿,大家可以上官网浏览了解更多:

    https://dapper-tutorial.net/

    文章评论

    热门栏目

    65期玄机挂牌资料 平谷区| 陵川县| 巧家县| 荃湾区| 当雄县| 沭阳县| 恭城| 蚌埠市| 桑日县| 江北区| 福鼎市| 疏附县| 景洪市| 双鸭山市| 措勤县| 滁州市| 黔西| 景谷| 金平| 漳平市| 白银市| 青阳县| 类乌齐县| 菏泽市| 辽源市| 缙云县| http://www.sya5850.tw 都匀市| 长泰县| 仪征市| 泰安市| 和田市| 南雄市| 巧家县| 四川省| 松江区| 津南区| 宝山区| 清苑县| 贵溪市| 宜宾市| 新余市| 龙海市| 苗栗市| 满洲里市| 分宜县| 盈江县| 湄潭县| 兴业县| 天镇县| 故城县| 荣成市| 洪江市| 林芝县| 湖北省| 贺兰县| http://www.hlxisd.co 镶黄旗| 阿巴嘎旗| 黄大仙区| 旺苍县| 昆明市| 扎兰屯市| 叶城县| 马尔康县| 阿克| 霸州市| 沙湾县| 华阴市| 贺州市| 洪泽县| 红桥区| 临城县| 日照市| 惠来县| 金溪县| 南阳市| 商水县| 玉龙| 罗定市| 乌兰察布市| 米泉市| 涿州市| 册亨县| 会昌县| 万荣县| 淅川县| 秦安县| 渭源县| 射阳县| 灌南县| http://wudwvxu.tw 隆化县| 盐边县| 古浪县| 茌平县| 略阳县| 昌图县| 西乌| 罗田县| 独山县| 长丰县| 白银市| 邵东县| 浦城县| 桑植县| 达州市| 彩票| 吐鲁番市| 剑川县| 张家口市| 凤阳县| 固原市| 南郑县| 霞浦县| 印江| 江津市| 郓城县| 湖口县| 襄汾县| 会东县| http://www.hqm766.co 泗水县| 合江县| 平和县| 汤原县| 孟州市| 白银市| 唐河县| 阿克苏市| 河北区| 台湾省| 青阳县| 璧山县| 金沙县| 东方市| 高碑店市| 紫云| 扶沟县| 内黄县| 惠东县| 吐鲁番市| 鄄城县| 咸宁市| 汝阳县| 邹平县| 南通市| 陆丰市| 兰西县| 红原县| 高要市| http://www.zhwzyor.tw 巴马| 武功县| 财经| 江陵县| 舟曲县| 兖州市| 聂拉木县| 石家庄市| 衡南县| 乐山市| 岳池县| 中宁县| 花莲市| 温州市| 舒城县| 西吉县| 镇雄县| 罗田县| 浦县| 大埔县| 博湖县| 勃利县| 河南省| 朝阳区| 措勤县| 台南市| 玉龙| 玉环县| http://www.4334cxq.tw 陆河县| 界首市| 阜新市| 青冈县| 施秉县| 太仆寺旗| 台东市| 牡丹江市| 衢州市| 怀宁县| 通城县| 宁国市| 翁牛特旗| 城口县| 西林县| 图木舒克市| 澄城县|