Dapper:小型ORM,速度快,支持多数据库,灵活性高,性能高,支持多个.net版本,语法简单,可扩展性强
目录
一、Dapper特点
Dapper 特点:
小型ORM:Dapper是一个轻型的ORM类。源码代码量少,编译后就40K的一个很小的Dll.;
速度快:Dapper的速度接近与IDataReader,取列表的数据超过了DataTable;
支持多数据库:Dapper支持Mysql,SqlLite,Mssql,Oracle等一系列的数据库;
灵活性高:支持一对多 多对多的关系,无XML无属性。代码以前怎么写现在还怎么写;
性能高:通过Emit反射IDataReader的序列队列,来快速的得到和产生对象;
支持.net版本:支持多个版本.Net,如:.Net Framework和.Net Core;
可扩展性强:语法简单,并且无须迁就数据库的设计。
二、常用方法
1.准备
安装
本文使用的是.Net6版本,通过NuGet安装相应版本的Dapper和MySql.Data:
dotnet add package Dapper --version 2.0.123
dotnet add package MySql.Data --version 8.0.32.1
创建表格,这里使用的是MySql5.5:
/* 创建表 */
CREATE TABLE `assignment` (
`assignmentNo` decimal(4,0) NOT NULL,
`empno` varchar(10) DEFAULT NULL,
`content` varchar(50) DEFAULT NULL,
PRIMARY KEY (`assignmentNo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `dept` (
`deptno` decimal(4,0) NOT NULL,
`deptname` varchar(20) DEFAULT NULL,
PRIMARY KEY (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `emp` (
`empno` decimal(4,0) NOT NULL,
`ename` varchar(10) DEFAULT NULL,
`job` varchar(20) DEFAULT NULL,
`hiredate` datetime DEFAULT NULL,
`sal` decimal(10,0) DEFAULT NULL,
`deptno` decimal(4,0) DEFAULT NULL,
PRIMARY KEY (`empno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Dapper使用三个步骤:
创建一个IDbConnection接口对象;
编写一个查询SQL来执行CRUD操作;
将查询SQL作为Execute方法的参数传递。
2. Execute
Execute 是一个可以从 IDbConnection 类型的任意对象调用的扩展方法,它可以执行一个或多个命令并返回受影响的行数。
参数:
参数 | 含义 |
sql | 要执行的命令文本 |
param | 命令参数(默认为null ) |
transaction | 需要使用的事务(默认为null ) |
commandTimeout | 命令执行超时时间(默认为null ) |
commandType | 命令类型(默认为null ) |
代码如下(示例):
INSERT语句
执行单次INSERT语句
string sql = "INSERT INTO emp(empno,ename,job,hiredate,sal) Values (@empno,@ename,@job,@hiredate,@sal);";
using (var connection = BaseRepository.GetMySqlConnection())
{
connection.Open();
var affectedRows = connection.Execute(sql, new { empno = 7369, ename = "SMITH", job = "SALESMAN", hiredate = "2022-4-1", sal = 9000 });
}
执行多次INSERT语句
string sql = "INSERT INTO emp(empno,ename,job,hiredate,sal) Values (@empno,@ename,@job,@hiredate,@sal);";
using (var connection = BaseRepository.GetMySqlConnection())
{
connection.Open();
var affectedRows = connection.Execute(sql,
new[]
{
new { empno = 7779 , ename = "宋江",job= "SALESMAN", hiredate="2022-5-1",sal =9000 },
new { empno = 7780 , ename = "李逵",job= "SALESMAN", hiredate="2022-6-1",sal =9000 },
new { empno = 7781 , ename = "关胜",job= "SALESMAN", hiredate="2022-6-1",sal =9000 },
new { empno = 7782 , ename = "白日鼠",job= "SALESMAN", hiredate="2022-6-1",sal =9000 },
});
}
UPDATE语句
执行单次UPDATE语句
string sql = "UPDATE emp SET ename =@ename WHERE empno =@empno";
using (var connection = BaseRepository.GetMySqlConnection())
{
connection.Open();
var affectedRows = connection.Execute(sql, new { empno = 7369, ename = "yulan" });
}
执行多次UPDATE语句
string sql = "UPDATE emp SET ename =@ename WHERE empno =@empno";
using (var connection = BaseRepository.GetMySqlConnection())
{
connection.Open();
var affectedRows = connection.Execute(sql,
new[]
{
new { empno =7369,ename ="卢俊义" },
new { empno =7777,ename ="林冲"}
});
}
DELETE语句
执行单次DELETE语句
string sql = "DELETE FROM emp WHERE empno =@empno";
using (var connection = BaseRepository.GetMySqlConnection())
{
connection.Open();
var affectedRows = connection.Execute(sql, new { empno = 7780 });
}
执行多次DELETE语句
string sql = "DELETE FROM emp WHERE empno =@empno";
using (var connection = BaseRepository.GetMySqlConnection())
{
connection.Open();
var affectedRows = connection.Execute(sql,
new[]
{
new{ empno = 7781 },
new{ empno = 7782 }
});
}
有参存储过程
执行单次存储过程
string sql = "sp_GetEmpInfo";
using (var connection = BaseRepository