• dotnet core 数据库


    dotnet core 数据库

    程序开发过程中,需要使用数据对数据进行存储,分析等。通常而言都会使用ORM来实现关系数据库与实体对象的转化,过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

    ORM

    ORM是实现持久化层的一种常用的方式,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。常用的ORM有Dapper,EF,NPOCO等。选择ORM我一般关注一下几点:

    Dapper EF NPOCO
    简单表映射 Y Y Y
    侵入性 N Y N
    LINQ访问 N Y Y
    SQL语句 Y Y Y
    多数据库 Y Y Y
    日志 Y N Y
    性能 一般

    通过一些简单的比较,个人比较在意日志,LINQ使用,侵入性等性质,所以选择NPOCO作为ORM工具。

    安装

    这里使用MySQL数据库存储,首先安装对应的依赖包,使用NuGet安装如下包
    NPoco 3.5.0
    MySql.Data 7.0.7-m61
    安装完成后进行相应还原,为了方便的使用NPOCO中原有的数据操作并进行一些扩展,使用CachedDataAccess继承NPOCO中的Database操作类,代码如下:

    public class CachedDataAccess : Database
    {
    
    }
    

    配置

    在appsettings.json文件中配置连接字符串示例如下:

    {
      "ConnectionStrings": {
        "DefaultConnection": "server=127.0.0.1;userid=xxx;pwd=xxx;port=3306;database=demo;sslmode=none;Allow Zero Datetime=True;Convert Zero Datetime=True;"
      }
    }
    

    在CachedDataAccess使用静态构造获取对应的连接字符串,并利用默认的构造函数初始换对应的连接,这样就可以使用默认构造来初始化使用数据库。

    public class CachedDataAccess : Database
    {
        protected static IConfigurationRoot Configuration { get; }
        protected static string connection { get; set; }
        private ILogger _logger = Log.Logger;
        static CachedDataAccess()
        {
            var builder = new ConfigurationBuilder()
                            .SetBasePath(Directory.GetCurrentDirectory())
                            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
            Configuration = builder.Build();
            connection = Configuration.GetConnectionString("DefaultConnection");
        }
    
        public CachedDataAccess() : base(connection, DatabaseType.MySQL, MySql.Data.MySqlClient.MySqlClientFactory.Instance)
        {
    
        }
    }
    

    操作

    使用NPOCO的常用的数据库操作及使用

    事务

    using (var db = new CachedDataAccess()) 
    {
        db.BeginTransaction();
        //Your CRUD operation here
        db.CompleteTransaction();
    }
    

    增加

    public class MIKO_ACCOUNT 
    {				
        public int ID { get;set; }
        public string ACCOUNT { get;set; };
    }
    
    using (var cda = new CachedDataAccess())
    {
        var item = new MIKO_ACCOUNT();
        item.ACCOUNT = "demo";
        
        cda.BeginTransaction();
        cda.Insert(item);
        cda.CompleteTransaction();
    }
    

    删除

    using (var cda = new CachedDataAccess())
    {
        cda.BeginTransaction();
        cda.Delete<MIKO_ACCOUNT>(p=>p.ACCOUNT == "demo");
        cda.CompleteTransaction();
    }
    

    查询

    using (var cda = new CachedDataAccess())
    {
        cda.BeginTransaction();
        var items = cda.Query<MIKO_ACCOUNT>().Where(p=>p.ACCOUNT == "demo");
        cda.CompleteTransaction();
    }
    

    修改

    using (var cda = new CachedDataAccess())
    {
        cda.BeginTransaction();
        var user = cda.Query<MIKO_ACCOUNT>().Where(p=>p.ACCOUNT == "demo").FirstOrDefault();
        user.ACCOUNT = "new@domain.com";
        db.Update(user);
        cda.CompleteTransaction();
    }
    

    日志

    日志记录对跟踪错误及统计有很重要的意义,NPOCO中可以采用手工重写OnExecutingCommand,OnException方法来实现日志的记录。简单的实现代码如下,其中

    private ILogger _logger = Log.Logger;
    
    protected override void OnExecutingCommand(DbCommand cmd)
    {
        this._logger.Information(FormatCommand(cmd));
    }
    
    protected override void OnException(Exception exception)
    {
        this._logger.Error(exception.Message);
    }
    

    我们执行一个上面的查询语句,在日志中可以看到对应的查询记录如下

    2017-06-24 19:55:48.589 +08:00 [Information] SELECT `M`.`ID` as `ID`,  `M`.`ACCOUNT` as `ACCOUNT`,
    FROM `MIKO_ACCOUNT` `M` 
    WHERE (`M`.`ACCOUNT` = @0)
    	 -> @0 [String] = "demo"
    
  • 相关阅读:
    springboot整合mybatis
    springboot配置mvc拦截器
    ORA-65048:在可插入数据库PDBORCL中处理当前DDL语句时出错 ORA-00959:表空间‘MMMM’不存在
    SI Unit 国际标准单位
    java学习的第二阶段总结
    java学习的第一阶段总结
    vmware学习笔记
    java当中的语法糖
    jvm系统学习笔记
    java中Direct Memory堆外内存
  • 原文地址:https://www.cnblogs.com/SLchuck/p/7082590.html
Copyright © 2020-2023  润新知