Dapper
大约 3 分钟
Dapper
参考资料
- https://github.com/StackExchange/Dapper
简介
- Dapper作为一款轻量级ORM工具
- 过扩展
IDbConnection
接口来实现一系列的功能 - Dapper 在执行查询语句时会缓存 SQL 语句的相关信息,保证了 Dapper 拥有较高的性能
快速入门
创建
IDBConnection
对象(例如:SqlConnection
)编写用于
CRUD
的Sql
语句执行
Dapper
方法// 连接字符串 var connStr = $@"Server = localhost\SQLEXPRESS; Database = demoDb; Trusted_Connection = True;"; // 创建 IDBConnection 对象 using (IDbConnection conn = new SqlConnection(connStr)) { conn.Open(); // 调用方法执行 sql 语句 var result = conn.Query<User>("select top 10 * from T_Users",null); // 遍历结果 foreach (var l in result) Console.WriteLine(l.Name); }
扩展方法
方法说明
方法名称 说明 Execute - 可以执行一个或多个命令并返回受影响的行数
- 用于执行存储过程、insert语句、update语句、delete语句Query - 可以执行查询并映射结果
- 匿名类型、强类型、多映射(一对一)、多映射(一对多)、多类型QueryFirst
QueryFirstOrDefault- 可以执行查询并映射第一个结果 QuerySingle
QuerySingleOrDefault- 可以执行查询并映射第一个结果
- 如果序列中没有元素则会引发异常QueryMultiple - 可以在相同的命令和映射结果中执行多个查询 方法参数说明
方法形参 说明 sql 要执行的 sql 语句 param command 的参数(默认为null)
参数可以是强类型、匿名类型transaction 事务(默认为null) commandTimeout command 超时时间(默认为null) commandType command 类型(默认为null) buffered 是否从缓冲读取查询结果(默认为true)
执行 CRUD 操作
查询
简单查询
// @UserName 需要跟参数的属性名或对应的字段名一致 var query = connection.Query<Users>( "select * from UserAccount where UserName=@UserName and UserID=@UserID", new { UserName = "李四", UserID = 1002 }); Console.WriteLine(query.FirstOrDefault().UserName);
关联查询(一对一)
// Query<UserInfo, Users, string> 分别表示查询的两个表映射的对象类型和需要返回的结果类型 // spitOn 用于分割字段解析为不同对象 var result = connection.Query<UserInfo, Users, string>( "select u1.Name,u2.UserID from UserInfo u1,UserAccount u2 where u1.Name=u2.UserName", (u1, u2) =>u1.Name + " " + u2.UserID, splitOn: "UserID"); foreach (var r in result) { Console.WriteLine(r); }
关联查询(一对多)
Book lookup = null; var book = connection.Query<Book, BookMark, Book>( "SELECT * FROM Book b LEFT JOIN BookMark bm ON bm.BookId = b.Id WHERE b.id = @id", (book, bookMark) => { if (lookup == null || lookup.Id != book.Id) lookup = book; if (bookMark != null) lookup.Marks.Add(bookMark); return lookup; }, new { id = id }).Distinct().SingleOrDefault();
查询多个
string sql = "select * from UserInfo;select * from UserAccount"; using (var multipleReader=connection.QueryMultiple(sql) { var userInfo=multipleReader.Read<UserInfo>(); var users =multipleReader.Read<Users>(); }
新增
插入单条数据
// 命令参数可是是匿名类型、强类型 // T_Users(name,password,email) 字段名称对应数据库字段名称 // values(@name,@password,@email) 对应需要插入的数据类型的属性或字段名称 connection.Execute( "insert into T_Users(name,password,email) values(@name,@password,@email)", new { Name = "Lisa", Password = "123456789", Email = "lisa@163.com" });
批量插入数据
// 命令参数可是是匿名类型、强类型对应的集合 List<User> users = new List<User>() { new User("张三","123456","zhangsan@136.com"), new User("Tom","123456","tom@136.com"), }; var res = connection.Execute( "insert into T_Users(name,password,email) values(@name,@password,@email)", users);
修改
connection.Execute(
"update UserAccount set UserName=@UserName where UserID=@UserID",
new {UserName="CurryZhang", UserID = 10081 });
删除
connection.Execute("delete from UserAccount where UserName like '%jack%'");
connection.Execute("delete from UserAccount where UserName=@name",new { name="张飞"});
执行储存过程操作
执行无参储存过程
CREATE PROCEDURE [dbo].[QueryRoleNoParms] AS BEGIN SELECT * FROM T_Role; END
var roleList = con.Query<Role>("QueryRoleNoParms", null, null, true, null, CommandType.StoredProcedure).ToList();
执行有参储存过程
CREATE PROCEDURE [dbo].[QueryRoleWithParms] @RoleId int, @RoleName nvarchar(256)='' out AS BEGIN SELECT @RoleName = RoleName FROM T_Role WHERE RoleId =@RoleId END
DynamicParameters dp = new DynamicParameters(); dp.Add("@RoleId", "1"); dp.Add("@RoleName", "", DbType.String, ParameterDirection.Output); con.Execute("QueryRoleWithParms", dp, null, null, CommandType.StoredProcedure); string roleName = dp.Get<string>("@RoleName");
事务
IDbTransaction trans = connection.BeginTransaction();
connection.Execute("DELETE FROM T_Users WHERE id=@id",new {id=1},trans,null,null);
trans.Commit();