dapper sql注入extensions 怎么写自定义sql

&&&&ORM-Dapper+DapperExtensions 示例全代码
ORM-Dapper+DapperExtensions 示例全代码
根据博客园“咖啡不苦不舒服”的文章“搭建一套自己实用的.net架构(3)【ORM-Dapper+DapperExtensions】”整合、杜撰的一套完整可运行代码。原地址:/hy/p/4759623.html。
去掉了HY.Web,添加了HY.Web.ConsoleTest控制台程序,做了如下测试:
var service = new DeployService();
service.Insert(entity);
//查询所有
var allList = service.GetAll&DeployEntity&();
//多条件查询
var pgMain = new PredicateGroup { Operator = GroupOperator.Or, Predicates = new List&IPredicate&() };
var pga = new PredicateGroup() { Operator = GroupOperator.And, Predicates = new List&IPredicate&() };
pga.Predicates.Add(Predicates.Field&DeployEntity&(f =& f.DeployCode, Operator.Eq, &100&));
pga.Predicates.Add(Predicates.Field&DeployEntity&(f =& f.ID, Operator.Ge, 47));
pga.Predicates.Add(Predicates.Field&DeployEntity&(f =& f.ID, Operator.Le, 48));
pgMain.Predicates.Add(pga);
var pgb = new PredicateGroup() { Operator = GroupOperator.And, Predicates = new List&IPredicate&() };
pgb.Predicates.Add(Predicates.Field&DeployEntity&(f =& f.DeployCode, Operator.Eq, &10000&));
pgMain.Predicates.Add(pgb);
var specialList = service.GetList&DeployEntity&(pgMain).ToList();
//分页查询
long allRowsCount = 0;
var pageList = service.GetPageList&DeployEntity&(1, 2, out allRowsCount);
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
开发技术下载排行下次自动登录
现在的位置:
& 综合 & 正文
关于Dapper的一些使用和扩展的例子
最近太忙了,所以不好意思。本来想写点关于Dapper的一些应用扩展和一些思想,但是实在没时间。
OK.言归正传。
Dapper是一个轻量的ORM。并不单纯的是一个DBHelper.因为在Dapper中数据其实就是一个对象。Dapper扩展与IDbConnection上,所以事实上它的倾入性很低。我用了StructureMap。如果不喜欢可以自己更换,或者自己实现下。基础的操作是这样的。
就发几个简单的例子。大家还是要动手。稍后我把Dapper给更新下。
/// &summary&
/// 添加一个新的管理员
/// &/summary&
/// &param name="info"&管理员对象&/param&
/// &param name="id"&返回自增长创建的对象id&/param&
public void CreateAdmin(AdminInfo info, out long id)
const string InsertQuery = "insert into `ex_admin` (`adminid`,`adminname`,`adminpassword`,`rndpassword`,`lastloginip`,`lastlogintime`,`lastlogouttime`,`lastmodifypasswordtime`,`islock`,`iseditpassword`,`logintimes`,`loginerrortimes`,`groupid`) values (@adminid,@adminname,@adminpassword,@rndpassword,@lastloginip,@lastlogintime,@lastlogouttime,@lastmodifypasswordtime,@islock,@iseditpassword,@logintimes,@loginerrortimes,@groupid);";
using (var conn = Database.DbService())
conn.Execute(InsertQuery, info);
id = conn.Query&Int64&(Const.LastSQL, null).SingleOrDefault&Int64&();
/// &summary&
/// 删除指定的管理员对象
/// &/summary&
/// &param name="pid"&管理员的id&/param&
public void DeleteAdminInfo(long pid)
const string deletequery = "delete from `ex_admin` where adminid = {0};";
using (var conn = Database.DbService())
conn.Execute(string.Format(deletequery, pid), null);
/// &summary&
/// 更新一条管理员信息
/// &/summary&
/// &param name="info"&要更新的Admin对象&/param&
public void SetAdminInfo(AdminInfo info)
const string query = "update `ex_admin` set `adminid` = @adminid,`adminname` = @adminname,`adminpassword`= @adminpassword,`rndpassword` = @rndpassword,`lastloginip`= @lastloginip,`lastlogintime`= @lastlogintime,`lastlogouttime`
= @lastlogouttime,`lastmodifypasswordtime` = @lastmodifypasswordtime,`islock` = @islock,`iseditpassword`= @iseditpassword,`logintimes`= @logintimes,`loginerrortimes` = @loginerrortimes,`groupid`= @groupidwhere adminid = @";
using (var conn = Database.DbService())
conn.Execute(query, info);
多表关联是这样的。
public class Dog
public int Age { }
public int Id { }
public string Name { }
public int Weight { }
public int IgnoredProperty
public class User
public int mid { }
public string SName { }
public int Pid
public string Password
public Dog DogContent
var list = conn.Query&User, Dog, User&("select * from user inner join dog on (user.pid = dog.Id) order by dog.id desc limit 10", (post, dog) =& { post.DogContent = }, null, null, true, "Id,Name", 30, CommandType.Text).ToList&User&();
如何DogContent是集合的方式方法类推。
这点需要强调为什么没有自动生成SQL语句的功能,其实可以很方便的加一个Mapper来灵活的生成SQL语句,但是觉得还是手写比较好,如果需要迁移数据库,也就一些const常量的sql语句。因为的道理其实就在于简单。
因为很多ORM在特定的时候还是要手写SQL。所以实在不想那么麻烦的倒腾来倒腾去。如果需要扩展,使用作者的扩展就行了在作者的项目里有。里面有SQL语句的生成的这个部分。
有人反映过Oracle下的代码部分值类型有问题,我觉得这块可以自己修改下,可以自己构建一个新的引用类型里然后放到SqlMapper的类型集合,或者手动的构建DynamicParameters。
这些代码很简单。简单看看就会了。还是需要多动手体验下。
发点一些其他方面的扩展吧。这个之前有人发邮件问过我,我简单的写下。大牛拍砖的时候轻点啊。
其实读写分离这个的确没什么含量。主要难点在于如何在数据发布和订阅机制。那就来看看在我结构的一个小型系统中使用Dapper构造出来的读写分离。
/// &summary&
/// 初始化事件
/// &![CDATA[此方法可以进行简化,可以通过x.Scan来直接对应用域进行扫描以及注册。也可以通过OnInit.Config进行直接配置。为了简化以及更方便的理解代码的暂用此方法来实现。]]&
/// &/summary&
public static void OnInit()
ObjectFactory.Initialize(x =&
foreach (DataPool pool in GetOnInitSetting.DataPools)
if (pool.DatabaseType == DatabaseType.MySql)
x.For&IDbConnection&().HybridHttpOrThreadLocalScoped().Use&MySqlConnection&().Named(pool.Name).Ctor&MySqlConnection&("connectionString").EqualToAppSetting(string.Empty, pool.DbConnectString);
else if (pool.DatabaseType == DatabaseType.MsSql)
x.For&IDbConnection&().HybridHttpOrThreadLocalScoped().Use&SqlConnection&().Named(pool.Name).Ctor&SqlConnection&("connectionString").EqualToAppSetting(string.Empty, pool.DbConnectString);
x.For&IAdmin&().HybridHttpOrThreadLocalScoped().Use&DaoAdmin&();
/// &summary&
/// 返回默认的名字为Default的数据库服务通道
/// &/summary&
/// &remarks&
/// 默认的数据库通道。通道的名称为Default.如果异常请检查Global事件中是否有包含有此通道
/// x.For&IDbConnection /&().HybridHttpOrThreadLocalScoped().Use&IDbConnectionAchieve/&().Named("Default").Ctor&IDbConnectionAchieve/&("connectionString").EqualToAppSetting(string.Empty,connectionString);
/// 构造函数需要包含此通道的数据库连接字符串。
/// &/remarks&
/// &returns&返回默认的数据库服务通道并打开数据连接&/returns&
public static IDbConnection DbService()
IDbConnection conn = ObjectFactory.GetNamedInstance&IDbConnection&("Default");
conn.Open();
/// &summary&
/// 返回指定的名字的的数据库服务通道
/// &/summary&
/// &remarks&
/// 如果想正常的启用请在Global事件中注册此通道,并确保已经成功注册。并且确保通道名字的唯一。
/// x.For&IDbConnection /&().HybridHttpOrThreadLocalScoped().Use&IDbConnectionAchieve /&().Named("Default").Ctor&IDbConnectionAchieve /&("connectionString").EqualToAppSetting(string.Empty,connectionString);
/// 构造函数需要包含此通道的数据库连接字符串。
/// &/remarks&
/// &returns&返回默认的数据库服务通道并打开数据连接&/returns&
public static IDbConnection DbService(string servicename)
IDbConnection conn = ObjectFactory.GetNamedInstance&IDbConnection&(servicename);
conn.Open();
于是就发现了数据库的实例在与系统创建的时间,创建好的实例在系统的全局事件里,同时只读,这样确保了线程安全性,同时也防止了频繁的实例化造成的内存占用量大的状况。
而数据库每次只需要打开关闭连接就行了。HybridHttpOrThreadLocalScoped的生存周期为我们确保了如果比如大量的并发查询,以及缓存失效之后的数据库雪崩效应,因为这个时候会进行,这样尽管降低了使用以及执行的效率,但是却确保了服务器的安全。因为无效的查询在设定的时间里如果一直等待就会失效。我们只需要让它一直等待就可以了。
小规模的测试大概560万条数据在Mysql数据下,用LoadRunner下和ab测试,没有缓存的基础上也没出现太多的问题,只是高CPU,内存占用还有其他状况下还是很低。所以这块问题感觉不大,如果有哥们有更好的创意和不同的看法,请麻烦告知下,谢谢了。
于是到了读写分离之后的同步,这个还是蛮简单的。这块可以可以直接通过mysql的增量同步,也可以使用mssql的订阅发布。这个动动鼠标点几下就一切OK了。
而doodle.cms是如何实现的呢。doodle.cms会讲数据进行集合,特定的数据被订阅之后才会同步。
using System.Collections.G
using Doodle.Core.N
namespace Doodle.Core
/// &summary&
/// 订阅接口
/// &/summary&
public interface ISubscription : IDisposable
/// &summary&
/// &/summary&
void Unsubscribe();
/// &summary&
/// 得到的通知集合
/// &/summary&
/// &returns&返回 Notification集合&/returns&
IEnumerable&Notification& GetNotifications();
/// &summary&
/// 订阅的泛型接口
/// &/summary&
/// &typeparam name="T"&类型&/typeparam&
public interface ISubscription&T& : ISubscription
new IEnumerable&Notification&T&& GetNotifications();
/// &summary&
/// 类型的弱引用
/// &/summary&
/// &typeparam name="T"&泛型&/typeparam&
public class WeakReference&T& : WeakReference where T : class
/// &summary&
/// WeakReference的base(target)
/// &/summary&
/// &param name="target"&类型值&/param&
public WeakReference(T target) : base(target)
/// &summary&
/// WeakReference的base(target, trackResurrection)
/// &/summary&
/// &param name="target"&类型值&/param&
/// &param name="trackResurrection"&是否跟踪复活&/param&
public WeakReference(T target, bool trackResurrection) : base(target, trackResurrection)
/// &summary&
/// 获取和设置当前目标
/// &/summary&
public new T Target
get { return (T) base.T
set { base.Target = }
把一个CMS做到这样其实很罪过,可是的确国内实在没什么好用的。
废话少说 言归正传。使用Dapper还是很大的幅度提高了编码的效率和质量,再发个轻量的表设计工具。大概就3M不到吧。希望的下载用下。
设计好表结构了,代码实体也就出来了。数据库实体代码也就出来了。想扩展自己修改下模板。我稍微的修改了下模板。版权归原作者所有。链接在这里
好了工作了。大家用的愉快。
&&&&推荐文章:
【上篇】【下篇】2016年1月 总版技术专家分月排行榜第二2015年11月 总版技术专家分月排行榜第二2015年10月 总版技术专家分月排行榜第二
优秀小版主
2016年1月 总版技术专家分月排行榜第二2015年11月 总版技术专家分月排行榜第二2015年10月 总版技术专家分月排行榜第二
优秀小版主
2016年1月 总版技术专家分月排行榜第二2015年11月 总版技术专家分月排行榜第二2015年10月 总版技术专家分月排行榜第二
优秀小版主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。> 博客详情
摘要: 此文章主要说明,如何利用Dapper.SqlMapper.Query动态的返回查询集合,方便我们提取通用的方法。
用过Dapper的人都知道,Dapper.SqlMapper.Query可以直接返回强类型对象,也就是我们所说的.NET中的类(CLASS)。通常情况下我们都是这么用的,如下定义一个Model:
&public&partial&class&Goods
&&&&&&&&public&long&Id&{&&&}
&&&&&&&&public&string&Name&{&&&}
&&&&&&&&public&decimal&Price&{&&&}
&&&&&&&&public&string&Unit&{&&&}
&&&&&&&&public&string&Images&{&&&}
&&&&&&&&public&string&Summary&{&&&}
&&&&&&&&public&string&Label&{&&&}
&&&&&&&&public&decimal&NowPrice&{&&&}
&&&&&&&&public&string&NowPriceLabel&{&&&}
&&&&&&&&public&byte&FreeFreight&{&&&}
&&&&&&&&public&int&Stock&{&&&}
&&&&&&&&public&int&StoreId&{&&&}
&&&&&&&&public&string&StoreName&{&&&}
& 然后在DAL层查询数据库,如下:
&Goods[]&data&=&SqlMapper.Query&Goods&(SqlConnection,&sql,&paras).ToArray();
这样的结果我们就可以很方便的进行各种操作。但有时候我们可能会遇到这样一些场景,我们想用一个通用的方法来返回结果,比如返回表中的一条记录或者多条记录,和上面不同的是我们这个不是返回固定类型,而是动态的返回我们想要的类型:
SqlMapper.Query&T&&//T:Goods,Person,User等等
这个时候我们该怎么做呢,可能我们会想到.Net里的反射,但是反射在这里是不行的,因为
SqlMapper.Query&T&//这个T必需是个存在类型,不支持变量或者表达式
这个时候我们可以直接这样做:
var&data&=&SqlMapper.Query(SqlConnection,&sql,&paras);/*但是这个返回的是一个IEnumerable&dynamic&,我们没办法直接对其用class的方式进行操作,也没办法直接返回给前端直接绑定使用,通过动态监视,我们可以看到它的最终类型是:DapperRow,这是一个类似datatable里的DataRow。而且你还没办法去new这个对象(DapperRow)。*/
那么我们该怎么做呢,简单的做法就是我们把同样的方法,复制到相应的DAL里。但是我们又不想这么做,因为这个业务没有其它的操作,就是返回一个我们想要的对象。这个时候我们可以用泛型方法来实现这个需求 。关于泛型,这里不做介绍。
代码如下:
&&///&&summary&
&&&&&&&&///&动态返回T类型结果
&&&&&&&&///&&/summary&
&&&&&&&&///&&typeparam&name="T"&返回的对象类型&/typeparam&
&&&&&&&&///&&param&name="table"&表名&/param&
&&&&&&&&///&&param&name="id"&主键&/param&
&&&&&&&&///&&returns&&/returns&
public&static&T&GetModel&T&(string&table,&int&id)
&&&&&&&&&&&&string&sql&=&"select&*&from&"&+&table&+&"&where&Id="&+&
&&&&&&&&&&&&return&SqlMapper.Query&T&(SqlConnection,&sql).AsList&T&()[0];//这里的【0】可以去掉,因为我这个只是返回一条记录,实际使用可以根据情况返回数组
不怎么写文章,如有描述不清楚的地方,请见谅。不过最后的代码应该能说明我想要表达的意思。
人打赏支持
码字总数 700
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥
& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区

我要回帖

更多关于 dapper sqlmapper.cs 的文章

 

随机推荐