- 简述
- 适用特性
- 使用Dapper流程
- 代码示例
简述
Dapper是一个轻量级的ORM工具:ORM框架的核心思想是对象关系映射,ORM是将表与表之间的操作,映射成对象和对象之间的操作,就是通过操作实体类来达到操作表的目的。从数据库提取的数据会自动按你设置的映射要求封装成特定的对象。之后你就可以通过对对象进行操作来修改数据库中的数据。这时候你面对的不是信息的碎片,而是一个形象鲜明的对象。
ORM 框架很多: Dapper、 Mybatis.Net、EntityFramework 和 NHibernate。如果你在小的项目中,使用Entity Framework、NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀。而Mybatis.Net需要配置XML文件,综合考虑你会觉得觉得ORM省时省力。
适用特性
- 1、Dapper是一个轻型的ORM类。代码就一个SqlMapper.cs文件,编译后就70K。
- 2、Dapper很快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。
- 3、Dapper支持多数据库。Dapper支持Mysql,SqlLite,SqlServer,Oracle等一系列的数据库。
- 4、Dapper支持多表并联的对象。支持一对多 多对多的关系。并且没侵入性,想用就用,不想用就不用。无XML无属性。代码以前怎么写现在还怎么写。
- 5、Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象。性能很高(性能和原生ado.net相近)。
- 6、Dapper支持net2.0,3.0,3.5,4.0。【如果想在Net2.0下使用,可以去网上找一下Net2.0下如何配置运行Net3.5即可。】
- 7、Dapper语法十分简单,快捷添加到项目,容易上手。并且无须迁就数据库的设计。
适用Dapper流程
流程一:
通过NuGet程序包进行Dapper安装引用: 这个引用的Dapper DLL文件是对前面说的SqlMapper.cs 源文件的封装。
流程二:
- 我们这里用Mysql数据库,那么用到的MySql.Data.dll在官网下载.net驱动包(已经附加在此教程demo中)
mysql .net连接驱动下载地址:http://dev.mysql.com/downloads/connector/net/
示例代码
- 1、定义一个Person类对应数据库的Person表
CREATE TABLE person (
idint(11) NOT NULL AUTO_INCREMENT,
usernamevarchar(255) NOT NULL,
passwordvarchar(20) NOT NULL,
ageint(11) DEFAULT NULL,
registerDatedatetime DEFAULT NULL,
addressvarchar(255) DEFAULT NULL,
PRIMARY KEY (id)
);
//Person类
publicclassPerson
{
publicint id { get; set; }
publicstring username { get; set; }
publicstring password { get; set; }
publicint age { get; set; }
publicDateTimeregisterDate { get; set; }
publicstring address { set; get; }
}
- 2、定义连接数据库字符串
public static string ConnString = "server=localhost;port=3306;user id=root;password=123456;database=test";
//SQL Server
public static string ConnString = "server=localhost;user id=sa;password=123456;database=Dormitory";
- 3、 新增、修改、删除的 Execute 方法
public static int Execute(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null);
//新增
var conn = MySqlDBHelper.CreateMySqlConnection();
try
{
var result = conn.Execute("Insert into Person(username,password,age,registerDate,address) values (@username,@password,@age,@registerDate,@address)",
new { username = txtUserName.Text, password = txtPassword.Text, age = numAge.Value, registerDate = dptRegisterDate.Value, address = txtAddress.Text });
if (result > 0)
{
MessageBox.Show("添加成功!");
LoadDBInfoToDgvFirst();
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (conn.State == System.Data.ConnectionState.Open)
{
conn.Close();
}
}
批量新增 和新增一条语句是一样的,后面的param 是object 对象,单个模型数据和集合都可以支持。执行上面方法会插入多条记录,这样sql可以灵活的控制,参数不用像ADO.Net那样声明每个参数,最后还要把参数集合赋值给ADO的命令。可以看出这样简洁多了。
- 4、 查询的Query 方法
public static IEnumerable<T> Query<T>(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null);
实际运用:
var result = conn.Query<Person>("select * from Person order by id desc limit @indx", new { indx = num });
- 5、存储过程调用
var param = new DynamicParameters();
param.Add("@idIn", numUpdateId.Value, DbType.Int32, ParameterDirection.Input);
param.Add("@Inusername", txtUserName.Text, DbType.String, ParameterDirection.Input);
param.Add("@res", 0, DbType.Int32, ParameterDirection.Output);
var res2 = conn.Execute("prUpdatePersion", param, null, null, CommandType.StoredProcedure);
int res = param.Get<Int32>("@res");
- 6、多个数据库插入数据
private void button4_Click(object sender, EventArgs e)
{
MySqlConnection mySqlConn = MySqlDBHelper.CreateMySqlConnection();
MySqlTransaction tranMySql = mySqlConn.BeginTransaction();
SqlConnection SqlServerConn = SqlServerDBHelper.CreateSqlServerConnection();
SqlTransaction tranSqlServer = SqlServerConn.BeginTransaction();
try
{
var persion = new Person { username = txtUserName.Text, password = txtPassword.Text, age = numAge.Value, registerDate = dptRegisterDate.Value, address = txtAddress.Text };
int result = mySqlConn.Execute("Insert into Person(username,password,age,registerDate,address) values (@username,@password,@age,@registerDate,@address)",
persion, tranMySql);
persion.username += "Sqlserver";
result = SqlServerConn.Execute("Insert into Person(username,password,age,registerDate,address) values (@username,@password,@age,@registerDate,@address)",
persion, tranSqlServer);
MessageBox.Show("添加成功!");
tranMySql.Commit();
tranSqlServer.Commit();
}
catch (Exception ex)
{
tranMySql.Rollback();
tranSqlServer.Rollback();
throw ex;
}
finally
{
if (mySqlConn.State == System.Data.ConnectionState.Open)
{
mySqlConn.Close();
}
if (SqlServerConn.State == System.Data.ConnectionState.Open)
{
SqlServerConn.Close();
}
tranSqlServer.Dispose();
tranMySql.Dispose();
}
tabControl.SelectedTab = tabPage2;
//加载信息
LoadDBInfoToDoubleDgvFirst();
}
通过上面的代码演示主要常用的是:封装后 Query 方法、Excute 方法。(其底层的封装的方法可以见源码:513行 的 ExecuteImpl 方法、 1065行的QueryImpl方法)。