你必须知道的 SmartSql

640?wx_fmt=png

介绍

SmartSql = MyBatis + Cache(Memory | Redis) + R/W Splitting +Dynamic Repository + Diagnostics ......


简洁、高效、高性能、扩展性、监控、渐进式开发!

她是如何工作的?

SmartSql 借鉴了 MyBatis 的思想,使用 XML 来管理 SQL ,并且提供了若干个筛选器标签来消除代码层面的各种 if/else 的判断分支。

SmartSql将管理你的 SQL ,并且通过筛选标签来维护本来你在代码层面的各种条件判断,使你的代码更加优美。

为什么选择 SmartSql ?

DotNet 体系下大都是 Linq 系的 ORM,Linq 很好,消除了开发人员对 SQL 的依赖。
但却忽视了一点,SQL 本身并不复杂,而且在复杂查询场景当中开发人员很难通过编写Linq来生成良好性能的SQL,相信使用过EF的同学一定有这样的体验:“我想好了Sql怎么写,然后再来写Linq,完了可能还要再查看一下Linq输出的Sql是什么样的“。这是非常糟糕的体验。要想对Sql做绝对的优化,那么开发者必须对Sql有绝对的控制权。另外Sql本身很简单,为何要增加一层翻译器呢?

SmartSql 从正式开源已历经俩年多的时间,在生产环境经过若干个微服务验证。
同时也有一部分企业正在使用 SmartSql (如果您也在使用 SmartSql 欢迎提交issue)Who is using SmartSql。
目前已加入 NCC。
未来(Roadmap-2019) SmartSql 也会持续加入一些新的特性来帮助开发者提升效率。欢迎提交 Issue https://github.com/dotnetcore/SmartSql/issues。

那么为什么不是 Dapper,或者 DbHelper ?

Dapper 确实很好,并且又很好的性能,但是会让给你的代码里边充斥着 SQL 和各种判断分支,这些将会使代码维护难以阅读和维护。另外 Dapper 只提供了DataReader 到 Entity 的反序列化功能。而 SmartSql 提供了大量的特性来提升开发者的效率。

特性概览

640?wx_fmt=png

动态仓储

动态代理仓储(SmartSql.DyRepository)组件是 SmartSql 非常独特的功能,它能简化 SmartSql 的使用。对业务代码几乎没有侵入。可以说使用 ISqlMapper 是原始方法,而 DyRepository 自动帮你实现这些方法。

DyRepository 的表现是只需要定义仓储接口,通过简单配置就能自动实现这些接口并注册到 IoC 容器中,使用时注入即刻获取实现。原理是通过接口和接口方法的命名规则来获取 SmartSql 的 xml 文件中的 Scope 和 SqlId ,用接口方法的参数作为 Request ,通过 xml 中的 sql 自动判断是查询还是执行操作,最后实现对 ISqlMapper 的调用。

0. 定义仓储接口

    public interface IUserRepository : IRepository<User, long>
{
}

1. 注入依赖

            services.AddSmartSql()
.AddRepositoryFromAssembly(options => { options.AssemblyString = "SmartSql.Starter.Repository"; });

2. 使用

    public class UserService
{
IUserRepository userRepository;

public UserService(IActivityRepository userRepository)
{
this.userRepository = userRepository;
}
}

SmartSql 最佳实践 -> SmartCode

640?wx_fmt=png

通过 SmartCode 开发人员仅需配置好数据库连接即可生成解决方案所需的一切,包括但不限于:

  • 解决方案工程

  • 帮你 restore 一下

  ReStore:
Type: Process
Parameters:
FileName: powershell
WorkingDirectory: '{{Project.Output.Path}}'
Args: dotnet restore
  • Docker

    • 构建 Docker 镜像 & 运行实例

 BuildDocker:
Type: Process
Parameters:
FileName: powershell
WorkingDirectory: '{{Project.Output.Path}}'
Args: docker build -t {{Project.Parameters.DockerImage}}:v1.0.0 .

RunDocker:
Type: Process
Parameters:
FileName: powershell
WorkingDirectory: '{{Project.Output.Path}}'
Args: docker run --name {{Project.Parameters.DockerImage}} --rm -d -p 8008:80 {{Project.Parameters.DockerImage}}:v1.0.0 .
  • 顺便开启个浏览器

  RunChrome:
Type: Process
Parameters:
FileName: C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
CreateNoWindow: false
Args: http://localhost:8008/swagger

Docker

640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png

SmartCode 生成的目录结构

640?wx_fmt=png

读写分离

SmartSql 读写分离特别简便,仅需提供好配置即可:

  <Database>
<DbProvider Name="PostgreSql"/>
<Write Name="WriteDB" ConnectionString="${Master}"/>
<Read Name="ReadDb-1" ConnectionString="${Slave-0}" Weight="100"/>
<Read Name="ReadDb-2" ConnectionString="${Slave-1}" Weight="100"/>
</Database>

缓存

  • Lru 最近最少使用算法

  • Fifo 先进先出算法

  • RedisCacheProvider

  • 其他继承自ICacheProvider缓存类型均可

<Caches>
<Cache Id="LruCache" Type="Lru">
<Property Name="CacheSize" Value="10"/>
<FlushOnExecute Statement="AllPrimitive.Insert"/>
<FlushInterval Hours="1" Minutes="0" Seconds="0"/>
</Cache>
<Cache Id="FifoCache" Type="Fifo">
<Property Name="CacheSize" Value="10"/>
</Cache>
<Cache Id="RedisCache" Type="${RedisCacheProvider}">
<Property Name="ConnectionString" Value="${Redis}" />
<FlushInterval Seconds="60"/>
</Cache>
</Caches>
<Statement Id="QueryByLruCache" Cache="LruCache">
SELECT Top 6 T.* From T_User T;
</Statement>

类型处理器

SmartSql 内部实现了 DotNet 主要类型的类型处理器,并且提供了部分类型兼容的类型转换处理器,同时还提供了比较常用的 JsonTypeHanlder 。

    <TypeHandler PropertyType="SmartSql.Test.Entities.UserInfo,SmartSql.Test" Type="${JsonTypeHandler`}">
<Properties>
<Property Name="DateFormat" Value="yyyy-MM-dd mm:ss"/>
<Property Name="NamingStrategy" Value="Camel"/>
</Properties>
</TypeHandler>

CUD 代码生成

SmartSql 同时提供了 CUD 扩展函数帮助开发者生成好 CUD-SQL ,方便开发者直接使用,无需编写任何配置。

public static TEntity GetById<TEntity, TPrimaryKey>(this ISqlMapper);
public static TPrimaryKey Insert<TEntity, TPrimaryKey>(this ISqlMapper sqlMapper, TEntity entity);
public static int DyUpdate<TEntity>(this ISqlMapper sqlMapper, object entity);
public static int Update<TEntity>(this ISqlMapper sqlMapper, TEntity entity);
public static int DeleteById<TEntity, TPrimaryKey>(this ISqlMapper sqlMapper, TPrimaryKey id);
public static int DeleteMany<TEntity, TPrimaryKey>(this ISqlMapper sqlMapper, IEnumerable<TPrimaryKey> ids);

Id 生成器

SnowflakeId

<IdGenerators>
<IdGenerator Name="SnowflakeId" Type="SnowflakeId">
<Properties>
<Property Name="WorkerIdBits" Value="10"/>
<Property Name="WorkerId" Value="888"/>
<Property Name="Sequence" Value="1"/>
</Properties>
</IdGenerator>
</IdGenerators>
    <Statement Id="Insert">
<IdGenerator Name="SnowflakeId" Id="Id"/>
INSERT INTO T_UseIdGenEntity
(
Id,
Name
)
VALUES
(
@Id,
@Name
);
Select @Id;
</Statement>
var id = SqlMapper.ExecuteScalar<long>(new RequestContext
{
Scope = nameof(UseIdGenEntity),
SqlId = "Insert",
Request = new UseIdGenEntity()
{
Name = "SmartSql"
}
});

DbSequence

<IdGenerators>
<IdGenerator Name="DbSequence" Type="DbSequence">
<Properties>
<Property Name="Step" Value="10"/>
<Property Name="SequenceSql" Value="Select Next Value For IdSequence;"/>
</Properties>
</IdGenerator>
</IdGenerators>
    <Statement Id="InsertByDbSequence">
<IdGenerator Name="DbSequence" Id="Id"/>
INSERT INTO T_UseIdGenEntity
(
Id,
Name
)
VALUES
(
@Id,
@Name
);
Select @Id;
</Statement>
            var id = SqlMapper.ExecuteScalar<long>(new RequestContext
{
Scope = nameof(UseIdGenEntity),
SqlId = "InsertByDbSequence",
Request = new UseIdGenEntity()
{
Name = "SmartSql"
}
});

AOP 事务

        [Transaction]
public virtual long AddWithTran(User user)
{
return _userRepository.Insert(user);
}

事务嵌套

当出现事务嵌套时,子函数的事务特性注解将不再开启,转而使用上级调用函数的事务

        [Transaction]
public virtual long AddWithTranWrap(User user)
{
return AddWithTran(user);
}

BulkInsert

using (var dbSession= SqlMapper.SessionStore.Open())
{
var data = SqlMapper.GetDataTable(new RequestContext
{
Scope = nameof(AllPrimitive),
SqlId = "Query",
Request = new { Taken = 100 }
});
data.TableName = "T_AllPrimitive";
IBulkInsert bulkInsert = new BulkInsert(dbSession);
bulkInsert.Table = data;
bulkInsert.Insert();
}

Skywalking 监控

SmartSql 目前支持 Skywalking 监控,通过安装 SkyAPM-dotnet 代理来启用。以下是部分截图。

监控执行命令

640?wx_fmt=png

查看是否缓存,以及返回的记录数

640?wx_fmt=png

查看执行的SQL语句

640?wx_fmt=png

事务

640?wx_fmt=png

异常

640?wx_fmt=png

异常堆栈跟踪

640?wx_fmt=png

示例项目

SmartSql.Sample.AspNetCore

技术交流

点击链接加入QQ群【SmartSql 官方交流群】:604762592

了解更多,请移步官方文档

https://smartsql.net/

原文地址:https://www.cnblogs.com/Ahoo-Wang/p/SmartSql-README.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OsharpNS轻量级.net core快速开发框架简明入门教程

OsharpNS官方资源项目地址&#xff1a;https://github.com/i66soft/osharp-ns20演示地址&#xff1a;https://www.osharp.org 直接使用QQ登录可以查看效果文档地址&#xff1a;https://docs.osharp.org 正在完善中....发布博客&#xff1a;https://www.cnblogs.com/guomingfeng…

.net core 注入机制与Autofac

本来是要先出注入机制再出 管道 的&#xff0c;哈哈哈……就是不按计划来……这里扯扯题外话&#xff1a;为什么要注入&#xff08;DI&#xff0c;dependency-injection&#xff09;&#xff0c;而不用 new 对象&#xff1f;可能我们都很清楚&#xff0c;new 对象所造成的影响就…

浅析 .Net Core中Json配置的自动更新

Pre很早在看 Jesse 的Asp.net Core快速入门的课程的时候就了解到了在Asp .net core中,如果添加的Json配置被更改了,是支持自动重载配置的,作为一名有着严重"造轮子"情节的程序员,最近在折腾一个博客系统,也想造出一个这样能自动更新以Mysql为数据源的ConfigureSource…

E. Don‘t Really Like How The Story Ends(代码未补)

Don’t Really Like How The Story Ends 题意&#xff1a; 有n个点&#xff0c;m个边&#xff0c;现在要从1号边开始求dfs序&#xff0c;问最少加多少边可以是的dfs序是从1到n&#xff1f; 题解&#xff1a; dfs序的过程中&#xff0c;不走到叶子节点我们是无法回溯的&…

.NET Core 迁移躺坑记续集--Win下莫名其妙的超时

继上一集.NET Core 迁移躺坑记里说到遇到的各种问题并且弄了n个解决方案之后&#xff0c;特别是对于问题4的解决方案对于切换了HttpClientFactory我用了你家netcore 2.1下专门解决之前HttpClient口病已久的灵丹妙药了&#xff0c;信心满满的上线…..然后挂了&#xff0c;该超时…

使用Entity Framework Core访问数据库(Oracle篇)

前言哇。。看看时间 真的很久很久没写博客了 将近一年了。最近一直在忙各种家中事务和公司的新框架 终于抽出时间来更新一波了。本篇主要讲一下关于Entity Framework Core访问oracle数据库的采坑。。强调一下&#xff0c;本篇文章发布之前 关于Entity Framework Core访问oracl…

Asp.Net Core Docker镜像更新系统从wheezy改为stretch

之前写过一个在Asp.Net Core里调用System.Drawing.Common绘图的DEMO&#xff0c;部署到Docker里运行&#xff0c;需要更新Asp.Net Core镜像的操作系统。https://www.cnblogs.com/sunnytrudeau/p/9384620.html当时用的阿里云的源RUN echo "deb http://mirrors.aliyun.com/d…

Monster Hunter(2020南京M)

Monster Hunter(2020南京M) 题意&#xff1a; 给你一颗树&#xff0c;树上每个节点都是一个hpi 血量的怪物。打败每个怪物所需要的能量值为hpi 所 有 存 活 的 直 接 子 节 点 的 hpj 。每次必须要消灭父节点后才能消灭子节点。此外你还有m个魔咒&#xff0c;每个魔咒可以不…

网络数据采集(AngleSharp)-使用AngleSharp做html解析

有这么一本Python的书: <<Python 网络数据采集>>我准备用.NET Core及第三方库实现里面所有的例子. 这是第一部分, 主要使用的是AngleSharp: https://anglesharp.github.io/(文章的章节书与该书是对应的)发送Http请求在python里面这样发送http请求, 它使用的是pytho…

ASP.NET Core在Azure Kubernetes Service中的部署和管理

目标部署&#xff1a;掌握将aspnetcore程序成功发布到Azure Kubernetes Service&#xff08;AKS&#xff09;上管理&#xff1a;掌握将AKS上的aspnetcore程序扩容、更新版本准备工作注册 Azure 账户官网免费帐户Azure 免费帐户仅适用于新用户&#xff0c;并且仅限每个客户一个免…

深入研究 Mini ASP.NET Core,看看 ASP.NET Core 内部到底是如何运行的

几年前&#xff0c;Artech 老师写过一个 Mini MVC&#xff0c;用简单的代码告诉读者 ASP.NET MVC 内部到底是如何运行的。当时我研究完以后&#xff0c;受益匪浅&#xff0c;内心充满了对 Artech 老师的感激&#xff0c;然后用我自己理解的 MVC 知识&#xff0c;写了一篇 深入研…

一文读懂Asp.net core 依赖注入(Dependency injection)

一、什么是依赖注入首先在Asp.net core中是支持依赖注入软件设计模式&#xff0c;或者说依赖注入是asp.net core的核心&#xff1b;依赖注入&#xff08;DI&#xff09;和控制反转&#xff08;IOC&#xff09;基本是一个意思&#xff0c;因为说起来谁都离不开谁&#xff1b;或者…

P4619 [SDOI2018]旧试题

P4619 [SDOI2018]旧试题 题意&#xff1a; 求个式子&#xff1a; (∑i1A∑j1B∑k1Cd(i∗j∗k))mod(1097)(\sum_{i1}^{A}\sum_{j1}^{B}\sum_{k1}^{C}d(i*j*k))mod(10^97)(i1∑A​j1∑B​k1∑C​d(i∗j∗k))mod(1097) 题解&#xff1a; 原创博文1k纪念 很明显&#xff0c;莫比…

C#中使用Bogus创建模拟数据

原文&#xff1a;CREATING SAMPLE DATA FOR C#[1] 作者&#xff1a;Bruno Sonnino 译文&#xff1a;C#中使用Bogus创建模拟数据 译者&#xff1a; Lamond Lu背景在我每次写技术类博文的时候&#xff0c;经常做的一件事就是创建模拟数据。在每篇博文中&#xff0c;为了解释某些概…

CF1253E Antenna Coverage

CF1253E Antenna Coverage 题意&#xff1a; 现在有n个点&#xff0c;每个点的坐标为xi&#xff0c;以及一个范围值si&#xff0c;可以覆盖左右范围[xi-si,xisi] 每次操作&#xff0c;可以花费代价1让第i个天线的si增加1&#xff0c;每个天线都可以进行多次操作。现在请问你最…

使用BeetleX的TcpBenchmark工具进行百万设备模拟测试

其实TCP测试的工具有很多&#xff0c;那BeetleX工具所提供的特点又是什么呢&#xff1f;如果你需数十万的请求或模拟上百万的设备连接&#xff0c;那这个工具相信可以满足你的需要&#xff01;工具是基于BeetleX的基础功能扩展&#xff0c;支持多IP绑定可以轻松实现上百万的cli…

.net core Entity Framework 与 EF Core

重点讲 Entity Framework Core &#xff01;&#xff08;一&#xff09;Entity Framework它是适用于.NET 的对象关系映射程序 (ORM)&#xff0c;现在的EF6已经是久经沙场&#xff0c;并经历重重磨难&#xff0c;获得一致认可的数据访问技术&#xff08;原来加 Title 也挺有意思…

CF1253F Cheap Robot

CF1253F Cheap Robot 题意&#xff1a; 给你一张 N 个点的带权无向连通图&#xff0c;其中结点 1,2,…,k 为充电中心。 一个机器人在图中行走&#xff0c;假设机器人的电池容量为 c&#xff0c;则任何时刻&#xff0c;机器人的电量 x 都必须满足 c0≤x≤c。如果机器人沿着一…

asp.net core 3.0 gRPC框架小试

什么是gRPCgRPC是google开源的一个高性能、跨语言的RPC框架&#xff0c;基于HTTP2协议&#xff0c;采用ProtoBuf 定义的IDL。gRPC 的主要优点是&#xff1a;现代高性能轻量级 RPC 框架。协定优先 API 开发&#xff0c;默认使用协议缓冲区&#xff0c;允许与语言无关的实现。可用…

P1131 [ZJOI2007] 时态同步

P1131 [ZJOI2007] 时态同步 题意&#xff1a; 有一颗树&#xff0c;有一个点是激发器&#xff0c;从这个点开始可以产生一个激励电流&#xff0c;通过导线传向每一个它所连接的节点&#xff0c;经过一个边的花费为w[i],你有一个道具&#xff0c;每用一次可以让一个边的花费1&…