Dapper使用技巧和基础CRUD

发布时间:2017/11/8 14:48:36 次浏览


一、使用模型的增删改查。

  1. 建立测试模型,模型名称可以和表名不同。
复制代码
    class ATest {

            public int ID { get; set; }

            public string Name { get; set; }

            public string Code { get; set; }

       } 
复制代码

 

2.建立数据库

 

复制代码
1      CREATE TABLE [dbo].[ATest](
 2 
 3     [ID] [INT] IDENTITY(1,1) NOT NULL,
 4 
 5     [Name] [VARCHAR](50) NULL,
 6 
 7     [Code] [VARCHAR](50) NULL,
 8 
 9  CONSTRAINT [PK_ATest] PRIMARY KEY CLUSTERED
10 
11 (
12 
13     [ID] ASC
14 
15 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
16 
17 ) ON [PRIMARY]
18 
19  
20 
21 GO 
复制代码

 

3.数据增删改查

    引用比较乱,做了一些测试,顺便说说MongoDB.Driver也很好用,下次写。

复制代码
1  using System;
 2 using System.Collections.Generic;
 3 using System.Collections.ObjectModel;
 4 using System.Collections;
 5 using System.Linq;
 6 using System.Text;
 7 using System.Threading.Tasks;
 8 using MongoDB.Bson;
 9 using MongoDB.Driver;
10 using Dapper;
11 using System.Data;
12 using System.Data.SqlClient;
13 using AutoMapper.Mappers;
14 using MongoDBTest.Model.TableExtend;
15 using Newtonsoft.Json;
16 using Newtonsoft; 
复制代码

 

复制代码
1      static string conn = "data source=.;database=test;User ID=sa;Password=sa123456";
  2 
  3         public static IDbConnection DB = new SqlConnection(conn);
  4 
  5         #region 带模型的CRUD操作
  6 
  7         /// <summary>
  8 
  9         /// 插入test
 10 
 11         /// </summary>
 12 
 13         /// <param name="db"></param>
 14 
 15         /// <param name="test"></param>
 16 
 17         static void Insert(IDbConnection db, ATest test)
 18 
 19         {
 20 
 21             string sql = "insert into ATest (Name,Code) values (@Name,@Code)";
 22 
 23             db.Execute(sql, test);
 24 
 25         }
 26 
 27         /// <summary>
 28 
 29         /// 批量插入
 30 
 31         /// </summary>
 32 
 33         /// <param name="db"></param>
 34 
 35         /// <param name="test"></param>
 36 
 37         static void BluckInsert(IDbConnection db, List<ATest> list)
 38 
 39         {
 40 
 41             string sql = "insert into ATest (Name,Code) values (@Name,@Code)";
 42 
 43             db.Execute(sql, list);
 44 
 45         }
 46 
 47         /// <summary>
 48 
 49         /// 查找所有名称为test的对象
 50 
 51         /// </summary>
 52 
 53         /// <param name="db"></param>
 54 
 55         /// <returns></returns>
 56 
 57         static IEnumerable<ATest> GetAlltest(IDbConnection db)
 58 
 59         {
 60 
 61             string sql = @"SELECT ID ,Name ,Code
 62 
 63                            FROM dbo.ATest where Name=@Name";
 64 
 65             return db.Query<ATest>(sql, new { Name = "test" });
 66 
 67         }
 68 
 69         static IEnumerable<ATest> GetAll(IDbConnection db)
 70 
 71         {
 72 
 73             string sql = @"SELECT ID ,Name ,Code
 74 
 75                            FROM dbo.ATest ";
 76 
 77             return db.Query<ATest>(sql);
 78 
 79         }
 80 
 81         /// <summary>
 82 
 83         /// 删除
 84 
 85         /// </summary>
 86 
 87         /// <param name="db"></param>
 88 
 89         static void DeleteAll(IDbConnection db) {
 90 
 91             string sql = "TRUNCATE TABLE dbo.ATest";
 92 
 93             db.Execute(sql);
 94 
 95         }
 96 
 97         static void Update(IDbConnection db, ATest test){
 98 
 99             string sql = "update ATest set Name=@Name where Code=@Code";
100 
101             db.Execute(sql, test);
102 
103         }
104 
105  
106 
107         #endregion
108 
109  
110 
111         static void Main(string[] args)
112 
113         {
114 
115             DeleteAll(DB);
116 
117             Console.WriteLine("------------删除结束---------------");
118 
119             //测试插入单个对象
120 
121             ATest test = new ATest() {Name="test",Code="Test" };
122 
123             Insert(DB,test);
124 
125            var json=  JsonConvert.SerializeObject(GetAll(DB));
126 
127             Console.WriteLine(json);
128 
129             Console.WriteLine("------------插入结束---------------");
130 
131             //批量插入
132 
133             List<ATest> list = new List<ATest>() {
134 
135  
136 
137              new ATest(){ Name="test",Code="bluckinsert"},
138 
139               new ATest(){ Name="test",Code="bluckinsert"},
140 
141                new ATest(){ Name="test",Code="bluckinsert"},
142 
143                 new ATest(){ Name="test",Code="bluckinsert"},
144 
145                 new ATest(){ Name="test",Code="bluckinsert"},
146 
147             };
148 
149             BluckInsert(DB, list);
150 
151              json = JsonConvert.SerializeObject(GetAll(DB));
152 
153             Console.WriteLine(json);
154 
155             Console.WriteLine("------------批量插入结束---------------");
156 
157             //修改,将上面list集合所有数据的name更改为周杰伦,直接用一个模型传值进去,运行结果等价于 paramer: new {Name="周杰伦",Code="bluckinsert"}
158 
159             var updatemodel = list.FirstOrDefault();
160 
161             updatemodel.Name = "周杰伦";
162 
163             Update(DB, updatemodel);
164 
165             json = JsonConvert.SerializeObject(GetAll(DB));
166 
167             Console.WriteLine(json);
168 
169             Console.WriteLine("------------更新结束---------------");
170 
171             Console.ReadLine();
172 
173         } 
复制代码

      备注:传入参数可以直接用模型,也可以用object new {Name="test",Code="Test"};这是我写这个测试的重点,因为以前听人说查Gooole,用DynamicParameters,我信了,走了很多弯路。包括还有一系列扩展都尝试过,比如Extendtions和Contrib,虽然帮助类多,反倒越麻烦了。尤其是写扩展[key]。

运行结果:

二、不使用模型

  1.不使用模型就是将上面的模型写成  object paramer=new {key1=value1,key2=value2}的形式。还是很灵活。

  2.Query的Dymaic类型,这个东西没理解,就理解成匿名类还蛮好用,简单CRUD转成json就和后台无关。复杂的逻辑还没想好怎么用它。

三、为什么要做这个测试

  现在遇到的项目架构比较老,基本都是写sql,模型层也是sql拼起来的,和数据schema完全不一样,几百个表改起来实在麻烦,而且业务错综复杂。做这个测试就是想实现全动态,不建立实体模型,后台逻辑实现全动态。

       这是基础数据访问层的思路和测试结果。下一篇写搭建mvc动态项目管理。