高斋晓开卷,独共圣人语。这篇文章主要讲述Dapper的基本使用相关的知识,希望能为你提供帮助。
Dapper是.NET下一个micro的ORM,它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的。也就是说实体类都要自己写。它没有复杂的配置文件,一个单文件就可以了。给出官方地址。
http://code.google.com/p/dapper-dot-net/
个人觉得他非常好用,现在已经取代了原来的SqlHelper。优点:
- 使用Dapper可以自动进行对象映射!
- 轻量级,单文件。
- 支持多数据库。
- Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象。
先给出实体类的关系:
书和书评是1---n的关系。(沿用Entity Framework的实体类,virtual表示延迟加载,此处忽略)
文章图片
//书 public class Book { public Book() { Reviews = new List< BookReview> (); } public int Id { get; set; } public string Name { get; set; } public virtual List< BookReview> Reviews { get; set; } public override string ToString() { return string.Format("[{0}]------《{1}》", Id, Name); } }//书评 public class BookReview { public int Id { get; set; } public int BookId { get; set; } public virtual string Content { get; set; } public virtual Book AssoicationWithBook { get; set; } public override string ToString() { return string.Format("{0})--[{1}]\t\"{3}\"", Id, BookId, Content); } }
文章图片
- 基本的增删改查操作
IDbConnection conn = new SqlConnection(connString);
Insert
文章图片
Book book = new Book(); book.Name="C#本质论"; string query = "INSERT INTO Book(Name)VALUES(@name)"; //对对象进行操作 conn.Execute(query, book); //直接赋值操作 conn.Execute(query, new {name = "C#本质论"});
文章图片
update
string query = "UPDATE Book SET[email protected] WHERE id [email protected]"; conn.Execute(query, book);
delete
string query = "DELETE FROM Book WHERE id = @id"; conn.Execute(query, book); conn.Execute(query, new { id = id });
【Dapper的基本使用】query
文章图片
string query = "SELECT * FROM Book"; //无参数查询,返回列表,带参数查询和之前的参数赋值法相同。 conn.Query< Book> (query).ToList(); //返回单条信息 string query = "SELECT * FROM Book WHERE id = @id"; book = conn.Query< Book> (query, new { id = id }).SingleOrDefault();
文章图片
- 数据库表对应关系操作
文章图片
//查询图书时,同时查找对应的书评,并存在List中。实现1--n的查询操作 string query = "SELECT * FROM Book b LEFT JOIN BookReview br ON br.BookId = b.Id WHERE b.id = @id"; Book lookup = null; //Query< TFirst, TSecond, TReturn> var b = conn.Query< Book, BookReview, Book> (query, (book, bookReview) => { //扫描第一条记录,判断非空和非重复 if (lookup == null || lookup.Id != book.Id) lookup = book; //书对应的书评非空,加入当前书的书评List中,最后把重复的书去掉。 if (bookReview != null) lookup.Reviews.Add(bookReview); return lookup; }, new { id = id }).Distinct().SingleOrDefault(); return b;
文章图片
文章图片
//1--1操作 BookReview br; string query = "SELECT * FROM BookReview WHERE id = @id"; using (conn) { br = conn.Query< BookReview, Book, BookReview> (query, (bookReview, book) => { bookReview.AssoicationWithBook = book; return bookReview; }, new { id = id }).SingleOrDefault(); return br; }
文章图片
- 事务操作
文章图片
using (conn) { //开始事务 IDbTransaction transaction = conn.BeginTransaction(); try { string query = "DELETE FROM Book WHERE id = @id"; string query2 = "DELETE FROM BookReview WHERE BookId = @BookId"; conn.Execute(query2, new { BookId = id }, transaction, null, null); conn.Execute(query, new { id = id }, transaction, null, null); //提交事务 transaction.Commit(); } catch (Exception ex) { //出现异常,事务Rollback transaction.Rollback(); throw new Exception(ex.Message); } }
文章图片
推荐阅读
- Android活动学习小记
- JFrame实现批量获取Android安装包安全证书MD5
- NetApp CIFS文件共享创建
- 用app.net Core搞点多国语言网站
- android的ndk学习
- Android ListView拉到顶/底部,像橡皮筋一样弹性回弹复位
- Android中验证输入是否为汉字及手机号,邮箱验证,IP地址可用port号验证
- Android 属性动画(Property Animation) 全然解析 (上)
- 安卓下多线程OpenGL共享Context