近来公司又有新项目要做,之前做项目用过蛮多ORM,包括ef,NetTiers,ServiceStack.OrmLite等ROM,每种ORM都有一定的坑(或者说是使用者的问题吧~~)。用来用去都觉的有一定的不爽。这次打算用Dapper这个ORM来做项目看看。首先感谢http://www.cnblogs.com/wywnet/p/33422150.html这位老兄给出的文章还有demo(建议大家可以看看),看了后深受启发。所以也确定用Dapper来练练手。好了,先介绍下Dapper这个ORM
1,Dapper是一个轻型的ORM类。代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll. 小型ORM
2,Dapper很快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。 速度快
3,Dapper支持什么数据库。Dapper支持Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库 支持多数据库
4,Dapper的r支持多表并联的对象。支持一对多 多对多的关系。并且没侵入性,想用就用,不想用就不用。无XML无属性。代码以前怎么写现在还怎么写。 灵活性高
5,Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象。性能实在高高高。 性能高
6,Dapper支持net2.0,3.0,3.5,4.0。【如果想在Net2.0下使用,可以去网上找一下Net2.0下如何配置运行Net3.5即可。】 支持多个.net版本
7,Dapper语法十分简单。并且无须迁就数据库的设计。 语法简单,可扩展性强
Dapper官网:https://code.google.com/p/dapper-dot-net/
Dapper简单使用:http://www.cnblogs.com/wywnet/p/3422150.html
SqlMapper.cs 是最基础的底层文件,为了更好的运用,先对Dapper进行扩展,这里写一个Dapper的扩展类(这里只列出主要的类,一些辅助类就不列出了)
Dapper扩展类,DapperEx.cs
1 public static class DapperEx 2 { 3 4 5 /// <summary> 6 /// 插入数据 7 /// </summary> 8 /// <typeparam name="T"></typeparam> 9 /// <param name="dbs"></param> 10 /// <param name="t"></param> 11 /// <param name="transaction"></param> 12 /// <param name="commandTimeout"></param> 13 /// <returns></returns> 14 public static int Insert<T>(this DbBase dbs, T t, IDbTransaction transaction = null, int? commandTimeout = null) where T : class 15 { 16 var db = dbs.DbConnecttion; 17 var sql = SqlQuery<T>.Builder(dbs); 18 var flag = db.Execute(sql.InsertSql, t, transaction, commandTimeout); 19 int KeyID = 0; 20 SetIdentity(db, (id) => { KeyID = id; }, transaction); 21 return KeyID; 22 //return flag == 1; 23 } 24 25 /// <summary> 26 /// 批量插入数据 27 /// </summary> 28 /// <typeparam name="T"></typeparam> 29 /// <param name="dbs"></param> 30 /// <param name="lt"></param> 31 /// <param name="transaction"></param> 32 /// <param name="commandTimeout"></param> 33 /// <returns></returns> 34 public static bool InsertBatch<T>(this DbBase dbs, IList<T> lt, IDbTransaction transaction = null, int? commandTimeout = null) where T : class 35 { 36 var db = dbs.DbConnecttion; 37 var sql = SqlQuery<T>.Builder(dbs); 38 var flag = db.Execute(sql.InsertSql, lt, transaction, commandTimeout); 39 return flag == lt.Count; 40 } 41 42 /// <summary> 43 /// 按条件删除 44 /// </summary> 45 /// <typeparam name="T"></typeparam> 46 /// <param name="dbs"></param> 47 /// <param name="sql"></param> 48 /// <returns></returns> 49 public static bool Delete<T>(this DbBase dbs, SqlQuery sql = null, IDbTransaction transaction = null) where T : class 50 { 51 var db = dbs.DbConnecttion; 52 if (sql == null) 53 { 54 sql = SqlQuery<T>.Builder(dbs); 55 } 56 var f = db.Execute(sql.DeleteSql, sql.Param, transaction); 57 return f > 0; 58 } 59 60 /// <summary> 61 /// 按指定某型删除 62 /// </summary> 63 /// <typeparam name="T"></typeparam> 64 /// <param name="dbs"></param> 65 /// <param name="sql">如果sql为null,则根据t的主键进行修改</param> 66 /// <returns></returns> 67 public static bool Delete<T>(this DbBase dbs, T t, IDbTransaction transaction = null) where T : class 68 { 69 var db = dbs.DbConnecttion; 70 SqlQuery sql = SqlQuery<T>.Builder(dbs); 71 sql = sql.AppendParam<T>(t); 72 var f = db.Execute(sql.DeleteSql, sql.Param, transaction); 73 return f > 0; 74 } 75 76 /// <summary> 77 /// 指定主键ID删除数据 78 /// </summary> 79 /// <typeparam name="T"></typeparam> 80 /// <param name="dbs"></param> 81 /// <param name="ID"></param> 82 /// <param name="transaction"></param> 83 /// <returns></returns> 84 public static bool DeleteByID<T>(this DbBase dbs, object ID, IDbTransaction transaction = null) where T : class 85 { 86 var db = dbs.DbConnecttion; 87 SqlQuery sql = SqlQuery<T>.Builder(dbs); 88 sql.KeyValue = ID; 89 var f = db.Execute(sql.DeleteKeySql, sql.Param, transaction); 90 return f > 0; 91 } 92 93 /// <summary> 94 /// 修改 95 /// </summary> 96 /// <typeparam name="T"></typeparam> 97 /// <param name="dbs"></param> 98 /// <param name="t">如果sql为null,则根据t的主键进行修改</param> 99 /// <param name="sql">按条件修改</param> 100 /// <returns></returns> 101 public static bool Update<T>(this DbBase dbs, T t, SqlQuery sql = null, IDbTransaction transaction = null) where T : class 102 { 103 var db = dbs.DbConnecttion; 104 if (sql == null) 105 { 106 sql = SqlQuery<T>.Builder(dbs); 107 } 108 sql = sql.AppendParam<T>(t); 109 var f = db.Execute(sql.UpdateSql, sql.Param, transaction); 110 return f > 0; 111 } 112 113 /// <summary> 114 /// 修改 115 /// </summary> 116 /// <typeparam name="T"></typeparam> 117 /// <param name="dbs"></param> 118 /// <param name="t">如果sql为null,则根据t的主键进行修改</param> 119 /// <param name="updateProperties">要修改的属性集合</param> 120 /// <param name="sql">按条件修改</param> 121 /// <returns></returns> 122 public static bool Update<T>(this DbBase dbs, T t, IList<string> updateProperties, SqlQuery sql = null, IDbTransaction transaction = null) where T : class 123 { 124 var db = dbs.DbConnecttion; 125 if (sql == null) 126 { 127 sql = SqlQuery<T>.Builder(dbs); 128 } 129 sql = sql.AppendParam<T>(t) 130 .SetExcProperties<T>(updateProperties); 131 var f = db.Execute(sql.UpdateSql, sql.Param, transaction); 132 return f > 0; 133 } 134 135 /// <summary> 136 /// 获取默认一条数据,没有则为NULL 137 /// </summary> 138 /// <typeparam name="T"></typeparam> 139 /// <param name="dbs"></param> 140 /// <param name="sql"></param> 141 /// <returns></returns> 142 public static T SingleOrDefault<T>(this DbBase dbs, SqlQuery sql, IDbTransaction transaction = null) where T : class 143 { 144 var db = dbs.DbConnecttion; 145 if (sql == null) 146 { 147 sql = SqlQuery<T>.Builder(dbs); 148 } 149 sql = sql.Top(1); 150 var result = db.Query<T>(sql.QuerySql, sql.Param, transaction); 151 return result.FirstOrDefault(); 152 } 153 154 /// <summary> 155 /// 分页查询 156 /// </summary> 157 /// <typeparam name="T"></typeparam> 158 /// <param name="dbs"></param> 159 /// <param name="pageIndex"></param> 160 /// <param name="pageSize"></param> 161 /// <param name="dataCount"></param> 162 /// <param name="sqlQuery"></param> 163 /// <returns></returns> 164 public static IList<T> Page<T>(this DbBase dbs, int pageIndex, int pageSize, out long dataCount, SqlQuery sqlQuery = null, IDbTransaction transaction = null) where T : class 165 { 166 var db = dbs.DbConnecttion; 167 var result = new List<T>(); 168 dataCount = 0; 169 if (sqlQuery == null) 170 { 171 sqlQuery = SqlQuery<T>.Builder(dbs); 172 } 173 sqlQuery = sqlQuery.Page(pageIndex, pageSize); 174 var para = sqlQuery.Param; 175 var cr = db.Query(sqlQuery.CountSql, para, transaction).SingleOrDefault(); 176 dataCount = (long)cr.DataCount; 177 result = db.Query<T>(sqlQuery.PageSql, para, transaction).ToList(); 178 return result; 179 } 180 181 /// <summary> 182 /// 查询 183 /// </summary> 184 /// <typeparam name="T"></typeparam> 185 /// <param name="dbs"></param> 186 /// <param name="sql"></param> 187 /// <returns></returns> 188 public static IList<T> Query<T>(this DbBase dbs, SqlQuery sql = null, IDbTransaction transaction = null) where T : class 189 { 190 var db = dbs.DbConnecttion; 191 if (sql == null) 192 { 193 sql = SqlQuery<T>.Builder(dbs); 194 } 195 var result = db.Query<T>(sql.QuerySql, sql.Param, transaction); 196 return result.ToList(); 197 } 198 199 /// <summary> 200 /// 通过主键查询 201 /// </summary> 202 /// <typeparam name="T"></typeparam> 203 /// <param name="dbs"></param> 204 /// <param name="sql"></param> 205 /// <returns></returns> 206 public static T QueryByID<T>(this DbBase dbs, object ID, IDbTransaction transaction = null) where T : class 207 { 208 var db = dbs.DbConnecttion; 209 SqlQuery sql = SqlQuery<T>.Builder(dbs); 210 sql.KeyValue = ID; 211 var result = db.Query<T>(sql.QueryKeySql, sql.Param, transaction).FirstOrDefault(); 212 return result; 213 } 214 215 /// <summary> 216 /// 数据数量 217 /// </summary> 218 /// <typeparam name="T"></typeparam> 219 /// <param name="dbs"></param> 220 /// <param name="sql"></param> 221 /// <returns></returns> 222 public static long Count<T>(this DbBase dbs, SqlQuery sql = null, IDbTransaction transaction = null) where T : class 223 { 224 var db = dbs.DbConnecttion; 225 if (sql == null) 226 { 227 sql = SqlQuery<T>.Builder(dbs); 228 } 229 var cr = db.Query(sql.CountSql, sql.Param, transaction).SingleOrDefault(); 230 return (long)cr.DataCount; 231 } 232 233 public static void SetIdentity(IDbConnection conn, Action<int> setId, IDbTransaction transaction = null) 234 { 235 dynamic identity = conn.Query("SELECT @@IDENTITY AS Id", null, transaction).Single(); 236 int newId = (int)identity.Id; 237 setId(newId); 238 } 239 240 /// <summary> 241 /// 判断对象是否存在 242 /// </summary> 243 /// <typeparam name="T"></typeparam> 244 /// <param name="dbs"></param> 245 /// <param name="ID"></param> 246 /// <param name="transaction"></param> 247 /// <returns></returns> 248 public static bool Exists<T>(this DbBase dbs, object ID, IDbTransaction transaction = null) where T : class 249 { 250 var db = dbs.DbConnecttion; 251 SqlQuery sql = SqlQuery<T>.Builder(dbs); 252 sql.KeyValue = ID; 253 var f = db.Query(sql.ExistsSql, sql.Param, transaction).SingleOrDefault(); 254 return f.DataCount > 0; ;// f > 0; 255 } 256 257 /// <summary> 258 ///自定义语句和存储过程查询--返回集合 259 /// </summary> 260 /// <typeparam name="T">返回集合</typeparam> 261 /// <param name="sql">sql语句或存储过程名字</param> 262 /// <param name="p">参数</param> 263 /// <param name="cmdType">执行的命令类型</param> 264 /// <param name="transaction">事物控制</param> 265 /// DynamicParameters 266 /// <returns></returns> 267 public static IEnumerable<T> Query<T>(this DbBase dbs, string query, object p = null, CommandType cmdType = CommandType.Text, IDbTransaction transaction = null) 268 { 269 var db = dbs.DbConnecttion; 270 return db.Query<T>(query, p, transaction, true, null, cmdType); 271 } 272 273 /// <summary> 274 /// 自定义语句和存储过程的增删改--返回影响的行数 275 /// </summary> 276 /// <typeparam name="T"></typeparam> 277 /// <param name="dbs"></param> 278 /// <param name="query">执行的语句</param> 279 /// <param name="parans">参数</param> 280 /// <param name="transaction">事物控制</param> 281 /// <returns>影响的行数</returns> 282 public static int Execute(this DbBase dbs, string query, object parans, CommandType cmdType = CommandType.Text,IDbTransaction transaction = null) 283 { 284 var db = dbs.DbConnecttion; 285 int row = db.Execute(query, parans, transaction,null,cmdType); 286 return row; 287 } 288 289 }