网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 软件工程 > 后端开发 > .Net >

ShadowSql.net之借Dapper打造高性能ORM及百变魔法

时间:2025-04-04 01:04

人气:

作者:admin

标签:

导读:ShadowSql专职拼写sql,要想做为ORM就需要借高人之手 我们要借的就是Dapper,Dapper以高性能著称,ShadowSql搭配Dapper就是强强联手 为此本项目内置了一个子项目Dapper.Shadow就是Dapper扩展 以下是Dap...

ShadowSql专职拼写sql,要想做为ORM就需要借高人之手

我们要借的就是Dapper,Dapper以高性能著称,ShadowSql搭配Dapper就是强强联手

为此本项目内置了一个子项目Dapper.Shadow就是Dapper扩展

以下是Dapper.Shadow的示例

一、配置Dapper执行器

ISqlEngine engine = new SqliteEngine();
IDbConnection connection = new SqliteConnection("Data Source=file::memory:;Cache=Shared");
IExecutor executor = new DapperExecutor(engine, connection);

其中engine数据库(及方言)的配置对象,现在支持5种,分别是MsSql、MySql、Oracle、Postgres和Sqlite

实现ISqlEngine可以自定义数据库类型或者方言的支持

二、读取整张表

var students = Executor.From("Students")
    .ToDapperSelect()
    .Get<Student>();

三、查询数据

1、SqlQuery查询数据

        var students = Executor.From("Students")
            .ToSqlQuery()
            .Where("Age=10")
            .ToDapperSelect()
            .Get<Student>();
        var students = Executor.From("Students")
            .ToSqlQuery()
            .ColumnValue("Age", 10)
            .ToDapperSelect()
            .Get<Student>();
        var table = new StudentTable("Students");
        var students = table.ToSqlQuery()
            .Where(table.Age.EqualValue(10))
            .ToSelect()
            .Get<Student>(Executor);
        var students = new StudentTable("Students")
            .ToSqlQuery()
            .Where(table => table.Age.EqualValue(10))
            .ToSelect()
            .Get<Student>(Executor);
        var students = new Table("Students")
            .DefineColums("Age")
            .ToSqlQuery()
            .Where(student => student.Column("Age").EqualValue(10))
            .ToDapperSelect(Executor)
            .Get<Student>();

主要分以下三种

1.1 把执行器当数据库对象,这样查询就自带执行器,可以直接执行

1.2 执行时把执行器当参数传入

1.3 先查询,调用ToDapperSelect创建可执行对象

 

2、Query查询数据

        var table = new StudentTable("Students");
        var students = table.ToQuery()
            .And(table.Age.EqualValue(10))
            .ToSelect()
            .Get<Student>(Executor);
        var students = Executor.From("Students")
            .ToQuery()
            .And(table => table.Field("Age").EqualValue(10))
            .ToDapperSelect()
            .Get<Student>();
        var table = new StudentTable("Students");
        var students = table.ToQuery()
            .And(table.Age.EqualValue(10))
            .ToDapperSelect(Executor)
            .Get<Student>();

 

查询方式多样,限与篇幅没法一一

以上示例邮件可以清晰显示ShadowSql和Dapper可以无缝对接

 

四、查询数据百变魔法,值变参数

看以下示例,我们只是用ParametricExecutor代替DapperExecutor

        var connection = new SqliteConnection("Data Source=file::memory:;Cache=Shared");
        var excutor = new ParametricExecutor(new SqliteEngine(), connection);
        var students = excutor.From("Students")
            .ToQuery()
            .And(table => table.Field("Age").EqualValue(10))
            .ToDapperSelect()
            .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

 

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信