ShadowSql之借Dapper打造高性能ORM及百变邪术

打印 上一主题 下一主题

主题 1838|帖子 1838|积分 5514

ShadowSql专职拼写sql,要想做为ORM就必要借高人之手
我们要借的就是Dapper,Dapper以高性能著称,ShadowSql搭配Dapper就是强强联手
为此本项目内置了一个子项目Dapper.Shadow就是Dapper扩展
以下是Dapper.Shadow的示例
一、配置Dapper实行器
  1. ISqlEngine engine = new SqliteEngine();
  2. IDbConnection connection = new SqliteConnection("Data Source=file::memory:;Cache=Shared");
  3. IExecutor executor = new DapperExecutor(engine, connection);
复制代码
其中engine数据库(及方言)的配置对象,现在支持5种,分别是MsSql、MySql、Oracle、Postgres和Sqlite
实现ISqlEngine可以自定义数据库范例大概方言的支持
二、读取整张表
  1. var students = Executor.From("Students")
  2.     .ToDapperSelect()
  3.     .Get<Student>();
复制代码
三、查询数据
1、SqlQuery查询数据
  1.         var students = Executor.From("Students")
  2.             .ToSqlQuery()
  3.             .Where("Age=10")
  4.             .ToDapperSelect()
  5.             .Get<Student>();
复制代码
  1.         var students = Executor.From("Students")
  2.             .ToSqlQuery()
  3.             .ColumnValue("Age", 10)
  4.             .ToDapperSelect()
  5.             .Get<Student>();
复制代码
  1.         var table = new StudentTable("Students");
  2.         var students = table.ToSqlQuery()
  3.             .Where(table.Age.EqualValue(10))
  4.             .ToSelect()
  5.             .Get<Student>(Executor);
复制代码
  1.         var students = new StudentTable("Students")
  2.             .ToSqlQuery()
  3.             .Where(table => table.Age.EqualValue(10))
  4.             .ToSelect()
  5.             .Get<Student>(Executor);
复制代码
  1.         var students = new Table("Students")
  2.             .DefineColums("Age")
  3.             .ToSqlQuery()
  4.             .Where(student => student.Column("Age").EqualValue(10))
  5.             .ToDapperSelect(Executor)
  6.             .Get<Student>();
复制代码
重要分以下三种
1.1 把实行器当数据库对象,如许查询就自带实行器,可以直接实行
1.2 实行时把实行器当参数传入
1.3 先查询,调用ToDapperSelect创建可实行对象
 
2、Query查询数据
  1.         var table = new StudentTable("Students");
  2.         var students = table.ToQuery()
  3.             .And(table.Age.EqualValue(10))
  4.             .ToSelect()
  5.             .Get<Student>(Executor);
复制代码
  1.         var students = Executor.From("Students")
  2.             .ToQuery()
  3.             .And(table => table.Field("Age").EqualValue(10))
  4.             .ToDapperSelect()
  5.             .Get<Student>();
复制代码
  1.         var table = new StudentTable("Students");
  2.         var students = table.ToQuery()
  3.             .And(table.Age.EqualValue(10))
  4.             .ToDapperSelect(Executor)
  5.             .Get<Student>();
复制代码
 
查询方式多样,限与篇幅没法逐一
以上示例邮件可以清晰显示ShadowSql和Dapper可以无缝对接
 
四、查询数据百变邪术,值变参数
看以下示例,我们只是用ParametricExecutor代替DapperExecutor
  1.         var connection = new SqliteConnection("Data Source=file::memory:;Cache=Shared");
  2.         var excutor = new ParametricExecutor(new SqliteEngine(), connection);
  3.         var students = excutor.From("Students")
  4.             .ToQuery()
  5.             .And(table => table.Field("Age").EqualValue(10))
  6.             .ToDapperSelect()
  7.             .Get<Student>();
复制代码

 查询照旧正常的,但调试到Dapper内部,看sql发生了变革。
本来sql应该是SELECT * FROM "Students" WHERE "Age"=10变成了SELECT * FROM "Students" WHERE "Age"=@p1
本来参数应该是默认值null的,结果填充了参数p1,值为10
做过sql注入安全的同砚应该很清楚查询值为字符串导致sql注入的风险
尽管该工具对字符串查询值有做过滤的规则,但我们知道这还远远不够
我们应该对字符串查询全部用参数化,但这可能增长了太多工作量,特别是接手祖传的老项目
这个邪术就可以解决这个棘手的问题
以上是用Query举例,用SqlQuery也是同理,ParametricExecutor会把查询值转为参数化查询,并与传入的参数做合并
 
就如许实现了一个精简别致的高性能ORM,您也可以使用ShadowSql和Dapper来DIY属于本身的高性能ORM
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

魏晓东

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表