c# .net orm 框架 dapper.net 的应用

之前用过 entity framework 5.0 、sqlhelper 、mybatis.NET 等 orm,当然 sqlhelper 不算。


感觉都是学习陈本挺高的,配置也比较复杂,尤其是 mybatis 全是 xml ,懵逼了 ~~~~~


ef 用着不错也挺灵活,就是有些数据库不支持 如MySQL,网上也找过ef 接入 mysql 的方法,觉得还是比较繁重


mybatis 支持大多数的数据库,实体映射也相对方便,就是灵活性太差,加一个表需要配置 好几个 xml


继续寻找及灵活又有实体映射的 orm,最后选择了 dapper.Net。用过之后你也会喜欢上它的,有以下几个特性

1.类似 ado.net 的写法,灵活拼接sql

2.有实体和数据集的映射(支持一对一、一对多实体映射)

3.学习成本超级低只有两个方法 query()、execute()

4.可以说是 0 配置,只要在 config 中配置连接字符串就 ok了

5.类库非常小 只有一个 sqlMapper.cs 的文件(还是喜欢vs2015以前的代码,所以我用的是 dapper.net 1.4.2,上传到我的资源中)


上代码,里面包含增、删、改、查,和事务的使用(这里测试用的是mysql数据库)

一、数据脚本

[sql]  view plain  copy
 
  1. #订单表  
  2. CREATE TABLE `order_info` (  
  3.   `order_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单id',  
  4.   `user_id` int(11) DEFAULT NULL COMMENT '用户id',  
  5.   `order_code` char(50) DEFAULT NULL COMMENT '订单号',  
  6.   `amount` decimal(10,0) DEFAULT NULL COMMENT '订单金额',  
  7.   `create_time` timestamp(6) NULL DEFAULT NULL COMMENT '下单时间',  
  8.   `goods_count` int(11) DEFAULT NULL COMMENT '商品数量',  
  9.   PRIMARY KEY (`order_id`)  
  10. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8  
  11.   
  12. #订单商品表  
  13. CREATE TABLE `order_item` (  
  14.   `item_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单内容id',  
  15.   `order_id` int(11) NOT NULL COMMENT '商品id',  
  16.   `goods_name` char(150) DEFAULT NULL COMMENT '商品名',  
  17.   `unit_price` decimal(11,0) DEFAULT NULL COMMENT '单价',  
  18.   `goods_count` int(11) DEFAULT NULL COMMENT '商品数量',  
  19.   `amount` decimal(11,0) DEFAULT NULL COMMENT '总金额',  
  20.   `create_time` timestamp(6) NULL DEFAULT NULL COMMENT '创建时间',  
  21.   `update_time` timestamp(6) NULL DEFAULT NULL COMMENT '修改时间',  
  22.   PRIMARY KEY (`item_id`)  
  23. ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8  
  24.   
  25. #用户表  
  26. CREATE TABLE `user_info` (  
  27.   `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',  
  28.   `user_name` char(50) DEFAULT NULL COMMENT '用户名',  
  29.   `upwd` char(50) DEFAULT NULL COMMENT '密码',  
  30.   `create_time` timestamp(6) NULL DEFAULT NULL COMMENT '创建时间',  
  31.   `update_time` timestamp(6) NULL DEFAULT NULL COMMENT '修改时间',  
  32.   `age` int(3) DEFAULT NULL COMMENT '年龄',  
  33.   `sex` char(2) DEFAULT NULL COMMENT '性别',  
  34.   PRIMARY KEY (`user_id`)  
  35. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8  

测试用的存储过程

[sql]  view plain  copy
 
  1. #带有输入输出参数的过程  
  2. DELIMITER $$  
  3. CREATE PROCEDURE `p_getUserCount`(  
  4.  _sex CHAR,  
  5.  OUT _total INT)  
  6. BEGIN  
  7.     SET @sex = _sex;  
  8.     SELECT COUNT(*) INTO _total FROM user_info WHERE sex=@sex;    
  9. END$$  
  10.   
  11. #返回数据集的过程  
  12. DELIMITER ;  
  13. CREATE DEFINER=`root`@`localhost` PROCEDURE `p_getUserInfo`(  
  14.         _userid INT  
  15.     )  
  16. BEGIN  
  17.         SET @uid = _userid;  
  18.         SET @sql = CONCAT('select * from user_info where user_id=',@uid );  
  19.         IF(@uid<=0) THEN  
  20.             SET  @sql = 'select * from user_info';  
  21.         END IF;  
  22.         PREPARE strsql FROM @sql;#定义预处理语句   
  23.         EXECUTE strsql;   
  24.         DEALLOCATE PREPARE strsql;  #删除定义   
  25.     END$$  
  26. DELIMITER ;  


二、实体&工具类

[csharp]  view plain  copy
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace TestDapperDotNet.Models  
  7. {  
  8.     public class order_infoModel  
  9.     {  
  10.         public order_infoModel()  
  11.         {  
  12.             goodsList = new List();  
  13.         }  
  14.   
  15.         public int order_id { setget; }  
  16.         public int user_id { setget; }  
  17.         public string order_code { setget; }  
  18.         public decimal amount { setget; }  
  19.         public DateTime create_time { setget; }  
  20.         public int goods_count { setget; }  
  21.         ///   
  22.         /// 下单用户信息(测试一对一映射)  
  23.         ///   
  24.         public user_infoModel userInfo { setget; }  
  25.         ///   
  26.         /// 订单商品信息(测试一对多映射)  
  27.         ///   
  28.         public List  goodsList { setget; }  
  29.     }  
  30.   
  31.     public class order_itemModel  
  32.     {  
  33.         public int item_id { setget; }  
  34.         public int order_id { setget; }  
  35.         public string goods_name { setget; }  
  36.         public decimal unit_price { setget; }  
  37.         public int goods_count { setget; }  
  38.         public decimal amount { setget; }  
  39.         public DateTime create_time { setget; }  
  40.         public DateTime update_time { setget; }  
  41.     }  
  42.   
  43.     public class user_infoModel  
  44.     {  
  45.         public int user_id { setget; }  
  46.         public string user_name { setget; }  
  47.         public string upwd { setget; }  
  48.         public DateTime create_time { setget; }  
  49.         public DateTime update_time { setget; }  
  50.         public int age { setget; }  
  51.         public string sex { setget; }  
  52.     }  
  53. }  
  54.   
  55. using System;  
  56. using System.Collections.Generic;  
  57. using System.Configuration;  
  58. using System.Linq;  
  59. using System.Text;  
  60.   
  61. namespace TestDapperDotNet  
  62. {  
  63.     public class DbConfig  
  64.     {  
  65.         public static readonly string Test_W =   
  66.             ConfigurationManager.ConnectionStrings["test_w"].ConnectionString;  
  67.         public static readonly string Test_R =   
  68.             ConfigurationManager.ConnectionStrings["test_r"].ConnectionString;  
  69.     }  
  70. }  


三、dapper.net 测试类

[csharp]  view plain  copy
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Data;  
  4. using System.Linq;  
  5. using Dapper;  
  6. using Microsoft.VisualStudio.TestTools.UnitTesting;  
  7. using TestDapperDotNet.Models;  
  8.   
  9. namespace TestDapperDotNet  
  10. {  
  11.     [TestClass]  
  12.     public class TestDapper  
  13.     {  
  14.         ///   
  15.         /// 获取连接字符串  
  16.         ///   
  17.         ///   
  18.         public IDbConnection GetSqlConnection()  
  19.         {  
  20.             return new MySql.Data.MySqlClient.MySqlConnection(DbConfig.Test_W); ;  
  21.         }  
  22.         ///   
  23.         /// 查询记录返回实体  
  24.         ///   
  25.         [TestMethod]  
  26.         public void TestQueryT()  
  27.         {  
  28.             using (var conn = GetSqlConnection())  
  29.             {  
  30.                 //订单表映射单条记录  
  31.                 var sql = @"SELECT * FROM order_info WHERE order_id=@order_id;";  
  32.                 var list = conn.Query(sql, new  
  33.                 {  
  34.                     order_id = 2  
  35.                 }).ToList();  
  36.                 var itme = list.FirstOrDefault();  
  37.                 Assert.IsTrue(itme.order_id == 2);  
  38.   
  39.                 //订单表映射多条记录  
  40.                 sql = @"SELECT * FROM order_info";  
  41.                 list = conn.Query(sql, new  
  42.                 {  
  43.                     order_id = 2  
  44.                 }).ToList();  
  45.                 Assert.IsTrue(list != null && list.Count>0);  
  46.   
  47.             }  
  48.         }  
  49.   
  50.         ///   
  51.         /// 一对一映射  
  52.         /// 订单实体下有个用户信息属性,通过user_id关联  
  53.         ///   
  54.         [TestMethod]  
  55.         public void TestOneToOne()  
  56.         {  
  57.             using (IDbConnection conn = GetSqlConnection())  
  58.             {  
  59.                 var sql = @"  
  60. SELECT a.*,b.*   
  61. FROM   
  62.  order_info a  
  63.  JOIN user_info b  
  64.  ON a.`user_id`=b.user_id;";  
  65.                 var list = conn.Query(  
  66.                     sql  
  67.                     , (order, user) =>  
  68.                     {  
  69.                         order.userInfo = user;  
  70.                         return order;  
  71.                     }  
  72.                     , null  
  73.                     , null  
  74.                     , true  
  75.                     , "order_id"  
  76.                     , null  
  77.                     , null).ToList();  
  78.   
  79.                 list.ForEach(x =>  
  80.                 {  
  81.                     Assert.IsTrue(x.userInfo.user_id == x.user_id);  
  82.                 });  
  83.                 Assert.IsTrue(true);  
  84.             }  
  85.         }  
  86.   
  87.         ///   
  88.         /// 一对多映射  
  89.         ///   
  90.         [TestMethod]  
  91.         public void TestOneToMore()  
  92.         {  
  93.             using (IDbConnection conn = GetSqlConnection())  
  94.             {  
  95.                 var sql = @"  
  96. SELECT a.*,b.*   
  97. FROM   
  98.  order_info a  
  99.  JOIN order_item b  
  100.  ON a.order_id=b.order_id;";  
  101.                 //合并后的订单数据  
  102.                 var orderDic = new Dictionary<int, order_infoModel>();  
  103.                 var originList = conn.Query(  
  104.                     sql  
  105.                     , (order, goods) =>  
  106.                     {  
  107.                         //需要手动维护,一对多对象关系  
  108.                         order_infoModel ord;  
  109.                         if (!orderDic.TryGetValue(order.order_id, out ord))  
  110.                         {  
  111.                             ord = order;  
  112.                             orderDic.Add(order.order_id, order);  
  113.                         }  
  114.                         ord.goodsList.Add(goods);  
  115.                         return order;  
  116.                     }  
  117.                     , null  
  118.                     , null  
  119.                     , true  
  120.                     , "order_id"  
  121.                     , null  
  122.                     , null).ToList();  
  123.                 //投影一个list  
  124.                 var list = orderDic.Select(x => x.Value).ToList();  
  125.   
  126.                 list.ForEach(x =>  
  127.                 {  
  128.                     x.goodsList.ForEach(o =>  
  129.                     {  
  130.                         Assert.IsTrue(o.order_id == x.order_id);  
  131.                     });  
  132.                 });  
  133.                 Assert.IsTrue(true);  
  134.             }  
  135.         }  
  136.         [TestMethod]  
  137.         public void TestInsertOne()  
  138.         {  
  139.             var user = new user_infoModel()  
  140.             {  
  141.                 user_name="tester",  
  142.                 upwd="123",  
  143.                 create_time=DateTime.Now,  
  144.                 update_time=DateTime.Now,  
  145.                 age=99,  
  146.                 sex="女"  
  147.             };  
  148.             var sql = @"  
  149. INSERT INTO `test`.`user_info` (  
  150.   `user_id`,  
  151.   `user_name`,  
  152.   `upwd`,  
  153.   `create_time`,  
  154.   `update_time`,  
  155.   `age`,  
  156.   `sex`  
  157. )   
  158. VALUES  
  159.   (  
  160.     @user_id,  
  161.     @user_name,  
  162.     @upwd,  
  163.     @create_time,  
  164.     @update_time,  
  165.     @age,  
  166.     @sex  
  167.   ) ;";  
  168.             using (IDbConnection conn = GetSqlConnection())  
  169.             {  
  170.                 var n = conn.Execute(sql, user);  
  171.                 Assert.IsTrue(n == 1);  
  172.             }  
  173.         }  
  174.   
  175.         ///   
  176.         /// 执行"返回数据集"的存储过程  
  177.         ///   
  178.         [TestMethod]  
  179.         public void TestCallp_getuserinfo()  
  180.         {  
  181.             #region mysql 存储过程脚本  
  182.             /* 
  183. DELIMITER $$ 
  184. CREATE 
  185.     PROCEDURE `test`.`p_getUserInfo`( 
  186.         _userid INT 
  187.     ) 
  188.     BEGIN 
  189.         SET @uid = _userid; 
  190.         SET @sql = CONCAT('select * from user_info where user_id=',@uid ); 
  191.         IF(@uid<=0) THEN 
  192.             SET  @sql = 'select * from user_info'; 
  193.         END IF; 
  194.         PREPARE strsql FROM @sql;#定义预处理语句  
  195.         EXECUTE strsql;  
  196.         DEALLOCATE PREPARE strsql;  #删除定义  
  197.     END$$ 
  198. DELIMITER ; 
  199.              */  
  200.             #endregion  
  201.             var sql = "p_getuserinfo";  
  202.             using (IDbConnection conn = GetSqlConnection())  
  203.             {  
  204.                 var list = conn.Query(sql,  
  205.                      new  
  206.                      {  
  207.                          _userid = 0 //查询多个  
  208.                      },   
  209.                     null,   
  210.                     true,  
  211.                     null,  
  212.                     CommandType.StoredProcedure).ToList();  
  213.                 Assert.IsTrue(list!=null);  
  214.             }  
  215.         }  
  216.           
  217.         ///   
  218.         /// 执行“带有输入输出参数”的存储过程  
  219.         ///   
  220.         [TestMethod]  
  221.         public void TestCallp_getUserCount()  
  222.         {  
  223.             #region mysql 存储过程脚本  
  224.             /* 
  225. DELIMITER $$ 
  226.  
  227. CREATE PROCEDURE `p_getUserCount`( 
  228.  _sex CHAR, 
  229.  OUT _total INT) 
  230. BEGIN 
  231.     SET @sex = _sex; 
  232.     SELECT COUNT(*) INTO _total FROM user_info WHERE sex=@sex;   
  233. END$$ 
  234.  
  235. DELIMITER ; 
  236.              */  
  237.             #endregion  
  238.             var sql = "p_getUserCount";  
  239.             DynamicParameters pars = new DynamicParameters();  
  240.             pars.Add("_sex""女");  
  241.             pars.Add("_total""", DbType.Int32, ParameterDirection.Output);  
  242.             using (IDbConnection conn = GetSqlConnection())  
  243.             {  
  244.                 var n = conn.Execute(sql,  
  245.                     pars,  
  246.                     null,  
  247.                     null,  
  248.                     CommandType.StoredProcedure);  
  249.                 var total = pars.Get("_total");  
  250.                 Assert.IsTrue(total > 0);  
  251.             }  
  252.         }  
  253.         [TestMethod]  
  254.         public void TestTransaction()  
  255.         {  
  256.             using (IDbConnection conn = GetSqlConnection())  
  257.             {  
  258.                 conn.Open();  
  259.                 //开始事务  
  260.                 var transaction = conn.BeginTransaction();  
  261.                 try  
  262.                 {  
  263.                     var order = new order_infoModel()  
  264.                     {  
  265.                         amount = 100,  
  266.                         create_time = DateTime.Now,  
  267.                         goods_count = 3,  
  268.                         order_code = "20160608001",  
  269.                         user_id = 2,  
  270.                     };  
  271.                     var item = new order_itemModel()  
  272.                     {  
  273.                         amount = 100,  
  274.                         create_time = DateTime.Now,  
  275.                         goods_count = 3,  
  276.                         goods_name = "001",  
  277.                         order_id = 2,  
  278.                         unit_price = 99.99M,  
  279.                         update_time = DateTime.Now  
  280.                     };  
  281.                     var sql = @"  
  282. INSERT INTO `order_info` (  
  283.   `user_id`,  
  284.   `order_code`,  
  285.   `amount`,  
  286.   `create_time`,  
  287.   `goods_count`  
  288. )   
  289. VALUES  
  290.   (  
  291.     @user_id,  
  292.     @order_code,  
  293.     @amount,  
  294.     @create_time,  
  295.     @goods_count  
  296.   ) ;";  
  297.                     int n = conn.Execute(sql, order, transaction);  
  298.                     Assert.IsTrue(n == 1);  
  299.                     if (n != 1)  
  300.                     {  
  301.                         transaction.Rollback();  
  302.                         return;  
  303.                     }  
  304.                     sql = @"  
  305. INSERT INTO `order_item` (  
  306.   `order_id`,  
  307.   `goods_name`,  
  308.   `unit_price`,  
  309.   `goods_count`,  
  310.   `amount`,  
  311.   `create_time`,  
  312.   `update_time`  
  313. )   
  314. VALUES  
  315.   (  
  316.     @order_id,  
  317.     @goods_name,  
  318.     @unit_price,  
  319.     @goods_count,  
  320.     @amount,  
  321.     @create_time,  
  322.     @update_time  
  323.   ) ;";  
  324.                     n = conn.Execute(sql, item, transaction);  
  325.                     Assert.IsTrue(n == 1);  
  326.                     if (n != 1)  
  327.                     {  
  328.                         transaction.Rollback();  
  329.                         return;  
  330.                     }  
  331.                     //提交事务  
  332.                     transaction.Commit();  
  333.                 }  
  334.                 catch (Exception ex)  
  335.                 {  
  336.                     //出现异常,事务Rollback  
  337.                     transaction.Rollback();  
  338.                 }  
  339.             }  
  340.         }  
  341.     }  

你可能感兴趣的:(c#)