.NET轻量级ORM框架Dapper

.NET轻量级ORM框架Dapper

一 从ORM介绍开始:

百度一下

.NET轻量级ORM框架Dapper_第1张图片

要了解什么是ORM?为啥要是用ORM?

推荐行业文章https://blog.csdn.net/songyuxinit/article/details/81331339

举例来说,比如要完成一个购物打折促销的程序,用 ORM 思想将如下实现(引自《深入浅出Hibernate》):
业务逻辑如下:
public Double calcAmount(String customerid, double amount) 
{
    // 根据客户ID获得客户记录
    Customer customer = CustomerManager.getCustomer(custmerid); 
    // 根据客户等级获得打折规则
    Promotion promotion = PromotionManager.getPromotion(customer.getLevel()); 
    // 累积客户总消费额,并保存累计结果
    customer.setSumAmount(customer.getSumAmount().add(amount); 
    CustomerManager.save(customer); 
    // 返回打折后的金额
    return amount.multiply(protomtion.getRatio()); 
}
这 样代码就非常清晰了,而且与数据存取逻辑完全分离。设计业务逻辑代码的时候完全不需要考虑数据库JDBC的那些千篇一律的操作,而将它交给 CustomerManager 和 PromotionManager 两个类去完成。这就是一个简单的 ORM 设计,实际的 ORM 实现框架比这个要复杂的多。

关键:ORM:关系型数据库和实体间做映射,操作对象的属性和方法,跳过SQL语句

其中可以参照一些代码:

一个简易的ORM https://blog.csdn.net/u013411246/article/details/80340978

【ORM】怎样自己写一个ORM框架https://blog.csdn.net/qq_34370153/article/details/80929834

ORM框架的第一个Demohttps://blog.csdn.net/DaiHao0327/article/details/80230609

============================================================================

面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,

关系数据库则是从数学理论发展而来的,为了解决这个不匹配的现象,对象关系映射技术应运而生。

对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.

说简单一点,就是OOP中,把对象的属性(带有get/set方法的字段)和数据库中表的字段名称对应起来。

比如,一个学生类

public class student()

{       int age;

        string name;

        string sex;

//省略get/set方法

}

一张表

create table stude,

age int;

name varchar;

sex    char(2);

把编程中的对象和数据库表属性联系在一起,就叫做ORM。
=========================================================

原则:

简单:最基本的形式建模数据

传达性:语言文档化(数据库结构易理解)

精确性:基于数据模型创建正确标准化了的结构

====

建模者

收集   不熟悉数据建模(对数据抽象组织,确定数据库范围、数据组织形式,建立数据库实体及其关系)者的信息  开发  信息模型(对象建模、关系描述、数据流动方式)

在概念层次上与数据结构通讯

单元分析信息

样本数据处理

提供了易于理解的模型化数据的方法

=====

描述对象和数据库间的映射的元数据,将程序中对象自动持久化到关系数据库中

将数据从一种形式转换到另一种形式:额外开销

对象(业务实体在内存中)、关系数据(数据库中):两种表现形式——中间件——映射——转换——原则——开销

=======

映射模式:

数据类型

简单数据类型模式:UML、关系型数据库——映射表

枚举:每种枚举对应一个表,Only一列表示枚举值

基于类:外键约束,基础列、基于类的类型实例关联

类,每个类对应一个表,单值属性、多值属性、继承关系

单值属性:cardinality(类似于对应关系,一对一 一对多 多对多……)上界为1的属性,映射到类所对应的表的列上,若下界也是1 列属性 not null

多值:每个映射一个独立表,外键连接到类所对应的表上

继承模式:加入类的实例时,根继承关系自顶向下生成类对象(相同ID、主键)。删除时自底向上删除

关联

一对一:两端各加一列

一对多:同楼上

多对多:关联单独一个表

组合:级联式删除

反演关联(what? don't know):关联两端指向相关的类型

成对:关联记录类间关系,交集类关联、单独一个表,每个关联一个表,外键表关系

引用映射模式:

UML中不存在MOF(元对象机制)特征,

==========

优点:

专用、庞大的数据库访问层可能不再需要、提高效率

像操作对象一样提取数据

缺点:

固定思维模式、牺牲执行效率

很有可能将全部数据提取到内存对象中,持久化所有属性——不希望
 

二 介绍一下Dapper

Dapper是一款轻量级的ORM框架

为什么选择Dapper

1)轻量。

2)速度快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。

3)支持多种数据库。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server

4)可以映射一对一,一对多,多对多等多种关系。

5)性能高。通过Emit反射IDataReader的序列队列,来快速的得到和产生对象,性能不错。

6)支持FrameWork2.0,3.0,3.5,4.0,4.5

7)Dapper语法十分简单。并且无须迁就数据库的设计

基本用法:

//pay attention:在DAL中,使用MySqlDBFactory获取连接
            #region 插入数据--单条,批量
            using (var conn = new MySql.Data.MySqlClient.MySqlConnection("server=localhost;database=chargerecord;uid=root;pwd=root;charset=utf8;"))
            {
                IDbTransaction trans = conn.BeginTransaction();//需要手动开启事务控制
                var r = conn.Execute(@"insert users(Id, UserName,PassWord) values (@Id, @UserName,@PassWord)",
                 new[] {
                    new { Id = 1, UserName = "lhc1",PassWord="123"}
                    , new { Id = 2, UserName = "lhc2",PassWord="123"}
                    , new { Id = 3, UserName = "lhc3",PassWord="123"}
                });
                trans.Commit();
            }
            #endregion

            #region 查询全部数据并返回集合
            List userList;

            using (var conn = new MySql.Data.MySqlClient.MySqlConnection("server=localhost;database=chargerecord;uid=root;pwd=root;charset=utf8;"))
            {
                userList = conn.Query("select * from users").AsList();
                Console.WriteLine(userList);
            }
            #endregion

            #region  按照条件查询
            using (var conn = new MySql.Data.MySqlClient.MySqlConnection("server=localhost;database=chargerecord;uid=root;pwd=root;charset=utf8;"))
            {
                var result = conn.Query("select * from users where id=@Id", new { Id = 1 }).FirstOrDefault();
                Console.WriteLine(result.Id);
                Console.ReadKey();
            }
            #endregion

            #region 登陆查询
            UserInfoEntity user = new UserInfoEntity();
            using (var conn = new MySqlConnection("server=localhost;database=chargerecord;uid=root;pwd=root;charset=utf8;"))
            {
                user = conn.Query("SELECT tempuser.UserName,tempuser.`PassWord`,tempuser.RepositoryId,repo.RepositoryName FROM `users` tempuser LEFT JOIN repository repo on tempuser.RepositoryId = repo.id where tempuser.UserName=@userName and tempuser.PassWord=@passWord", new { userName = "lhc", passWord = "123" }).FirstOrDefault();
            }
            Console.ReadKey();
            #endregion
--------------------- 

参见:http://www.cnblogs.com/cnki/p/5723426.html

Dapper插入记录性能测试

批量插入5万条数据测试结果:1.Dapper: 花费时间10秒; 2.SqlBulkHelper,花费1.5秒; 3.原生SQL单条插入,花费60秒;

https://blog.csdn.net/li_rt4/article/details/78305847

你可能感兴趣的:(信息化的行业应用)