dapper使用 怎样在cs架构上使用

搭建一套自己实用的.net架构【ORM-Dapper+DapperExtensions】 - 王朝网络 -
分享&&&&&当前位置: &&&&&&&&搭建一套自己实用的.net架构【ORM-Dapper+DapperExtensions】&&&  现在成熟的ORM比比皆是,这里只介绍Dapper的使用(最起码我在使用它,已经运用到项目中,小伙伴们反馈还可以)。  优点:  1、开源、轻量、小巧、上手容易。  2、支持的数据库还蛮多的,MySQL,SqlLite,Sqlserver,Oracle等一系列的数据库。  3、Dapper原理通过Emit反射IDataReader的序列队列来快速的得到和产生对象。性能貌似很牛逼的样子  缺点:  作为一款ORM太过于轻量级了,根据对象自动生成sql的功能还是空白,需要自己来扩展,  当然这也是优点,
好声音的导师们经常说某人就是张白纸&&
  因此针对Dapper已经有很多成熟的扩展项目了,Dapper.Rainbow、Dapper.Contrib,DapperExtensions。  我们这里介绍的是DapperExtensions。  dapper-dot-net源码:/StackExchange/dapper-dot-net
(更新频率快,项目包含了各种除了Dapper-Extensions的 扩展项目)  Dapper-Extensions 源码:/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())  
{conststringquery ="select * from XO order by id desc";returnconn.Query&XOEntity&(query,null);  
}  下面是带参数的语法  int xoID=666; //变量主键  using(IDbConnection conn =GetConnection())  
{conststringquery ="select * from XO where Id=@MyID";returnconn.Query&XOEntity&(query,new{ MyID = xoID});  
}  各种方法都重载了事务的操作,一般的数据库操作都支持。但是每次执行都需要传递sql,而且每次都要使用Using,看着不爽啊, 这&&   好吧下面简单介绍下使用Dapper-Extensions的基本语法(在Dapper-Extensions
的基础上用了Repository模式,代码效果如下)。  //实体类DemoEntity entity =newDemoEntity();//根据实体主键删除this.Delete&DemoEntity&(entity);//根据主键ID删除this.Delete&DemoEntity&(1);//增加this.Insert&DemoEntity&(entity);//更新boolresult =this.Update&DemoEntity&(entity);//根据主键返回实体entity =this.GetById&DemoEntity&(1);//返回 行数this.Count&DemoEntity&(new{ ID =1});//查询所有IEnumerable&DemoEntity& list =this.GetAll&DemoEntity&();  
IList&ISort& sort =newList&ISort&();  
sort.Add(newSort {PRopertyName ="ID", Ascending =false});//条件查询list =this.GetList&DemoEntity&(new{ ID =1, Name ="123"}, sort);//orm 拼接条件 查询IList&IPredicate& predList =newList&IPredicate&();  
predList.Add(Predicates.Field&DemoEntity&(p =& p.Name,Operator.Like,"不知道%"));  
predList.Add(Predicates.Field&DemoEntity&(p =& p.ID, Operator.Eq,1));  
IPredicateGroup predGroup=Predicates.Group(GroupOperator.And, predList.ToArray());  
list=this.GetList&DemoEntity&(predGroup);//分页查询longallRowsCount =0;this.GetPageList&DemoEntity&(1,10,outallRowsCount,new{ ID =1}, sort);  在说ORM之前,还是要说一下HY.Dataaccess这个模块    这个模块是对数据访问提供的一个Helper的功能,里面包含了 各种DB的SqlHelper,分页。  DBHelper 都继承自IDBHelper.cs  usingSystem.DnamespaceHY.DataAccess  {///&summary&///提供对数据库的基本操作,连接字符串需要在数据库配置。///&/summary&publicinterfaceIDBHelper  
{///&summary&///生成分页SQL语句///&/summary&///&param name="pageIndex"&&/param&///&param name="pageSize"&&/param&///&param name="selectSql"&&/param&///&param name="sqlCount"&&/param&///&param name="orderBy"&&/param&///&returns&&/returns&stringGetPagingSql(intpageIndex,intpageSize,stringselectSql,stringsqlCount,stringorderBy);///&summary&///开始一个事务///&/summary&///&returns&&/returns&DbTransaction BeginTractionand();///&summary&///开始一个事务///&/summary&///&param name="connKey"&数据库连接字符key&/param&DbTransaction BeginTractionand(stringconnKey);///&summary&///回滚事务///&/summary&///&param name="dbTransaction"&要回滚的事务&/param&voidRollbackTractionand(DbTransaction dbTransaction);///&summary&///结束并确认事务///&/summary&///&param name="dbTransaction"&要结束的事务&/param&voidCommitTractionand(DbTransaction dbTransaction);#regionDataSet///&summary&///执行sql语句,ExecuteDataSet 返回DataSet///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&DataSet ExecuteDataSet(stringcommandText, CommandType commandType);///&summary&///执行sql语句,ExecuteDataSet 返回DataSet///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&DataSet ExecuteDataSet(stringconnKey,stringcommandText, CommandType commandType);///&summary&///执行sql语句,ExecuteDataSet 返回DataSet///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&DataSet ExecuteDataSet(stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///&summary&///执行sql语句,ExecuteDataSet 返回DataSet///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&DataSet ExecuteDataSet(stringconnKey,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);#endregion#regionExecuteNonQuery///&summary&///执行sql语句,返回影响的行数///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&intExecuteNonQuery(stringcommandText, CommandType commandType);///&summary&///执行sql语句,返回影响的行数///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&intExecuteNonQuery(stringconnKey,stringcommandText, CommandType commandType);///&summary&///执行sql语句,返回影响的行数///&/summary&///&param name="trans"&事务对象&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&intExecuteNonQuery(DbTransaction trans,stringcommandText, CommandType commandType);///&summary&///执行sql语句,返回影响的行数///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&intExecuteNonQuery(stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///&summary&///执行sql语句,返回影响的行数///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&intExecuteNonQuery(stringconnKey,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///&summary&///执行sql语句,返回影响的行数///&/summary&///&param name="trans"&事务对象&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&intExecuteNonQuery(DbTransaction trans,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);#endregion#regionIDataReader///&summary&///执行sql语句,ExecuteReader 返回IDataReader///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&IDataReader ExecuteReader(stringcommandText, CommandType commandType);///&summary&///执行sql语句,ExecuteReader 返回IDataReader///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&IDataReader ExecuteReader(stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///&summary&///执行sql语句,ExecuteReader 返回IDataReader///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&IDataReader ExecuteReader(stringconnKey,stringcommandText, CommandType commandType);///&summary&///执行sql语句,ExecuteReader 返回IDataReader///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&IDataReader ExecuteReader(stringconnKey,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);#endregion#regionExecuteScalar///&summary&///执行sql语句,ExecuteScalar 返回第一行第一列的值///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&objectExecuteScalar(stringcommandText, CommandType commandType);///&summary&///执行sql语句,ExecuteScalar 返回第一行第一列的值///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&objectExecuteScalar(stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///&summary&///执行sql语句,ExecuteScalar 返回第一行第一列的值///&/summary&///&param name="trans"&事务&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&objectExecuteScalar(DbTransaction trans,stringcommandText, CommandType commandType);///&summary&///执行sql语句,ExecuteScalar 返回第一行第一列的值///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&objectExecuteScalar(stringconnKey,stringcommandText, CommandType commandType);///&summary&///执行sql语句,ExecuteScalar 返回第一行第一列的值///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&objectExecuteScalar(stringconnKey,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///&summary&///执行sql语句,ExecuteScalar 返回第一行第一列的值///&/summary&///&param name="trans"&事务&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&///&returns&&/returns&objectExecuteScalar(DbTransaction trans,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);#endregion}  }  View Code  IDBsession.cs 对数据访问对象的定义  usingSusingSystem.DnamespaceHY.DataAccess  {///&summary&///数据库接口///&/summary&publicinterfaceIDatabase  
IDbConnection Connection { }  
DatabaseType DatabaseType { }stringConnKey { }  
}///&summary&///数据库类对象///&/summary&publicclassDatabase : IDatabase  
{publicIDbConnection Connection { }publicDatabaseType DatabaseType { }publicstringConnKey { }publicDatabase(IDbConnection connection)  
Connection=  
}publicDatabase(DatabaseType dbType,stringconnKey)  
DatabaseType=dbT  
ConnKey=connK  
Connection=SqlConnectionFactory.CreateSqlConnection(dbType, connKey);  
}///&summary&///数据连接事务的Session接口///&/summary&publicinterfaceIDBSession : IDisposable  
{stringConnKey { }  
DatabaseType DatabaseType { }  
IDbConnection Connection { }  
IDbTransaction Transaction { }  
IDbTransaction Begin(IsolationLevel isolation=IsolationLevel.ReadCommitted);voidCommit();voidRollback();  
}  }  View Code  SqlConnectionFactory.cs 这个类是采用工厂模式创建DB连接的封装,代码如下:  usingSusingSystem.Collections.GusingSystem.CusingSystem.DnamespaceHY.DataAccess  {publicenumDatabaseType  
SqlServer,  
MySql,  
Oracle,  
}publicclassSqlConnectionFactory  
{publicstaticIDbConnection CreateSqlConnection(DatabaseType dbType,stringstrKey)  
IDbConnection connection=stringstrConn =ConfigurationManager.ConnectionStrings[strKey].ConnectionSswitch(dbType)  
{caseDatabaseType.SqlServer:  
connection=newSystem.Data.SqlClient.SqlConnection(strConn);  caseDatabaseType.MySql://connection = new MySql.Data.MySqlClient.MySqlConnection(strConn);//  caseDatabaseType.Oracle://connection = new Oracle.DataAccess.Client.OracleConnection(strConn);connection =newSystem.Data.OracleClient.OracleConnection(strConn);  caseDatabaseType.DB2:  
connection=newSystem.Data.OleDb.OleDbConnection(strConn);    
}  }  View Code  ORM也不是万能的,比如做大数据的批量插入什么的,还是需要SqlHelper,加上有的人就喜欢DataTable或者DataSet。  所以SqlHelper作为根基,ORM作为辅助,万无一失啊。  下面说说ORM这块的实现方式。见下截图  IDataServiceRepository.cs(提供业务层使用,里面的方法不支持传递sql,包含sql的语句最好还是放在数据层操作的好)  usingSystem.Collections.GusingSystem.DusingDapperEusingHY.DataAnamespaceHY.ORM  {publicinterfaceIDataServiceRepository  
IDBSession DBSession { }  
T GetById&T&(dynamic primaryId)whereT :  
IEnumerable&T& GetByIds&T&(IList&dynamic& ids)whereT :  
IEnumerable&T& GetAll&T&()whereT :intCount&T&(objectpredicate,boolbuffered =false)whereT ://lsitIEnumerable&T& GetList&T&(objectpredicate =null, IList&ISort& sort =null,boolbuffered =false)whereT :  
IEnumerable&T& GetPageList&T&(intpageIndex,intpageSize,outlongallRowsCount,objectpredicate =null, IList&ISort& sort =null,boolbuffered =true)whereT :  
dynamic Insert&T&(T entity, IDbTransaction transaction =null)whereT :boolInsertBatch&T&(IEnumerable&T& entityList, IDbTransaction transaction =null)whereT :boolUpdate&T&(T entity, IDbTransaction transaction =null)whereT :boolUpdateBatch&T&(IEnumerable&T& entityList, IDbTransaction transaction =null)whereT :intDelete&T&(dynamic primaryId, IDbTransaction transaction =null)whereT :intDeleteList&T&(objectpredicate, IDbTransaction transaction =null)whereT :boolDeleteBatch&T&(IEnumerable&dynamic& ids, IDbTransaction transaction =null)whereT :  
}  }  View Code   IDataRepository.cs(提供数据层使用,继承了上面的IDataServiceRepository,支持传入sql)  usingSusingSystem.Collections.GusingSystem.DusingDusingHY.DataAnamespaceHY.ORM  {publicinterfaceIDataRepository : IDataServiceRepository  
IDBSession DBSession { }  
IEnumerable&T& Get&T&(stringsql, dynamic param =null,boolbuffered =true)whereT :  
IEnumerable&dynamic& Get(stringsql, dynamic param =null,boolbuffered =true);  
IEnumerable&TReturn& Get&TFirst, TSecond, TReturn&(stringsql, Func&TFirst, TSecond, TReturn&map,  
dynamic param=null, IDbTransaction transaction =null,boolbuffered =true,stringsplitOn ="Id",int? commandTimeout =null);  
IEnumerable&TReturn& Get&TFirst, TSecond,TThird, TReturn&(stringsql, Func&TFirst, TSecond,TThird, TReturn&map,  
dynamic param=null, IDbTransaction transaction =null,boolbuffered =true,stringsplitOn ="Id",int? commandTimeout =null);  
SqlMapper.GridReader GetMultiple(stringsql, dynamic param =null, IDbTransaction transaction =null,int? commandTimeout =null, CommandType? commandType =null);  
IEnumerable&T& GetPage&T&(intpageIndex,intpageSize,outlongallRowsCount,stringsql, dynamic param =null,stringallRowsCountSql=null,
dynamic allRowsCountParam =null,boolbuffered =true)whereT :  
Int32 Execute(stringsql, dynamic param =null, IDbTransaction transaction =null);  
}  }  View Code   RepositoryServiceBase.cs(IDataServiceRepository的实现类)  usingSystem.Collections.GusingSystem.DusingSystem.LusingDusingDapperEusingHY.DataAnamespaceHY.ORM  {publicclassRepositoryServiceBase : IDataServiceRepository  
{publicRepositoryServiceBase()  
}publicRepositoryServiceBase(IDBSession dbSession)  
DBSession=dbS  
}publicIDBSession DBSession { }publicvoidSetDBSession(IDBSession dbSession)  
DBSession=dbS  
}///&summary&///根据Id获取实体///&/summary&///&typeparam name="T"&&/typeparam&///&param name="primaryId"&&/param&///&returns&&/returns&publicT GetById&T&(dynamic primaryId)whereT :class{returnDBSession.Connection.Get&T&(primaryIdasobject, databaseType: DBSession.DatabaseType);  
}///&summary&///根据多个Id获取多个实体///&/summary&///&typeparam name="T"&&/typeparam&///&param name="ids"&&/param&///&returns&&/returns&publicIEnumerable&T& GetByIds&T&(IList&dynamic& ids)whereT :class{vartblName =string.Format("dbo.{0}",typeof(T).Name);varidsin =string.Join(",", ids.ToArray&dynamic&());varsql ="SELECT * FROM @table WHERE Id in (@ids)";  
IEnumerable&T& dataList = DBSession.Connection.Query&T&(sql,new{ table = tblName, ids =idsin });returndataL  
}///&summary&///获取全部数据集合///&/summary&///&typeparam name="T"&&/typeparam&///&returns&&/returns&publicIEnumerable&T& GetAll&T&()whereT :class{returnDBSession.Connection.GetList&T&(databaseType: DBSession.DatabaseType);  
}///&summary&///统计记录总数///&/summary&///&typeparam name="T"&&/typeparam&///&param name="predicate"&&/param&///&param name="buffered"&&/param&///&returns&&/returns&publicintCount&T&(objectpredicate,boolbuffered =false)whereT :class{returnDBSession.Connection.Count&T&(predicate, databaseType: DBSession.DatabaseType);  
}///&summary&///查询列表数据///&/summary&///&typeparam name="T"&&/typeparam&///&param name="predicate"&&/param&///&param name="sort"&&/param&///&param name="buffered"&&/param&///&returns&&/returns&publicIEnumerable&T& GetList&T&(objectpredicate =null, IList&ISort& sort =null,boolbuffered =false)whereT :class{returnDBSession.Connection.GetList&T&(predicate, sort,null,null, buffered, databaseType: DBSession.DatabaseType);  
}///&summary&///分页///&/summary&///&typeparam name="T"&&/typeparam&///&param name="pageIndex"&&/param&///&param name="pageSize"&&/param&///&param name="allRowsCount"&&/param&///&param name="predicate"&&/param&///&param name="sort"&&/param&///&param name="buffered"&&/param&///&returns&&/returns&publicIEnumerable&T& GetPageList&T&(intpageIndex,intpageSize,outlongallRowsCount,objectpredicate =null, IList&ISort& sort =null,boolbuffered =true)whereT :class{if(sort ==null)  
sort=newList&ISort&();  
IEnumerable&T& entityList = DBSession.Connection.GetPage&T&(predicate, sort, pageIndex, pageSize,null,null, buffered, databaseType: DBSession.DatabaseType);  
allRowsCount= DBSession.Connection.Count&T&(predicate, databaseType: DBSession.DatabaseType);returnentityL  
}///&summary&///插入单条记录///&/summary&///&typeparam name="T"&&/typeparam&///&param name="entity"&&/param&///&param name="transaction"&&/param&///&returns&&/returns&publicdynamic Insert&T&(T entity, IDbTransaction transaction =null)whereT :class{  
dynamic result= DBSession.Connection.Insert&T&(entity, transaction, databaseType: DBSession.DatabaseType);  
}///&summary&///更新单条记录///&/summary&///&typeparam name="T"&&/typeparam&///&param name="entity"&&/param&///&param name="transaction"&&/param&///&returns&&/returns&publicboolUpdate&T&(T entity, IDbTransaction transaction =null)whereT :class{boolisOk = DBSession.Connection.Update&T&(entity, transaction, databaseType: DBSession.DatabaseType);returnisOk;  
}///&summary&///删除单条记录///&/summary&///&typeparam name="T"&&/typeparam&///&param name="primaryId"&&/param&///&param name="transaction"&&/param&///&returns&&/returns&publicintDelete&T&(dynamic primaryId, IDbTransaction transaction =null)whereT :class{varentity = GetById&T&(primaryId);varobj = entityasT;intisOk = DBSession.Connection.Delete&T&(obj, databaseType: DBSession.DatabaseType);returnisOk;  
}///&summary&///删除单条记录///&/summary&///&typeparam name="T"&&/typeparam&///&param name="predicate"&&/param&///&param name="transaction"&&/param&///&returns&&/returns&publicintDeleteList&T&(objectpredicate =null, IDbTransaction transaction =null)whereT :class{returnDBSession.Connection.Delete&T&(predicate, transaction, databaseType: DBSession.DatabaseType);  
}///&summary&///批量插入功能///&/summary&///&typeparam name="T"&&/typeparam&///&param name="entityList"&&/param&///&param name="transaction"&&/param&publicboolInsertBatch&T&(IEnumerable&T& entityList, IDbTransaction transaction =null)whereT :class{boolisOk =foreach(variteminentityList)  
Insert&T&(item, transaction);  
isOk=returnisOk;  
}///&summary&///批量更新()///&/summary&///&typeparam name="T"&&/typeparam&///&param name="entityList"&&/param&///&param name="transaction"&&/param&///&returns&&/returns&publicboolUpdateBatch&T&(IEnumerable&T& entityList, IDbTransaction transaction =null)whereT :class{boolisOk =foreach(variteminentityList)  
Update&T&(item, transaction);  
isOk=returnisOk;  
}///&summary&///批量删除///&/summary&///&typeparam name="T"&&/typeparam&///&param name="ids"&&/param&///&param name="transaction"&&/param&///&returns&&/returns&publicboolDeleteBatch&T&(IEnumerable&dynamic& ids, IDbTransaction transaction =null)whereT :class{boolisOk =foreach(varidinids)  
Delete&T&(id, transaction);  
isOk=returnisOk;  
}  }  View Code  RepositoryBase.cs(IDataRepository的实现类)  usingSusingSystem.Collections.GusingSystem.DusingDusingDapperEusingHY.DataAnamespaceHY.ORM  {///&summary&///Repository基类///&/summary&publicclassRepositoryBase : RepositoryServiceBase, IDataRepository  
{publicRepositoryBase()  
}publicnewvoidSetDBSession(IDBSession dbSession)  
{base.SetDBSession(dbSession);  
}publicRepositoryBase(IDBSession dbSession)  
:base(dbSession)  
}///&summary&///根据条件筛选出数据集合///&/summary&///&typeparam name="T"&&/typeparam&///&param name="sql"&&/param&///&param name="param"&&/param&///&param name="buffered"&&/param&///&returns&&/returns&publicIEnumerable&T& Get&T&(stringsql, dynamic param =null,boolbuffered =true)whereT :class{returnDBSession.Connection.Query&T&(sql, paramasobject, DBSession.Transaction, buffered);  
}///&summary&///根据条件筛选数据集合///&/summary&///&param name="sql"&&/param&///&param name="param"&&/param&///&param name="buffered"&&/param&///&returns&&/returns&publicIEnumerable&dynamic& Get(stringsql, dynamic param =null,boolbuffered =true)  
{returnDBSession.Connection.Query(sql, paramasobject, DBSession.Transaction, buffered);  
}///&summary&///分页查询///&/summary&///&typeparam name="T"&&/typeparam&///&param name="pageIndex"&&/param&///&param name="pageSize"&&/param&///&param name="allRowsCount"&&/param&///&param name="sql"&&/param&///&param name="param"&&/param&///&param name="allRowsCountSql"&&/param&///&param name="allRowsCountParam"&&/param&///&param name="buffered"&&/param&///&returns&&/returns&publicIEnumerable&T& GetPage&T&(intpageIndex,intpageSize,outlongallRowsCount,stringsql, dynamic param =null,stringallRowsCountSql =null, dynamic allRowsCountParam =null,boolbuffered =true)whereT :class{  
IEnumerable&T& entityList = DBSession.Connection.GetPage&T&(pageIndex, pageSize,outallRowsCount, sql, paramasobject, allRowsCountSql,null,null, buffered, databaseType: DBSession.DatabaseType);returnentityL  
}///&summary&///根据表达式筛选///&/summary&///&typeparam name="TFirst"&&/typeparam&///&typeparam name="TSecond"&&/typeparam&///&typeparam name="TReturn"&&/typeparam&///&param name="sql"&&/param&///&param name="map"&&/param&///&param name="param"&&/param&///&param name="transaction"&&/param&///&param name="buffered"&&/param&///&param name="splitOn"&&/param&///&param name="commandTimeout"&&/param&///&returns&&/returns&publicIEnumerable&TReturn& Get&TFirst, TSecond, TReturn&(stringsql, Func&TFirst, TSecond, TReturn&map,  
dynamic param=null, IDbTransaction transaction =null,boolbuffered =true,stringsplitOn ="Id",int? commandTimeout =null)  
{returnDBSession.Connection.Query(sql, map, paramasobject, transaction, buffered, splitOn);  
}///&summary&///根据表达式筛选///&/summary&///&typeparam name="TFirst"&&/typeparam&///&typeparam name="TSecond"&&/typeparam&///&typeparam name="TReturn"&&/typeparam&///&param name="sql"&&/param&///&param name="map"&&/param&///&param name="param"&&/param&///&param name="transaction"&&/param&///&param name="buffered"&&/param&///&param name="splitOn"&&/param&///&param name="commandTimeout"&&/param&///&returns&&/returns&publicIEnumerable&TReturn& Get&TFirst, TSecond, TThird, TReturn&(stringsql, Func&TFirst, TSecond, TThird, TReturn&map,  
dynamic param=null, IDbTransaction transaction =null,boolbuffered =true,stringsplitOn ="Id",int? commandTimeout =null)  
{returnDBSession.Connection.Query(sql, map, paramasobject, transaction, buffered, splitOn);  
}///&summary&///获取多实体集合///&/summary&///&param name="sql"&&/param&///&param name="param"&&/param&///&param name="transaction"&&/param&///&param name="commandTimeout"&&/param&///&param name="commandType"&&/param&///&returns&&/returns&publicSqlMapper.GridReader GetMultiple(stringsql, dynamic param =null, IDbTransaction transaction =null,int? commandTimeout =null, CommandType? commandType =null)  
{returnDBSession.Connection.QueryMultiple(sql, paramasobject, transaction, commandTimeout, commandType);  
}///&summary&///执行sql操作///&/summary&///&param name="sql"&&/param&///&param name="param"&&/param&///&returns&&/returns&publicintExecute(stringsql, dynamic param =null, IDbTransaction transaction =null)  
{returnDBSession.Connection.Execute(sql, paramasobject, transaction);  
}  }  View Code  说起DapperExtensions修改的小地方还蛮多的,下图是一个代码比较的截图。所以一会把代码打包贴上来吧(见文章结尾)。  上述代码就可以编译成HY.ORM.DLL文件了。  下面就可以在 自己业务层继承HY.ORM中的RepositoryServiceBase类
,数据层继承HY.ORM中的 RepositoryBase类。  通过各自的构造函数或者, SetDBSession(Helper.CreateDBSession());
进行数据连接初始化。    接下来配置实体类和DB的映射:  publicclassDemoEntity  
{publicintID { }publicstringName { }  
[Serializable]publicclassDomoEntityORMMapper : ClassMapper&DemoEntity&{publicDomoEntityORMMapper()  
{base.Table("Demo");//Map(f =& f.UserID).Ignore();//设置忽略//Map(f =& f.Name).Key(KeyType.Identity);//设置主键(如果主键名称不包含字母&ID&,请设置)AutoMap();  
}  这样就可以在类中
this.Get&DemoEntity&("select * from
Demo where ID=@ID", new { ID = 1 });
这样的语法了。  具体的使用方发
下图是我要介绍实现的项目截图:  其实也是三层,只是名字不一样而已。
  HY.Web( UI层,MVC)  HY.Web.Iservice( 服务接口层)  HY.Web.Service(服务层,HY.Web.Iservice的实现类,
你也可以理解为业务逻辑层BLL)  HY.Web.DAO(数据访问层,
你也可以理解为DAL)  HY.Web.Entity(实体层,
目前只定义了数据实体, 如果你的系统需要给app提供数据, 那么传输的数据要精简,就需要单独定义DTO了。
)  就那用户表来做个实例吧,表结构如下:(下图是用代码生成器截图效果,可以直接修改数据库的描述信息,开发利器。需要的朋友点这里【CodeBuilder-RazorEngine】)    HY.Web.Entity在HY.Web.Entity的项目中新建Sys_UsersEntity.cs
定义实体类  View Code  HY.Web.DAO 定义基类 BaseRepository.cs (可以设置默认的DBsession,方便扩展其它东东)  View Code  定义数据访问层 Sys_UsersRepository.cs (代码里可以封装任何需要写sql 的代码)  View Code  HY.Web.IService定义接口 ISys_Usersservice.cs ,提供给UI访问。  View Code  HY.Web.Service定义BaseService.cs,(可以设置默认的DBsession,方便扩展其它东东)  View Code  定义Sys_UsersService.cs, 去实现ISys_UsersService。  View Code  HY.Web1、定义相关的Controller  2、ISys_UsersService iSys_UsersService = new Sys_UsersService();
(这块其实可以使用 IoC, 相关内容且听后续分解)  3、调用接口  View Code    下载:  HY.DataAccess  修改后的DapperExtensions:Dapperextensions.RAR   相关文章:  搭建一套自己实用的.net架构(1)【概述】  搭建一套自己实用的.net架构(2)【日志模块-log4net】  搭建一套自己实用的.net架构(3)【ORM-Dapper+DapperExtensions】  搭建一套自己实用的.net架构(4)【CodeBuilder-RazorEngine】    原文链接:/hy/p/4759623.html&&&&&今日推荐
&&&&&老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...把牛仔裤磨出有线的破洞
1、具体工具就是磨脚石,下面垫一个硬物,然后用磨脚石一直磨一直磨,到把那块磨薄了,用手撕开就好了。出来的洞啊很自然的。需要猫须的话调几...先来看下敬业福和爱国福
今年春节,支付宝再次推出了“五福红包”活动,表示要“把欠大家的敬业福都还给大家”。
今天该活动正式启动,和去年一样,需要收集“五福”...有时候我们打开冰箱就会闻到一股异味,冰箱里的这种异味是因为一些物质发出的气味的混合体,闻起来让人恶心。 产生这些异味的主要原因有以下几点。
1、很多人有这种习...简介
《极品家丁》讲述了现代白领林晚荣无意回到古代金陵,并追随萧二小姐化名“林三”进入萧府,不料却阴差阳错上演了一出低级家丁拼搏上位的“林三升职记”。...你就是我最爱的宝宝 - 李溪芮
(电视剧《极品家丁》片尾曲)
作词:常馨内
作曲:常馨内
你的眉 又鬼马的挑
你的嘴 又坏坏的笑
上一秒吵闹 下...乌梅,又称春梅,中医认为,乌梅味酸,性温,无毒,具有安心、除热、下气、祛痰、止渴调中、杀虫的功效,治肢体痛、肺痨病。乌梅泡水喝能治伤寒烦热、止吐泻,与干姜一起制...什么是脂肪粒
在我们的脸上总会长一个个像脂肪的小颗粒,弄也弄不掉,而且颜色还是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。
脂肪粒虽然也是由油脂...来源:中国青年报
新的攻击方法不断涌现,黑客几乎永远占据网络攻击的上风,我们不可能通过技术手段杜绝网络攻击。国家安全保障的主要方向是打击犯罪,而不是处置和惩罚...夫妻网络直播“造人”爆红
  1月9日,温岭城北派出所接到南京警方的协查通告,他们近期打掉了一个涉黄直播APP平台。而根据掌握的线索,其中有一对涉案的夫妻主播...如何防止墙纸老化?
(1)选择透气性好的墙纸
市场上墙纸的材质分无纺布的、木纤维的、PVC的、玻璃纤维基材的、布面的等,相对而言,PVC材质的墙纸最不透气...观点一:破日本销售量的“鲜肌之谜” 非日本生产
近一段时间,淘宝上架了一款名为“鲜肌之谜的” 鲑鱼卵巢美容液,号称是最近日本的一款推出的全新护肤品,产品本身所...系腰裙(北宋词人 张先)
惜霜蟾照夜云天,朦胧影、画勾阑。人情纵似长情月,算一年年。又能得、几番圆。
欲寄西江题叶字,流不到、五亭前。东池始有荷新绿,尚小如...关于女人的经典语句1、【做一个独立的女人】
思想独立:有主见、有自己的人生观、价值观。有上进心,永远不放弃自己的理想,做一份自己喜爱的事业,拥有快乐和成就...你想体验机器人性爱吗?你想和性爱机器人结婚吗?如果你想,机器人有拒绝你的权利吗?
近日,第二届“国际人类-机器人性爱研讨会”大会在伦敦金史密斯大学落下帷幕。而...10.土耳其地下洞穴城市
变态指数:★★☆☆☆
这是土耳其卡帕多西亚的一个著名景点,传说是当年基督教徒们为了躲避战争而在此修建。里面曾住着20000人,......据英国《每日快报》报道,一位科学家兼理论家Robert Lanza博士宣称,世界上并不存在人类死亡,死亡的只是身体。他认为我们的意识借助我们体内的能量生存,而且...《我爱狐狸精》 - 刘馨棋
  (电视剧《屏里狐》主题曲)
  作词:金十三&李旦
  作曲:刘嘉
  狐狸精 狐狸仙
  千年修... under pass
自由人非常擅长传球和垫球。
The libero is very go...·&·&·&&&&&&现在成熟的ORM比比皆是,这里只介绍Dapper的使用(最起码我在使用它,已经运用到项目中,小伙伴们反馈还可以)。
1、开源、轻量、小巧、上手容易。
2、支持的数据库还蛮多的,MySQL,SqlLite,Sqlserver,Oracle等一系列的数据库。
3、Dapper原理通过Emit反射IDataReader的序列队列来快速的得到和产生对象。性能貌似很牛逼的样子
作为一款ORM太过于轻量级了,根据对象自动生成sql的功能还是空白,需要自己来扩展,
当然这也是优点,
好声音的导师们经常说某人就是张白纸&&
因此针对Dapper已经有很多成熟的扩展项目了,Dapper.Rainbow、Dapper.Contrib,DapperExtensions。
我们这里介绍的是DapperExtensions。
dapper-dot-net源码:/StackExchange/dapper-dot-net
(更新频率快,项目包含了各种除了Dapper-Extensions的 扩展项目)
Dapper-Extensions 源码:/tmsmith/Dapper-Extensions
Dapper-Extensions的优点:
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())
{conststringquery ="select * from XO order by id desc";returnconn.Query&XOEntity&(query,null);
下面是带参数的语法
int xoID=666; //变量主键
using(IDbConnection conn =GetConnection())
{conststringquery ="select * from XO where Id=@MyID";returnconn.Query&XOEntity&(query,new{ MyID = xoID});
各种方法都重载了事务的操作,一般的数据库操作都支持。但是每次执行都需要传递sql,而且每次都要使用Using,看着不爽啊, 这&&
好吧下面简单介绍下使用Dapper-Extensions的基本语法(在Dapper-Extensions
的基础上用了Repository模式,代码效果如下)。
//实体类DemoEntity entity =newDemoEntity();//根据实体主键删除this.Delete&DemoEntity&(entity);//根据主键ID删除this.Delete&DemoEntity&(1);//增加this.Insert&DemoEntity&(entity);//更新boolresult =this.Update&DemoEntity&(entity);//根据主键返回实体entity =this.GetById&DemoEntity&(1);//返回 行数this.Count&DemoEntity&(new{ ID =1});//查询所有IEnumerable&DemoEntity& list =this.GetAll&DemoEntity&();
IList&ISort& sort =newList&ISort&();
sort.Add(newSort {PRopertyName ="ID", Ascending =false});//条件查询list =this.GetList&DemoEntity&(new{ ID =1, Name ="123"}, sort);//orm 拼接条件 查询IList&IPredicate& predList =newList&IPredicate&();
predList.Add(Predicates.Field&DemoEntity&(p =& p.Name,Operator.Like,"不知道%"));
predList.Add(Predicates.Field&DemoEntity&(p =& p.ID, Operator.Eq,1));
IPredicateGroup predGroup=Predicates.Group(GroupOperator.And, predList.ToArray());
list=this.GetList&DemoEntity&(predGroup);//分页查询longallRowsCount =0;this.GetPageList&DemoEntity&(1,10,outallRowsCount,new{ ID =1}, sort);
在说ORM之前,还是要说一下HY.Dataaccess这个模块
这个模块是对数据访问提供的一个Helper的功能,里面包含了 各种DB的SqlHelper,分页。
DBHelper 都继承自IDBHelper.cs
usingSystem.DnamespaceHY.DataAccess
{///&summary&///提供对数据库的基本操作,连接字符串需要在数据库配置。///&/summary&publicinterfaceIDBHelper
{///&summary&///生成分页SQL语句///&/summary&///&param name="pageIndex"&&/param&///&param name="pageSize"&&/param&///&param name="selectSql"&&/param&///&param name="sqlCount"&&/param&///&param name="orderBy"&&/param&///&returns&&/returns&stringGetPagingSql(intpageIndex,intpageSize,stringselectSql,stringsqlCount,stringorderBy);///&summary&///开始一个事务///&/summary&///&returns&&/returns&DbTransaction BeginTractionand();///&summary&///开始一个事务///&/summary&///&param name="connKey"&数据库连接字符key&/param&DbTransaction BeginTractionand(stringconnKey);///&summary&///回滚事务///&/summary&///&param name="dbTransaction"&要回滚的事务&/param&voidRollbackTractionand(DbTransaction dbTransaction);///&summary&///结束并确认事务///&/summary&///&param name="dbTransaction"&要结束的事务&/param&voidCommitTractionand(DbTransaction dbTransaction);#regionDataSet///&summary&///执行sql语句,ExecuteDataSet 返回DataSet///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&DataSet ExecuteDataSet(stringcommandText, CommandType commandType);///&summary&///执行sql语句,ExecuteDataSet 返回DataSet///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&DataSet ExecuteDataSet(stringconnKey,stringcommandText, CommandType commandType);///&summary&///执行sql语句,ExecuteDataSet 返回DataSet///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&DataSet ExecuteDataSet(stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///&summary&///执行sql语句,ExecuteDataSet 返回DataSet///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&DataSet ExecuteDataSet(stringconnKey,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);#endregion#regionExecuteNonQuery///&summary&///执行sql语句,返回影响的行数///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&intExecuteNonQuery(stringcommandText, CommandType commandType);///&summary&///执行sql语句,返回影响的行数///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&intExecuteNonQuery(stringconnKey,stringcommandText, CommandType commandType);///&summary&///执行sql语句,返回影响的行数///&/summary&///&param name="trans"&事务对象&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&intExecuteNonQuery(DbTransaction trans,stringcommandText, CommandType commandType);///&summary&///执行sql语句,返回影响的行数///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&intExecuteNonQuery(stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///&summary&///执行sql语句,返回影响的行数///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&intExecuteNonQuery(stringconnKey,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///&summary&///执行sql语句,返回影响的行数///&/summary&///&param name="trans"&事务对象&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&intExecuteNonQuery(DbTransaction trans,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);#endregion#regionIDataReader///&summary&///执行sql语句,ExecuteReader 返回IDataReader///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&IDataReader ExecuteReader(stringcommandText, CommandType commandType);///&summary&///执行sql语句,ExecuteReader 返回IDataReader///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&IDataReader ExecuteReader(stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///&summary&///执行sql语句,ExecuteReader 返回IDataReader///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&IDataReader ExecuteReader(stringconnKey,stringcommandText, CommandType commandType);///&summary&///执行sql语句,ExecuteReader 返回IDataReader///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&IDataReader ExecuteReader(stringconnKey,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);#endregion#regionExecuteScalar///&summary&///执行sql语句,ExecuteScalar 返回第一行第一列的值///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&objectExecuteScalar(stringcommandText, CommandType commandType);///&summary&///执行sql语句,ExecuteScalar 返回第一行第一列的值///&/summary&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&objectExecuteScalar(stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///&summary&///执行sql语句,ExecuteScalar 返回第一行第一列的值///&/summary&///&param name="trans"&事务&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&objectExecuteScalar(DbTransaction trans,stringcommandText, CommandType commandType);///&summary&///执行sql语句,ExecuteScalar 返回第一行第一列的值///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&objectExecuteScalar(stringconnKey,stringcommandText, CommandType commandType);///&summary&///执行sql语句,ExecuteScalar 返回第一行第一列的值///&/summary&///&param name="connKey"&数据库连接字符key&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&objectExecuteScalar(stringconnKey,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///&summary&///执行sql语句,ExecuteScalar 返回第一行第一列的值///&/summary&///&param name="trans"&事务&/param&///&param name="commandText"&sql语句&/param&///&param name="commandType"&&/param&///&param name="parameterValues"&参数&/param&///&returns&&/returns&objectExecuteScalar(DbTransaction trans,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);#endregion}
IDBsession.cs 对数据访问对象的定义
usingSusingSystem.DnamespaceHY.DataAccess
{///&summary&///数据库接口///&/summary&publicinterfaceIDatabase
IDbConnection Connection { }
DatabaseType DatabaseType { }stringConnKey { }
}///&summary&///数据库类对象///&/summary&publicclassDatabase : IDatabase
{publicIDbConnection Connection { }publicDatabaseType DatabaseType { }publicstringConnKey { }publicDatabase(IDbConnection connection)
Connection=
}publicDatabase(DatabaseType dbType,stringconnKey)
DatabaseType=dbT
ConnKey=connK
Connection=SqlConnectionFactory.CreateSqlConnection(dbType, connKey);
}///&summary&///数据连接事务的Session接口///&/summary&publicinterfaceIDBSession : IDisposable
{stringConnKey { }
DatabaseType DatabaseType { }
IDbConnection Connection { }
IDbTransaction Transaction { }
IDbTransaction Begin(IsolationLevel isolation=IsolationLevel.ReadCommitted);voidCommit();voidRollback();
SqlConnectionFactory.cs 这个类是采用工厂模式创建DB连接的封装,代码如下:
usingSusingSystem.Collections.GusingSystem.CusingSystem.DnamespaceHY.DataAccess
{publicenumDatabaseType
SqlServer,
}publicclassSqlConnectionFactory
{publicstaticIDbConnection CreateSqlConnection(DatabaseType dbType,stringstrKey)
IDbConnection connection=stringstrConn =ConfigurationManager.ConnectionStrings[strKey].ConnectionSswitch(dbType)
{caseDatabaseType.SqlServer:
connection=newSystem.Data.SqlClient.SqlConnection(strConn);
caseDatabaseType.MySql://connection = new MySql.Data.MySqlClient.MySqlConnection(strConn);//
caseDatabaseType.Oracle://connection = new Oracle.DataAccess.Client.OracleConnection(strConn);connection =newSystem.Data.OracleClient.OracleConnection(strConn);
caseDatabaseType.DB2:
connection=newSystem.Data.OleDb.OleDbConnection(strConn);
ORM也不是万能的,比如做大数据的批量插入什么的,还是需要SqlHelper,加上有的人就喜欢DataTable或者DataSet。
所以SqlHelper作为根基,ORM作为辅助,万无一失啊。
下面说说ORM这块的实现方式。见下截图
IDataServiceRepository.cs(提供业务层使用,里面的方法不支持传递sql,包含sql的语句最好还是放在数据层操作的好)
usingSystem.Collections.GusingSystem.DusingDapperEusingHY.DataAnamespaceHY.ORM
{publicinterfaceIDataServiceRepository
IDBSession DBSession { }
T GetById&T&(dynamic primaryId)whereT :
IEnumerable&T& GetByIds&T&(IList&dynamic& ids)whereT :
IEnumerable&T& GetAll&T&()whereT :intCount&T&(objectpredicate,boolbuffered =false)whereT ://lsitIEnumerable&T& GetList&T&(objectpredicate =null, IList&ISort& sort =null,boolbuffered =false)whereT :
IEnumerable&T& GetPageList&T&(intpageIndex,intpageSize,outlongallRowsCount,objectpredicate =null, IList&ISort& sort =null,boolbuffered =true)whereT :
dynamic Insert&T&(T entity, IDbTransaction transaction =null)whereT :boolInsertBatch&T&(IEnumerable&T& entityList, IDbTransaction transaction =null)whereT :boolUpdate&T&(T entity, IDbTransaction transaction =null)whereT :boolUpdateBatch&T&(IEnumerable&T& entityList, IDbTransaction transaction =null)whereT :intDelete&T&(dynamic primaryId, IDbTransaction transaction =null)whereT :intDeleteList&T&(objectpredicate, IDbTransaction transaction =null)whereT :boolDeleteBatch&T&(IEnumerable&dynamic& ids, IDbTransaction transaction =null)whereT :
IDataRepository.cs(提供数据层使用,继承了上面的IDataServiceRepository,支持传入sql)
usingSusingSystem.Collections.GusingSystem.DusingDusingHY.DataAnamespaceHY.ORM
{publicinterfaceIDataRepository : IDataServiceRepository
IDBSession DBSession { }
IEnumerable&T& Get&T&(stringsql, dynamic param =null,boolbuffered =true)whereT :
IEnumerable&dynamic& Get(stringsql, dynamic param =null,boolbuffered =true);
IEnumerable&TReturn& Get&TFirst, TSecond, TReturn&(stringsql, Func&TFirst, TSecond, TReturn&map,
dynamic param=null, IDbTransaction transaction =null,boolbuffered =true,stringsplitOn ="Id",int? commandTimeout =null);
IEnumerable&TReturn& Get&TFirst, TSecond,TThird, TReturn&(stringsql, Func&TFirst, TSecond,TThird, TReturn&map,
dynamic param=null, IDbTransaction transaction =null,boolbuffered =true,stringsplitOn ="Id",int? commandTimeout =null);
SqlMapper.GridReader GetMultiple(stringsql, dynamic param =null, IDbTransaction transaction =null,int? commandTimeout =null, CommandType? commandType =null);
IEnumerable&T& GetPage&T&(intpageIndex,intpageSize,outlongallRowsCount,stringsql, dynamic param =null,stringallRowsCountSql=null,
dynamic allRowsCountParam =null,boolbuffered =true)whereT :
Int32 Execute(stringsql, dynamic param =null, IDbTransaction transaction =null);
RepositoryServiceBase.cs(IDataServiceRepository的实现类)
usingSystem.Collections.GusingSystem.DusingSystem.LusingDusingDapperEusingHY.DataAnamespaceHY.ORM
{publicclassRepositoryServiceBase : IDataServiceRepository
{publicRepositoryServiceBase()
}publicRepositoryServiceBase(IDBSession dbSession)
DBSession=dbS
}publicIDBSession DBSession { }publicvoidSetDBSession(IDBSession dbSession)
DBSession=dbS
}///&summary&///根据Id获取实体///&/summary&///&typeparam name="T"&&/typeparam&///&param name="primaryId"&&/param&///&returns&&/returns&publicT GetById&T&(dynamic primaryId)whereT :class{returnDBSession.Connection.Get&T&(primaryIdasobject, databaseType: DBSession.DatabaseType);
}///&summary&///根据多个Id获取多个实体///&/summary&///&typeparam name="T"&&/typeparam&///&param name="ids"&&/param&///&returns&&/returns&publicIEnumerable&T& GetByIds&T&(IList&dynamic& ids)whereT :class{vartblName =string.Format("dbo.{0}",typeof(T).Name);varidsin =string.Join(",", ids.ToArray&dynamic&());varsql ="SELECT * FROM @table WHERE Id in (@ids)";
IEnumerable&T& dataList = DBSession.Connection.Query&T&(sql,new{ table = tblName, ids =idsin });returndataL
}///&summary&///获取全部数据集合///&/summary&///&typeparam name="T"&&/typeparam&///&returns&&/returns&publicIEnumerable&T& GetAll&T&()whereT :class{returnDBSession.Connection.GetList&T&(databaseType: DBSession.DatabaseType);
}///&summary&///统计记录总数///&/summary&///&typeparam name="T"&&/typeparam&///&param name="predicate"&&/param&///&param name="buffered"&&/param&///&returns&&/returns&publicintCount&T&(objectpredicate,boolbuffered =false)whereT :class{returnDBSession.Connection.Count&T&(predicate, databaseType: DBSession.DatabaseType);
}///&summary&///查询列表数据///&/summary&///&typeparam name="T"&&/typeparam&///&param name="predicate"&&/param&///&param name="sort"&&/param&///&param name="buffered"&&/param&///&returns&&/returns&publicIEnumerable&T& GetList&T&(objectpredicate =null, IList&ISort& sort =null,boolbuffered =false)whereT :class{returnDBSession.Connection.GetList&T&(predicate, sort,null,null, buffered, databaseType: DBSession.DatabaseType);
}///&summary&///分页///&/summary&///&typeparam name="T"&&/typeparam&///&param name="pageIndex"&&/param&///&param name="pageSize"&&/param&///&param name="allRowsCount"&&/param&///&param name="predicate"&&/param&///&param name="sort"&&/param&///&param name="buffered"&&/param&///&returns&&/returns&publicIEnumerable&T& GetPageList&T&(intpageIndex,intpageSize,outlongallRowsCount,objectpredicate =null, IList&ISort& sort =null,boolbuffered =true)whereT :class{if(sort ==null)
sort=newList&ISort&();
IEnumerable&T& entityList = DBSession.Connection.GetPage&T&(predicate, sort, pageIndex, pageSize,null,null, buffered, databaseType: DBSession.DatabaseType);
allRowsCount= DBSession.Connection.Count&T&(predicate, databaseType: DBSession.DatabaseType);returnentityL
}///&summary&///插入单条记录///&/summary&///&typeparam name="T"&&/typeparam&///&param name="entity"&&/param&///&param name="transaction"&&/param&///&returns&&/returns&publicdynamic Insert&T&(T entity, IDbTransaction transaction =null)whereT :class{
dynamic result= DBSession.Connection.Insert&T&(entity, transaction, databaseType: DBSession.DatabaseType);
}///&summary&///更新单条记录///&/summary&///&typeparam name="T"&&/typeparam&///&param name="entity"&&/param&///&param name="transaction"&&/param&///&returns&&/returns&publicboolUpdate&T&(T entity, IDbTransaction transaction =null)whereT :class{boolisOk = DBSession.Connection.Update&T&(entity, transaction, databaseType: DBSession.DatabaseType);returnisOk;
}///&summary&///删除单条记录///&/summary&///&typeparam name="T"&&/typeparam&///&param name="primaryId"&&/param&///&param name="transaction"&&/param&///&returns&&/returns&publicintDelete&T&(dynamic primaryId, IDbTransaction transaction =null)whereT :class{varentity = GetById&T&(primaryId);varobj = entityasT;intisOk = DBSession.Connection.Delete&T&(obj, databaseType: DBSession.DatabaseType);returnisOk;
}///&summary&///删除单条记录///&/summary&///&typeparam name="T"&&/typeparam&///&param name="predicate"&&/param&///&param name="transaction"&&/param&///&returns&&/returns&publicintDeleteList&T&(objectpredicate =null, IDbTransaction transaction =null)whereT :class{returnDBSession.Connection.Delete&T&(predicate, transaction, databaseType: DBSession.DatabaseType);
}///&summary&///批量插入功能///&/summary&///&typeparam name="T"&&/typeparam&///&param name="entityList"&&/param&///&param name="transaction"&&/param&publicboolInsertBatch&T&(IEnumerable&T& entityList, IDbTransaction transaction =null)whereT :class{boolisOk =foreach(variteminentityList)
Insert&T&(item, transaction);
isOk=returnisOk;
}///&summary&///批量更新()///&/summary&///&typeparam name="T"&&/typeparam&///&param name="entityList"&&/param&///&param name="transaction"&&/param&///&returns&&/returns&publicboolUpdateBatch&T&(IEnumerable&T& entityList, IDbTransaction transaction =null)whereT :class{boolisOk =foreach(variteminentityList)
Update&T&(item, transaction);
isOk=returnisOk;
}///&summary&///批量删除///&/summary&///&typeparam name="T"&&/typeparam&///&param name="ids"&&/param&///&param name="transaction"&&/param&///&returns&&/returns&publicboolDeleteBatch&T&(IEnumerable&dynamic& ids, IDbTransaction transaction =null)whereT :class{boolisOk =foreach(varidinids)
Delete&T&(id, transaction);
isOk=returnisOk;
RepositoryBase.cs(IDataRepository的实现类)
usingSusingSystem.Collections.GusingSystem.DusingDusingDapperEusingHY.DataAnamespaceHY.ORM
{///&summary&///Repository基类///&/summary&publicclassRepositoryBase : RepositoryServiceBase, IDataRepository
{publicRepositoryBase()
}publicnewvoidSetDBSession(IDBSession dbSession)
{base.SetDBSession(dbSession);
}publicRepositoryBase(IDBSession dbSession)
:base(dbSession)
}///&summary&///根据条件筛选出数据集合///&/summary&///&typeparam name="T"&&/typeparam&///&param name="sql"&&/param&///&param name="param"&&/param&///&param name="buffered"&&/param&///&returns&&/returns&publicIEnumerable&T& Get&T&(stringsql, dynamic param =null,boolbuffered =true)whereT :class{returnDBSession.Connection.Query&T&(sql, paramasobject, DBSession.Transaction, buffered);
}///&summary&///根据条件筛选数据集合///&/summary&///&param name="sql"&&/param&///&param name="param"&&/param&///&param name="buffered"&&/param&///&returns&&/returns&publicIEnumerable&dynamic& Get(stringsql, dynamic param =null,boolbuffered =true)
{returnDBSession.Connection.Query(sql, paramasobject, DBSession.Transaction, buffered);
}///&summary&///分页查询///&/summary&///&typeparam name="T"&&/typeparam&///&param name="pageIndex"&&/param&///&param name="pageSize"&&/param&///&param name="allRowsCount"&&/param&///&param name="sql"&&/param&///&param name="param"&&/param&///&param name="allRowsCountSql"&&/param&///&param name="allRowsCountParam"&&/param&///&param name="buffered"&&/param&///&returns&&/returns&publicIEnumerable&T& GetPage&T&(intpageIndex,intpageSize,outlongallRowsCount,stringsql, dynamic param =null,stringallRowsCountSql =null, dynamic allRowsCountParam =null,boolbuffered =true)whereT :class{
IEnumerable&T& entityList = DBSession.Connection.GetPage&T&(pageIndex, pageSize,outallRowsCount, sql, paramasobject, allRowsCountSql,null,null, buffered, databaseType: DBSession.DatabaseType);returnentityL
}///&summary&///根据表达式筛选///&/summary&///&typeparam name="TFirst"&&/typeparam&///&typeparam name="TSecond"&&/typeparam&///&typeparam name="TReturn"&&/typeparam&///&param name="sql"&&/param&///&param name="map"&&/param&///&param name="param"&&/param&///&param name="transaction"&&/param&///&param name="buffered"&&/param&///&param name="splitOn"&&/param&///&param name="commandTimeout"&&/param&///&returns&&/returns&publicIEnumerable&TReturn& Get&TFirst, TSecond, TReturn&(stringsql, Func&TFirst, TSecond, TReturn&map,
dynamic param=null, IDbTransaction transaction =null,boolbuffered =true,stringsplitOn ="Id",int? commandTimeout =null)
{returnDBSession.Connection.Query(sql, map, paramasobject, transaction, buffered, splitOn);
}///&summary&///根据表达式筛选///&/summary&///&typeparam name="TFirst"&&/typeparam&///&typeparam name="TSecond"&&/typeparam&///&typeparam name="TReturn"&&/typeparam&///&param name="sql"&&/param&///&param name="map"&&/param&///&param name="param"&&/param&///&param name="transaction"&&/param&///&param name="buffered"&&/param&///&param name="splitOn"&&/param&///&param name="commandTimeout"&&/param&///&returns&&/returns&publicIEnumerable&TReturn& Get&TFirst, TSecond, TThird, TReturn&(stringsql, Func&TFirst, TSecond, TThird, TReturn&map,
dynamic param=null, IDbTransaction transaction =null,boolbuffered =true,stringsplitOn ="Id",int? commandTimeout =null)
{returnDBSession.Connection.Query(sql, map, paramasobject, transaction, buffered, splitOn);
}///&summary&///获取多实体集合///&/summary&///&param name="sql"&&/param&///&param name="param"&&/param&///&param name="transaction"&&/param&///&param name="commandTimeout"&&/param&///&param name="commandType"&&/param&///&returns&&/returns&publicSqlMapper.GridReader GetMultiple(stringsql, dynamic param =null, IDbTransaction transaction =null,int? commandTimeout =null, CommandType? commandType =null)
{returnDBSession.Connection.QueryMultiple(sql, paramasobject, transaction, commandTimeout, commandType);
}///&summary&///执行sql操作///&/summary&///&param name="sql"&&/param&///&param name="param"&&/param&///&returns&&/returns&publicintExecute(stringsql, dynamic param =null, IDbTransaction transaction =null)
{returnDBSession.Connection.Execute(sql, paramasobject, transaction);
说起DapperExtensions修改的小地方还蛮多的,下图是一个代码比较的截图。所以一会把代码打包贴上来吧(见文章结尾)。
上述代码就可以编译成HY.ORM.DLL文件了。
下面就可以在 自己业务层继承HY.ORM中的RepositoryServiceBase类
,数据层继承HY.ORM中的 RepositoryBase类。
通过各自的构造函数或者, SetDBSession(Helper.CreateDBSession());
进行数据连接初始化。
接下来配置实体类和DB的映射:
publicclassDemoEntity
{publicintID { }publicstringName { }
[Serializable]publicclassDomoEntityORMMapper : ClassMapper&DemoEntity&{publicDomoEntityORMMapper()
{base.Table("Demo");//Map(f =& f.UserID).Ignore();//设置忽略//Map(f =& f.Name).Key(KeyType.Identity);//设置主键(如果主键名称不包含字母&ID&,请设置)AutoMap();
这样就可以在类中
this.Get&DemoEntity&("select * from
Demo where ID=@ID", new { ID = 1 });
这样的语法了。
具体的使用方发
下图是我要介绍实现的项目截图:
其实也是三层,只是名字不一样而已。
HY.Web( UI层,MVC)
HY.Web.Iservice( 服务接口层)
HY.Web.Service(服务层,HY.Web.Iservice的实现类,
你也可以理解为业务逻辑层BLL)
HY.Web.DAO(数据访问层,
你也可以理解为DAL)
HY.Web.Entity(实体层,
目前只定义了数据实体, 如果你的系统需要给app提供数据, 那么传输的数据要精简,就需要单独定义DTO了。
就那用户表来做个实例吧,表结构如下:(下图是用代码生成器截图效果,可以直接修改数据库的描述信息,开发利器。需要的朋友点这里【CodeBuilder-RazorEngine】)
HY.Web.Entity在HY.Web.Entity的项目中新建Sys_UsersEntity.cs
定义实体类
HY.Web.DAO 定义基类 BaseRepository.cs (可以设置默认的DBsession,方便扩展其它东东)
定义数据访问层 Sys_UsersRepository.cs (代码里可以封装任何需要写sql 的代码)
HY.Web.IService定义接口 ISys_Usersservice.cs ,提供给UI访问。
HY.Web.Service定义BaseService.cs,(可以设置默认的DBsession,方便扩展其它东东)
定义Sys_UsersService.cs, 去实现ISys_UsersService。
HY.Web1、定义相关的Controller
2、ISys_UsersService iSys_UsersService = new Sys_UsersService();
(这块其实可以使用 IoC, 相关内容且听后续分解)
3、调用接口
HY.DataAccess
修改后的DapperExtensions:Dapperextensions.RAR
相关文章:
搭建一套自己实用的.net架构(1)【概述】
搭建一套自己实用的.net架构(2)【日志模块-log4net】
搭建一套自己实用的.net架构(3)【ORM-Dapper+DapperExtensions】
搭建一套自己实用的.net架构(4)【CodeBuilder-RazorEngine】
原文链接:/hy/p/4759623.html&&&&&  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。&&&&&&为你推荐&&&&&&转载本文&UBB代码&HTML代码复制到剪贴板...&更多内容··········&&&&&&&&&频道精选&&&王朝女性&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝分栏&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝编程&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝导购&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝其他&&|&&|&&|&&|&&|&&|&&&&2005-&&版权所有&}

我要回帖

更多关于 dapper.net 使用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信