1.爲什麼選擇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語法十分簡單。並且無須遷就數據庫的設計
2.使用教程
1)在配置文件web.config中添加連接字符串
1
2
3
4
|
<connectionStrings> <add
name= "sqlconnectionString" connectionString= "server=127.0.0.1;database=MyDataBase;User=sa;password=123456;Connect
Timeout=1000000" /> <add
name= "mysqlconnectionString" connectionString= "Database=hyd;Data
Source=127.0.0.1;User Id=root;Password=root;CharSet=utf8;port=3306" /> </connectionStrings> |
2)獲取連接數據庫對象
獲取Sql Server的連接數據庫對象:SqlConnection
1
2
3
4
5
6
7
|
public static SqlConnection
SqlConnection() { string sqlconnectionString
= ConfigurationManager.ConnectionStrings[ "sqlconnectionString" ].ToString(); var connection
= new SqlConnection(sqlconnectionString); connection.Open(); return connection; } |
獲取MySql的連接數據庫對象:MySqlConnection
1
2
3
4
5
6
7
|
public static MySqlConnection
MySqlConnection() { string mysqlconnectionString
= ConfigurationManager.ConnectionStrings[ "mysqlconnectionString" ].ToString(); var connection
= new MySqlConnection(mysqlconnectionString); connection.Open(); return connection; } |
封裝
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class DapperService { public static SqlConnection
SqlConnection() { string sqlconnectionString
= ConfigurationManager.ConnectionStrings[ "sqlconnectionString" ].ToString(); var connection
= new SqlConnection(sqlconnectionString); connection.Open(); return connection; } public static MySqlConnection
MySqlConnection() { string mysqlconnectionString
= ConfigurationManager.ConnectionStrings[ "mysqlconnectionString" ].ToString(); var connection
= new MySqlConnection(mysqlconnectionString); connection.Open(); return connection; } } |
3)實體類
1
2
3
4
5
6
|
public class Users { public int ID
{ get ; set ;
} //自增主鍵 public string Name
{ get ; set ;
} public int Age
{ get ; set ;
} } |
4)增刪改查
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
//增 using (IDbConnection
conn = DapperService.MySqlConnection()) { Users
user = new Users(); user.Name
= "CNKI" ; user.Age
= 38; string sqlCommandText
= @"INSERT
INTO USERS(Name,Age)VALUES(@Name,@Age)" ; int result
= conn.Execute(sqlCommandText, user); } //批量增 using (IDbConnection
conn = DapperService.MySqlConnection()) { List<Users>
list = new List<Users>(); for ( int i
= 0; i < 5; i++) { Users
user = new Users(); user.Name
= "CNKI" ; user.Age
= 38; list.Add(user); } string sqlCommandText
= @"INSERT
INTO USERS(Name,Age)VALUES(@Name,@Age)" ; int result
= conn.Execute(sqlCommandText, list); } //刪 using (IDbConnection
conn = DapperService.MySqlConnection()) { Users
user = new Users(); user.ID
= 1; string sqlCommandText
= @"DELETE
FROM USERS WHERE ID=@ID" ; int result
= conn.Execute(sqlCommandText, user); } //改 using (IDbConnection
conn = DapperService.MySqlConnection()) { Users
user = new Users(); user.ID
= 2; user.Name
= "CNKI" ; user.Age
= 18; string sqlCommandText
= @"UPDATE
USERS SET Age=@Age WHERE ID=@ID" ; int result
= conn.Execute(sqlCommandText, user); } //查 using (IDbConnection
conn = DapperService.MySqlConnection()) { string sqlCommandText
= @"SELECT
* FROM USERS WHERE ID=@ID" ; Users
user = conn.Query<Users>(sqlCommandText, new {
ID=2 }).FirstOrDefault(); } //分頁 using (IDbConnection
conn = DapperService.MySqlConnection()) { int pageIndex
= 0; int pageSize
= 2; string sqlCommandText
= string .Format( @"SELECT
* FROM USERS LIMIT {0},{1} " ,
pageIndex * pageSize, pageSize); List<Users>
user = conn.Query<Users>(sqlCommandText).ToList(); } |
3.防止Sql注入
1
2
3
4
5
6
7
|
using (IDbConnection
conn = DapperService.MySqlConnection()) { string sqlCommandText
= @"SELECT
* FROM USER WHERE ID=@ID" ; var p
= new DynamicParameters(); p.Add( "@ID" ,
1); User
user2 = conn.Query<User>(sqlCommandText,p).FirstOrDefault(); } |
這要用到了Dapper的DynamicParameters動態參數集合類,從上面可以看到可以能過Add方法加入參數。最後通過conn.Query<MSys_Admin>(sqlText, p)執行sql,,返回結果。因爲用的是命令參數的形式,讓sql注入無機可乘,所以這種方案是安全的。
4.操作事物
1 [TestMethod] 2 public void TestDapperTransaction() 3 { 4 using (var conn = new MySql.Data.MySqlClient.MySqlConnection("server=localhost;User Id=root;password=root;Database=test")) 5 { 6 conn.Open(); 7 IDbTransaction trans = conn.BeginTransaction(); 8 int row = conn.Execute(@"update t set name='www.lanhusoft.com' where id=@id", new { id = 3 }, trans); 9 row += conn.Execute("delete from t where id=@id", new { id = 5 }, trans); 10 for (int i = 0; i < 100; i++) 11 { 12 conn.Execute(@"insert t(id, name) values (@id, @name)", new { id = i, name = "www.lanhusoft.com/" + i }); 13 } 14 trans.Commit(); 15 conn.Close(); 16 }17 }
參見:
http://www.cnblogs.com/cnki/p/5723426.html