ORM框架 Dapper

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

  ---ORM框架的核心思想是对象关系映射,ORM是将表与表之间的操作,映射成对象和对象之间的操作,就是通过操作实体类来达到操作表的目的。从数据库提取的数据会自动按你设置的映射要求封装成特定的对象。之后你就可以通过对对象进行操作来修改数据库中的数据。这时候你面对的不是信息的碎片,而是一个形象鲜明的对象。

二,假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper,这款ROMDapper的优势:

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

四,原生Dapper使用流程:

  0,两种下载使用方法:

  (1),推荐下载方法(使用Nuget下载):

  ---Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展。在使用Visual Studio开发基于.NET Framework的应用时,Nuget能把在项目中添加、移除和更新引用的工作变得更加快捷方便。

---安装成功以后,生成一下网站,项目bin目录下,会生成几个Dapper文件(主要是Dapper.dll,120k)。

  (2),可以在官网上下载Dapper源代码,即SqlMapper.cs文件,在项目中App_Code文件夹中加入这个文件,就像Ado.net中的SqlHelper一样。

  ---源文件地址:https://github.com/StackExchange/dapper-dot-net/blob/master/Dapper%20NET40/SqlMapper.cs

连接帮助类SQLserver、MySQL、SQLite和access

  1,下面可以在项目中开始使用Dapper了

  2,连接数据库字符串。根据不同的数据库进行相应设置,如下SQLserver、MySQL、SQLite和access连接方式。

//using Microsoft.Data.Sqlite;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Data.SQLite;//sqlite 在包控制台安装System.Data.SQLite
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test.DB
{
    public class DBConnHelper
    {

        public IDbConnection DBConnection(string DBtype,string InstanceName, string DBNameOrPath,string PassWord)
        {
            IDbConnection conn = null;
            switch (DBtype)
            {
                case "SqlServer": conn = CreateSqlServerConnection(InstanceName, DBNameOrPath, PassWord); break;
                case "Sqlite": conn = CreateSqliteConnection(DBNameOrPath); break;
                case "MySql": conn = CreateMySqlConnection(DBNameOrPath); break;
                case "Access": conn = CreateAccessConnection(DBNameOrPath, PassWord); break;
            }

            return conn;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="InstanceName">sqlserver实例名</param>
        /// <param name="DBName">数据库名</param>
        /// <param name="passWord">数据库密码</param>
        /// <returns></returns>
        private static IDbConnection CreateSqlServerConnection(string InstanceName, string DBName, string passWord)
        {// "Data Source=.//这里可以用.或者计算的名字(cmd 输入hostname查看),如果前边两个不行就需要计算机名+数据库实例名;Initial Catalog=Test;Persist Security Info = True; User ID = sa;Password = 123; Max Pool Size = 512; Connection Timeout = 10000";
            string HostName = System.Net.Dns.GetHostName();
            HostName = string.IsNullOrWhiteSpace(InstanceName) ? HostName : $@"{HostName}\{InstanceName}";
            string connStr = $"Data Source={HostName};Initial Catalog={DBName};Integrated Security=True";
            if (!string.IsNullOrWhiteSpace(passWord)) connStr = $"Data Source={HostName};Initial Catalog=Test;Persist Security Info = True; User ID = sa;Password ={passWord}; Max Pool Size = 512; Connection Timeout = 10000";

            var conn = new SqlConnection(connStr);
            conn.Open();
            return conn;
        }

        private static IDbConnection CreateSqliteConnection(string DBPath)
        {//"Data Source=D:\\TEST.db"
            SQLiteConnection conn = new SQLiteConnection($"Data Source={DBPath}");
            conn.Open();
            return conn;
        }
        private static IDbConnection CreateMySqlConnection(string serverName)
        {//"Database=mysql_test;Data Source=localhost;User Id=root;Password=123456;CharSet=utf8;port=3306";
            MySqlConnection conn = new MySqlConnection(serverName);
            conn.Open();
            return conn;
        }
        private static IDbConnection CreateAccessConnection(string DBName,string passWord)
        {//"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Data\\jyNew.mdb;Jet OLEDB:Database Password=DB7600;";
            string connStr = $"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={DBName}";
            if (!string.IsNullOrWhiteSpace(passWord)) connStr= $"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={DBName};Jet OLEDB:Database Password={passWord};";
            OleDbConnection conn = new OleDbConnection(connStr);
            conn.Open();
            return conn;
        }
    }
}

手写sql插入数据

using (System.Data.IDbConnection conn = DapperHelper.CreateLocalConnection())
            { 
                //查询返回多条
                string rowsql="select * from Person";
                List<Tperson> list = dbConnection.Query<Tperson>(rowsql, null).ToList();
                //查询返回第一条
                dynamic jktj = conn.Query<dynamic>("select * from Person ",null).FirstOrDefault(); 
                //返回首行首列
                string sql = "select count(*) from Person where  YEAR(创建时间) = DATEPART(year, GETDATE())";
              int 结果 = Convert.ToInt32(conn.ExecuteScalar(sql));
                string Name="张三";
                string sql = $"update Person set name={Name} where id=1";
                return conn.Execute(sql) > 0;
            }

dapper封装方法      query   增删  及事务

使用Insert Update Get时要在包控制台管理工具安装Dapper.Contrib

using Dapper;
using Dapper.Contrib.Extensions;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using WebApi;

namespace Test
{
    public class Test
    {
        public TPerson Getperson(string id)
        {
            using (System.Data.IDbConnection dbConnection = DapperHelper.CreateLocalConnection())
            {
                TPerson 人员 = dbConnection.Get<TPerson>(id);//通过id查询表里的数据   返回实体中所有字段
                //List<TPerson> 人员1 = dbConnection.GetAll<TPerson>().ToList();//返回所有的数据
                return 人员;
            }
        }
        [Table("表_Person")]//对应数据库中的表名
        public class TPerson
        {//使用[ExplicitKey]时不能有ID字段  
            [Key]//数据库表中必须要有id   或者使用[ExplicitKey]
            public string id { get; set; }
            public string name { get; set; }
            public string sex { get; set; }
            public string age { get; set; }
            public string address { get; set; }
            //[NotMapped]
            public string test{get; set;}//扩展属性通过NotMapped, IgnoreInsert, IgnoreSelect, IgnoreUpdate来标识忽略,const字段自动忽略(本片采用Dapper.Contrib不加注解也可以,但是如果使用Dapper.SimpleCRUD要扩展属性的话就需要添加注解)

        }
        /// <summary>
        /// Insert    Update
        /// </summary>
        /// <returns></returns>
        public bool InsertResult()
        {
            using (System.Data.IDbConnection conn = DapperHelper.CreateLocalConnection())
            {
                try
                {
                    TPerson person = new TPerson();
                    person.id = "123";
                    person.name = "123";
                    person.sex = "123";
                    person.age = "123";
                    person.address = "123";
                    long aa = conn.Insert<TPerson>(person);
                    //bool bb= conn.Update<TPerson>(person);
                    if (aa > 0)
                    {
                        return true;
                    }
                    return false;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
        }

        /// <summary>
        /// 事务    
        /// </summary>
        /// <returns></returns>
        public bool Transaction()
        {
            using (System.Data.IDbConnection conn = DapperHelper.CreateLocalConnection())
            {
                List<string> strsql = new List<string>();
                strsql.Add("delete from  表_Person where id=123");
                strsql.Add("insert into 表_Person(id,name,sex,age,address) values(111,'asd','asd','asd','asd')");
                IDbTransaction transaction = conn.BeginTransaction();
                try
                {
                    for (int i = 0; i < strsql.Count; i++)
                    {
                        int aa = conn.Execute(strsql[i], null, transaction);
                    }
                    transaction.Commit();
                    return true;
                }
                catch (Exception exception)
                {

                    transaction.Rollback();
                    return false;
                }
            }

        }
    }
}

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香煎三文鱼

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值