Dapper是一款轻量级ORM工具(Github)。如果你在小的项目中,使用Entity Framework、NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀。你又觉得ORM省时省力,这时Dapper 将是你不二的选择。
为什么选择Dapper
- 轻量。只有一个文件(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的安装
方法一:使用NuGet安装
打开visual studio的项目,依次点击工具
,NuGet包管理器
,管理解决方案的NuGet程序包
;
再点击浏览
,搜索dapper
,点击搜索结果中的Dapper
,勾选项目
,选择安装
;
在解决方案管理器中点击项目
,查看引用
,如果有Dapper
,说明安装成功。
方法二:直接在官网[2]下载源代码,加入项目。这种方法哈希君没有试,不过可以参考链接Dapper快速学习
实体字段必须与表的列名称一样 不然绑定不上数据根据表列名与实体字段名 自动装配的
Dapper的基本用法
插入操作
将一个对象person插入数据库的方法如图。
插入代码文本如下。@Name的意思是自动将person里的Name值绑定上去。
/// <summary>
/// 批量插入
/// </summary>
/// <param name="students">批量学生集合</param>
/// <returns>受影响的行数</returns>
public static int InsertEntities(List<Student> students)
{
using (IDbConnection conn = new SqlConnection(connectionString))
{
return conn.Execute("insert into studentInfo values(@stuid,@stuname,@stusex,@stuage,@stutel,@studorm)", students);
}
}
删除操作
#region 删除
/// <summary>
/// 删除实体
/// </summary>
/// <param name="student">要删除的实体</param>
/// <returns>受影响的行数</returns>
public static int DeleteEntity(Student student)
{
using (IDbConnection conn = new SqlConnection(connectionString))//获取连接实例(对象)
{
return conn.Execute("delete studentInfo where stuID=@stuid", student);
}
}
/// <summary>
/// 批量删除
/// </summary>
/// <param name="students">要删除实体集合</param>
/// <returns>受影响的行数</returns>
public static int DeleteEntities(List<Student> students)
{
using (IDbConnection conn = new SqlConnection(connectionString))
{
return conn.Execute("delete studentInfo where stuID=@stuid", students);//根据传入类型循环删除
}
}
#endregion
修改操作
#region 更新(年龄)
public static int UpdateEntity(Student student)
{
using (IDbConnection connection = new SqlConnection(connectionString))
{
return connection.Execute("update studentInfo set stuAge=@stuage where stuID=@stuid", student);
}
}
public static int UpdateEntities(List<Student> students)
{
using (IDbConnection connection = new SqlConnection(connectionString))
{
return connection.Execute("update studentInfo set stuAge=@stuage where stuID=@stuid", students);
}
}
#endregion
查询操作
#region 查询
/// <summary>
/// 无参查询所有数据
/// </summary>
/// <returns></returns>
public static List<Student> QueryEntitiesList()
{
using (IDbConnection connection = new SqlConnection(connectionString))
{
return connection.Query<Student>("select * from studentInfo").ToList();//List<Student>
}
}
/// <summary>
/// 查询指定数据
/// </summary>
/// <param name="person"></param>
/// <returns></returns>
public static Student QueryEntity(Student student)
{
using (IDbConnection connection = new SqlConnection(connectionString))
{
//Query<Student>("") --->IEnumerable<Student> .SingleOrDefault() --->返回一个序列或默认值的唯一元素----->返回Student实体
return connection.Query<Student>("select * from studentInfo where stuID=@stuid", student).SingleOrDefault();
}
}
#endregion
Dapper的复杂操作
查询的In操作
#region In操作
/// <summary>
/// In多查询
/// </summary>
/// <returns></returns>
public static List<Student> QueryIn()
{
using (IDbConnection connection = new SqlConnection(connectionString))
{
var sql = "select * from studentInfo where stuID in @ids";
//参数类型是Array的时候,dappper会自动将其转化
return connection.Query<Student>(sql, new {
ids = new int[2] {
1, 2 } }).ToList();
}
}
/// <summary>
/// 根据多ID查询
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
public static List<Student> QueryIn(int[] ids)
{
using (IDbConnection connection = new SqlConnection(connectionString))
{
var sql = "select * from studentInfo where stuID in @ids";
//参数类型是Array的时候,dappper会自动将其转化
return connection.Query<Student>(sql,new {
ids=ids }).ToList();
}
}
#endregion
多语句操作
#region 多语句操作
/// <summary>
/// 多语句操作
/// </summary>
public static void QueryMultiple()
{
using (IDbConnection connection = new SqlConnection(connectionString))
{
var sql = "select * from Person; select * from Book";
var multiReader = connection.QueryMultiple(sql);
var personList = multiReader.Read<Student>();
var bookList = multiReader.Read<ScoreInfo>();
multiReader.Dispose();
}
}
#endregion
Join操作
我们是面向对象编程,所以一个对象里面会有许多其他子对象,这个子对象里面又有其自己的子对象,这种关系在数据库里的表示就是外键。
比如我们有一本书book,它有主人person,book是一个对象,主人又是一个对象。
#region Join操作
/// <summary>
/// Join链接查询学生成绩信息
/// </summary>
/// <returns></returns>
public static List<Student_ScoreTab> QueryJoinStudentsScores()
{
using (IDbConnection connection = new SqlConnection(connectionString))
{
var sql = " select a.stuID,a.stuName,a.stuSex,b.stuClass,b.html,b.c,b.sql " +
"from studentInfo a inner join scoreInfo b on a.stuID=b.stuID ";
var result = connection.Query<Student_ScoreTab>(sql).ToList();
return result;
}
}
/// <summary>
/// 根据学生学号 查询成绩
/// </summary>
/// <param name="stuno">要查询的学号</param>
/// <returns></returns>
public static List<Student_ScoreTab> QueryJoinStudentsScores(string stuno)
{
using (IDbConnection connection = new SqlConnection(connectionString))
{
var sql = " select a.stuID,a.stuName,a.stuSex,b.stuClass,b.html,b.c,b.sql " +
"from studentInfo a inner join scoreInfo b on a.stuID=b.stuID where a.stuId=@stuid";
var result = connection.Query<Student_ScoreTab>(sql,new {
stuid=stuno }).ToList();//new { stuid=stuno } 给@stuid参数赋值,名称一致自动装配
return result;
}
}
#endregion
End_2020/05/11