Dapper功能讲解

  • 简述
  • 适用特性
  • 使用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 源文件的封装。

流程二:

  1. 我们这里用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方法)。
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laokang426

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值