Dapper ORM 用法—Net下无敌的ORM
假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM.点击下载
Dapper的优势:
1,Dapper是一个轻型的ORM类。代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll.
2,Dapper很快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。
3,Dapper支持什么数据库。Dapper支持Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库,当然如果你知道原理也可以让它支持Mongo db
4,Dapper的r支持多表并联的对象。支持一对多 多对多的关系。并且没侵入性,想用就用,不想用就不用。无XML无属性。代码以前怎么写现在还怎么写。
5,Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象。性能实在高高高。
6,Dapper支持net2.0,3.0,3.5,4.0。【如果想在Net2.0下使用,可以去网上找一下Net2.0下如何配置运行Net3.5即可。】
7,Dapper语法十分简单。并且无须迁就数据库的设计。
下面介绍Dapper如何使用,来进行高效开发,以下操作是编译后在Net3.5下操作的例子,Net4.0下大部分函数有默认值,参数很简单。
//数据库里的表:
CREATE TABLE ColumnCat
(
Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
NAME NVARCHAR(150) NULL,
ModifiedOn SMALLDATETIME NULL DEFAULT(GETDATE()),
Parentid INT
)
CREATE TABLE Column
(
Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
NAME NVARCHAR(150) NULL,
ModifiedDate SMALLDATETIME NULL DEFAULT(GETDATE()),
ColumnCatid INT null
)
常用的表,分类和内容表,分类可以有下级类别。以下操作基本上都是对这两个表的操作。
//连接数据库字符串。
private readonly string sqlconnection =
"Data Source=RENFB;Initial Catalog=test;User Id=sa;Password=sa;";
//public readonly string mysqlconnectionString =
@"server=127.0.0.1;database=test;uid=renfb;pwd=123456;charset='gbk'";
//获取Sql Server的连接数据库对象。SqlConnection
public SqlConnection OpenConnection()
{
SqlConnection connection = new SqlConnection(sqlconnection);
connection.Open();
return connection;
}
//获取MySql的连接数据库对象。MySqlConnection
//public MySqlConnection OpenConnection()
//{
// MySqlConnection connection = new MySqlConnection(mysqlconnectionString);
// connection.Open();
// return connection;
//}
注:如果需要换成Mysql数据库,只用将获得sql Server的连接数据库对象的函数注释掉,取消MySql的连接数据库对象的函数的注释,一并取消Mysql连接字符串的注释,并修改为自己的连接信息。
Query()方法:
Query()是IDbConnection扩展方法并且重载了,从数据库里提取信息,并用来填充我们的业务对象模型。
//先创建一个类,是数据库的ColumnCat表的模型。
public class ColumnCat
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime ModifiedOn { get; set; }
public int Parentid { get; set; }
}
//获取ColumnCat对象的集合。
public IEnumerable<ColumnCat> SelectColumnCats()
{
using (IDbConnection conn = OpenConnection())
{
const string query = "select * from ColumnCat order by id desc";
return conn.Query<ColumnCat>(query,null);
}
}
就是这么简单,直接在例子中嵌入Sql,很容易扩展为存储过程,可以使用别名使结果集中的列与业务对象模型(ColumnCat)的属性对应。
//下面使用上面的集合显示出分类。
List<ColumnCat> AllColumnCat =SelectColumnCats().ToList<ColumnCat>();
foreach (ColumnCat cat in AllColumnCat.Where(c => c.Parentid == 0))
{
Response.Write("Name==>" + cat.Name + "\t");
Response.Write("时间==>" + cat.ModifiedOn + "\t");
Response.Write("<br/>");
foreach (ColumnCat c in AllColumnCat
.Where<ColumnCat>(subColumnCat => subColumnCat.Parentid == cat.Id))
{
Response.Write(" ++++");
Response.Write("Name==>" + c.Name + "\t");
Response.Write("时间==>" + c.ModifiedOn + "\t");
Response.Write("<br/>");
}
}
//将一级类别和二级类别显示在页面上,如果使用一个递归,很容易实现无限级分类(你懂的)。
//获取单个ColumnCat对象。
public ColumnCat SelectColumnCat(int columnCatId)
{
using (IDbConnection conn = OpenConnection())
{
const string query = "select * from ColumnCat where Id=@id";
return conn.Query<ColumnCat>(query, new { id=columnCatId})
.SingleOrDefault<ColumnCat>();
}
}
这里我们传递了一个参数给Query方法,参数可以是任何对象,其属性在查询中与sql的参数匹配,由于Query总是返回一个集合,我们只需调用SingleOrDefault方法,因为我们知道总是返回0或1行.
//Dapper也可以加载填充嵌套对象,考虑这样一种情形,考虑到新闻的类别属性,返回类别对象,
//我们创建一个Column的类
public class Column
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime ModifiedDate { get; set; }
public ColumnCat ColumnCat { get; set; }
}
//接下来我们来填充我们的业务对象。
public IList<Column> SelectColumnsWithColumnCat()
{
using (IDbConnection conn = OpenConnection())
{
const string query = "select c.Id,c.Name,c.ModifiedDate,c.ColumnCatid
,cat.id,cat.[Name],cat.ModifiedOn,cat.Parentid from [Column] as c
left outer join ColumnCat as cat on c.ColumnCatid=cat.id";
return conn.Query<Column, ColumnCat, Column>(query
, (column, columncat) => { column.ColumnCat = columncat; return column; }
, null, null, false, "Id", null, null).ToList<Column>();
}
}
注:1,在填充嵌套对象的时候,只好执行ToList<>方法,否则回报ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭,而单个对象不会报错,估计是using结束后关闭了连接,而嵌套对象在map的时候又执行了ExecuteReader,只好在using结束之前返回list集合。
2,嵌套对象的参数是比较多的,主要是前两个参数,其它参数没用可以设置为null,不过在4.0版本可以只写两个参数,其它参数都有默认值。特别要注意的是splitOn,这个参数不能为空,否则会报对象为引用的错误。【splitOn参数的意思是读取第二个对象的的分割列,从哪个列起开始读取第二个对象,如果表里的自增长列都为Id,可以设置这个参数为”Id”】.
Execute方法:
正如Query方法是检索数据的,Execute方法不会检索数据,它与Query方法非常相似,但它总返回总数(受影响的行数),而不是一个对象集合【如:insert update和delete】.
//接下来向数据库里添加一个类别
public int InsertColumnCat(ColumnCat cat)
{
using (IDbConnection conn = OpenConnection())
{
const string query = "insert into ColumnCat([name],ModifiedOn,Parentid)
values (@name,@ModifiedOn,@Parentid)";
int row = conn.Execute(query,cat);
//更新对象的Id为数据库里新增的Id,假如增加之后不需要获得新增的对象,
//只需将对象添加到数据库里,可以将下面的一行注释掉。
SetIdentity(conn,id=>cat.Id=id,"id","ColumnCat");
return row; }
}
public void SetIdentity(IDbConnection conn, Action<int> setId,string primarykey
,string tableName)
{
if (string.IsNullOrEmpty(primarykey)) primarykey = "id";
if (string.IsNullOrEmpty(tableName))
{
throw new ArgumentException("tableName参数不能为空,为查询的表名");
}
string query = string.Format("SELECT max({0}) as Id FROM {1}", primarykey
, tableName);
NewId identity = conn.Query<NewId>(query, null).Single<NewId>();
setId(identity.Id);
} public class NewId
{
public int Id { get; set; }
}
由于Dapper是通过类的属性自动绑定的,所以增加了NewId类来获取增加对象后的Id,本来打算使用@@identity,Net3.5下使用总是报错,只好使用Max函数获取。当然如果不需要获得更新后的对象的ID,可以不使用SetIdentity,这个函数通用。
//编译Dapper源码生成的是Net4.0下使用的,可以借助Net4.0新增的dynamic动态类型,
//SetIdentity的实现将非常方便。如下:
public void SetIdentity<T>(IDbConnection conn, Action<int> setId)
{
dynamic identity = connection.Query("SELECT @@IDENTITY AS Id").Single();
T newId = (T)identity.Id;
setId(newId);
}
//更新一个类别:
public int UpdateColumnCat(ColumnCat cat)
{
using (IDbConnection conn = OpenConnection())
{
const string query = "update ColumnCat set name=@Name
,ModifiedOn=@ModifiedOn,Parentid=@Parentid where Id=@id";
return conn.Execute(query,cat);
}
}
//删除一个类别:
public int DeleteColumnCat(ColumnCat cat)
{
using (IDbConnection conn = OpenConnection())
{
const string query = "delete from ColumnCat where id=@id";
return conn.Execute(query, cat);
}
}
下面介绍一下Dapper的高级用法
//Dapper对事务处理的例子,如删除类别的同时删除类别下的所有新闻。或者删除产品的同时,
//删除产品图片表里关联的所有图片。
public int DeleteColumnCatAndColumn(ColumnCat cat)
{
using (IDbConnection conn = OpenConnection())
{
const string deleteColumn = "delete from [Column] where ColumnCatid=@catid";
const string deleteColumnCat = "delete from ColumnCat where id=@Id"; IDbTransaction transaction = conn.BeginTransaction();
int row=conn.Execute(deleteColumn, new { catid =cat.Id},transaction,null,null);
row += conn.Execute(deleteColumnCat, new { id=cat.Id},transaction,null,null);
transaction.Commit();
return row;
}
} 原文地址:http://www.renfb.com/blog/2011/Article/335
Dapper ORM 用法—Net下无敌的ORM的更多相关文章
- Dapper ORM 用法—Net下无敌的ORM(转)
假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM.点击下载Dapper的优势:1,Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,编译后 ...
- 【.NET框架】Dapper ORM 用法—Net下无敌的ORM
假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM.点击下载 Dapper的优势: 1,Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,编 ...
- Net下无敌的ORM
Dapper ORM 用法—Net下无敌的ORM http://www.renfb.com/blog/2011/Article/335 假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上 ...
- ORM框架之------Dapper,Net下无敌的ORM
一,介绍:Dapper是一款轻量级ORM工具.如果你在小的项目中,使用Entity Framework.NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀.你又觉得ORM省时省力,这 ...
- Django 2.0 学习(16):Django ORM 数据库操作(下)
Django ORM数据库操作(下) 一.增加表记录 对于表单有两种方式: # 方式一:实例化对象就是一条表记录france_obj = models.Student(name="海地&qu ...
- C# 性能优化 之 秒表 Stopwatch。 Dapper一个和petapoco差不多的轻量级ORM框架
Sweet小马 小马同学的编程日记. C# 性能优化 之 秒表 Stopwatch. 生词解释:Diagnostics[,daɪəg'nɑstɪks] n.诊断学 using System.Diagn ...
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
反射以及Attribute在ORM中的应用 一. 反射什么是反射?简单点吧,反射就是在运行时动态获取对象信息的方法,比如运行时知道对象有哪些属性,方法,委托等等等等.反射有什么用呢?反射不但让你在运行 ...
- 打造Orm经典,创CRUD新时代,Orm的反攻战
让我们开启数据库无Linq.零sql时代(续) 第一部分 MQL qq群:225656797 demo下载: 点此下载(既然下载,就支持该文,关注我的博客) Moon.Orm 5.0 (MQL版) 版 ...
- .NET2.0引用.NET3.5的System.Core.dll&Dapper在.NET2.0下的配置
微软MSDN对.NET2.0,3.0,3.5的描述: .NET Framework 版本 2.0.3.0 和 3.5 是使用同一 CLR 版本 (CLR 2.0) 生成的. 这些版本表示单个安装的连续 ...
随机推荐
- 关于一些学习html和css的笔记
一.Html简介 全写: HyperText Mark-up Language 译名: 超文本标识语言 简释:一种为普通文件中某些字句加上标示的语言,其目的在于运用标签(tag)使文件 达到预期的 ...
- jQuery.extend源码深层分析
在网站的开发中,经常会自己写一些jQuery插件来方便使用,其中自然少不了一个关键的方法->jQuery.extend(),使用这个方法来扩展jQuery对象. 那么今天就来讲讲这个函数的实现原 ...
- having和where的区别
HAVING子句的使用. 例子: SELECT mob_belong_to,user_id,MAX(BIRTH_DATE) FROM user_base_info WHERE sign_in_date ...
- sqoop的merge和eval 工具
1.sqoop的merge的工具 sqoop merge 可以将hdfs上的两个文件进行合并,在increment import的过程中经常会用到,如incremenet import将数据导入到hd ...
- 【winform 学习】C# 转换成JSON对象
C#里面对json的处理有2种,JavaScriptSerializer和DataContractJsonSerializer. JavaScriptSerializer读出来就是key-value ...
- Oracle PL/SQL入门语法点
PL_SQL:带有分支和循环,面向过程匿名块:declare(可选,声明各种变量和游标的地方)begin(必要的,从此开始执行)exception(抓取到异常后执行的)end;[sql] view p ...
- 福州月赛2057 DFS
题意:告诉你族谱,然后Q条查询s和t的关系,妈妈输出M,爸爸输出F: 题目地址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=78233# ...
- 在 Xcode 6 中使用矢量图( iPhone 6 置配 UI)
在 Xcode 6 中使用矢量图( iPhone 6 置配 UI) (本文转载:http://iosdeveloper.diandian.com/post/2014-09-25/40063062789 ...
- Smart210学习记录-----SD/MMC/SDIO驱动
转自:http://jingpin.jikexueyuan.com/article/23369.html http://blog.csdn.net/evilcode/article/details/7 ...
- meta-analysis 到底是什么个意思类?
背景 科学研究应建立于许多实验结果的重复之上,除了少数新发现外,单个实验结果很难对科学的发展作出极为显著的贡献.所以为了阐明某一主题,在许多科学领域有众多研究者在对不同的实验对象或对同一对象在不同的实 ...