现在成熟的ORM比比皆是,这里只介绍Dapper的使用(最起码我在使用它,已经运用到项目中,小伙伴们反馈还可以)。
优点:
1、开源、轻量、小巧、上手容易。
2、支持的数据库还蛮多的, Mysql,SqlLite,Sqlserver,Oracle等一系列的数据库。
3、Dapper原理通过Emit反射IDataReader的序列队列来快速的得到和产生对象。性能貌似很牛逼的样子
缺点:
作为一款ORM太过于轻量级了,根据对象自动生成sql的功能还是空白,需要自己来扩展,
当然这也是优点, 好声音的导师们经常说某人就是张白纸……
因此针对Dapper已经有很多成熟的扩展项目了,Dapper.Rainbow、Dapper.Contrib,DapperExtensions。
我们这里介绍的是DapperExtensions。
dapper-dot-net源码:https://github.com/StackExchange/dapper-dot-net (更新频率快,项目包含了各种除了Dapper-Extensions的 扩展项目)
Dapper-Extensions 源码:https://github.com/tmsmith/Dapper-Extensions
Dapper-Extensions的优点:
1、开源
2、针对Dapper封装了常用的CRUD方法,有独立的查询语法。
3、需要映射的实体类本身0配置,无需加特性什么的。是通过独立的映射类来处理,可以设置类映射到DB的别名,字段的别名等等。
Dapper-Extensions的缺点:
1、好几年没更新了
2、不支持oracle(木有oracle的方言,已经搞定)
3、不能同时支持多种数据库(已经搞定)
4、部分代码有些bug(发现的都搞定了)
下面先简单介绍一下Dapper的基本语法。
Dapper就一个.cs文件,可以放到项目代码中直接编译,也可以直接引用DLL文件。
Dapper对DB的操作依赖于Connection,为了支持多库,咱们用 IDbConnection conn
using (IDbConnection conn = GetConnection()) { const string query = "select * from XO order by id desc"; return conn.Query(query,null); }
下面是带参数的语法
int xoID=666; //变量主键
using (IDbConnection conn = GetConnection()) { const string query = "select * from XO where Id=@MyID"; return conn.Query(query, new { MyID = xoID}); }
各种方法都重载了事务的操作,一般的数据库操作都支持。但是每次执行都需要传递sql,而且每次都要使用Using,看着不爽啊, 这……
好吧下面简单介绍下使用Dapper-Extensions的基本语法(在Dapper-Extensions 的基础上用了Repository模式,代码效果如下)。
//实体类 DemoEntity entity = new DemoEntity(); //根据实体主键删除 this.Delete(entity); //根据主键ID删除 this.Delete (1); //增加 this.Insert (entity); //更新 bool result = this.Update (entity); //根据主键返回实体 entity = this.GetById (1); //返回 行数 this.Count (new { ID = 1 }); //查询所有 IEnumerable list = this.GetAll (); IList sort = new List (); sort.Add(new Sort { PropertyName = "ID", Ascending = false }); //条件查询 list = this.GetList (new { ID = 1, Name = "123" }, sort); //orm 拼接条件 查询 IList predList = new List (); predList.Add(Predicates.Field (p => p.Name, Operator.Like, "不知道%")); predList.Add(Predicates.Field (p => p.ID, Operator.Eq, 1)); IPredicateGroup predGroup = Predicates.Group(GroupOperator.And, predList.ToArray()); list = this.GetList (predGroup); //分页查询 long allRowsCount = 0; this.GetPageList (1, 10, out allRowsCount, new { ID = 1 }, sort);
在说ORM之前,还是要说一下HY.DataAccess这个模块
这个模块是对数据访问提供的一个Helper的功能,里面包含了 各种DB的SqlHelper,分页。
DBHelper 都继承自IDBHelper.cs
using System.Data.Common; using System.Data; namespace HY.DataAccess { ////// 提供对数据库的基本操作,连接字符串需要在数据库配置。 /// public interface IDBHelper { /// /// 生成分页SQL语句 /// /// /// /// /// /// /// string GetPagingSql(int pageIndex, int pageSize, string selectSql, string sqlCount, string orderBy); /// /// 开始一个事务 /// /// DbTransaction BeginTractionand(); /// /// 开始一个事务 /// /// 数据库连接字符key DbTransaction BeginTractionand(string connKey); /// /// 回滚事务 /// /// 要回滚的事务 void RollbackTractionand(DbTransaction dbTransaction); /// /// 结束并确认事务 /// /// 要结束的事务 void CommitTractionand(DbTransaction dbTransaction); #region DataSet /// /// 执行sql语句,ExecuteDataSet 返回DataSet /// /// sql语句 /// DataSet ExecuteDataSet(string commandText, CommandType commandType); /// /// 执行sql语句,ExecuteDataSet 返回DataSet /// /// 数据库连接字符key /// sql语句 /// DataSet ExecuteDataSet(string connKey, string commandText, CommandType commandType); /// /// 执行sql语句,ExecuteDataSet 返回DataSet /// /// sql语句 /// /// 参数 DataSet ExecuteDataSet(string commandText, CommandType commandType, params DbParameter[] parameterValues); /// /// 执行sql语句,ExecuteDataSet 返回DataSet /// /// 数据库连接字符key /// sql语句 /// /// 参数 DataSet ExecuteDataSet(string connKey, string commandText, CommandType commandType, params DbParameter[] parameterValues);