一,介绍: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;
}
}
}
}
}