介绍

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 github.com/dotnetcore/…。

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

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

特性概览

动态仓储

动态代理仓储(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

通过 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

SmartCode 生成的目录结构

读写分离

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 代理来启用。以下是部分截图。

监控执行命令

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

查看执行的SQL语句

事务

异常

异常堆栈跟踪

示例项目

SmartSql.Sample.AspNetCore

技术交流

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

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

smartsql.net/

转载于:https://juejin.im/post/5cc11a0be51d456e6e389259

你必须知道的 SmartSql !相关推荐

  1. 你必须知道的 SmartSql

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

  2. 你应该知道的25个非常有用的CSS技巧

    在我们的前端CSS编码当中,经常要设置特殊的字体效果,边框圆角等等,还要考虑兼容性的问题, CSS网页布局,说难,其实很简单.说它容易,往往有很多问题困扰着新手,在中介绍了非常多的技巧,这些小技巧与知 ...

  3. 关于机器学习,你应该知道的3个热门专业术语

    https://www.toutiao.com/a6683842829510246923/ 2019-04-25 22:43:48 关于机器学习,你应该知道的3个热门专业术语 原创: 吴郦军.罗人千 ...

  4. 有哪些事情是你成为程序员之后才知道的?

    来源 | 三太子敖丙(ID:JavaAudition) 昨天我教练问我:"有哪些事情是你成为程序员之后才知道的."我就写下来了. 身穿一件微微起球的格子衫,背着工整的双肩包,头发乱 ...

  5. 你需要知道的requestAnimationFrame

    你需要知道的requestAnimationFrame 随着前端的发展,css已经能够实现非常多的动画特效,但是仍然存在css无法完成的动画任务(比如页面滚动),通常的解决方案都是使用js中的setI ...

  6. 《抓住听众心理——演讲者要知道的100件事》一20.人们学习的最优长度是20分钟...

    本节书摘来异步社区<抓住听众心理--演讲者要知道的100件事>一书中的第1章,第20节,作者: [美]Susan M. Weinschenk 译者: 杨妩霞 , 杨煜泳 责编: 赵轩,更多 ...

  7. git分支指的是_你一定知道的Git分支模型

    原标题:你一定知道的Git分支模型 写在前面 本文不是一篇Git入门指南,也不是 Git命令行使用技巧的讲解,而是谈谈作者在过往工作中使用的几种代码版本管理工具的一些体会,同时重点讲解一下Git的分支 ...

  8. 29 个你必须知道的 Linux 命令

    29 个你必须知道的 Linux 命令 2016-08-12    分类:操作系统.编程开发.首页精华暂无人评论     来源:dwqs 分享到:更多0 虽然Linux发行版支持各种各样的饿GUI(g ...

  9. SQL Server 2005:你应该知道的13件事情

    距离微软的SQL Server 2005正式版的推出,已经将近一年的时间.随着最近两份研究报告的出炉,SQL Server 2005又引起了业界的关注和评论--微软凭借SQL Server 2005取 ...

最新文章

  1. Ubantu Mark
  2. 服务器更改文件夹权限,云服务器如何修改文件权限
  3. linux ffmpeg yum源,ffmpeg最新的yum源地址及视频去logo
  4. 《Hadoop海量数据处理:技术详解与项目实战(第2版)》一2.8 小结
  5. raise JSONDecodeError(“Expecting value“, s, err.value) from None
  6. 将markdown文本转换为微信文章格式的解决方案
  7. [WM][转]PPC中如何判断网络已经连接或者断开
  8. python 目标直方图_深入了解扩展事件–直方图目标
  9. python中︿是什么意思_Python learning notes-0003-注释、变量、简单类型、运算符,学习,笔记...
  10. php呼叫平台,什么是PHP运算符“?和“:”呼叫和他们做什么?
  11. MongoDB健壮集群——用副本集做分片
  12. 虚拟 IP原理(动态 IP 、固定 IP 、实体 IP)
  13. VScode运行MATLAB
  14. 其它——Siege压力测试工具使用
  15. 【Scala】Scala练习题(一)
  16. Qt使用QImage裁剪图片
  17. 在被线上大量日志输出导致性能瓶颈毒打了很多次之后总结出的经验
  18. linux下使用ffmpeg将amr转成mp3(转)
  19. mysql为什么不使用二叉树,MYSQL 索引为什么使用B+树,而不是 B 树,二叉树:
  20. 面向流动人口管理的人脸验证系统设计及实现 论文+答辩PPT+项目工程文件

热门文章

  1. 怎么用php myadmin连接远程MYSQL数据库
  2. C#学习笔记(二十一):使用文件基础
  3. luoguP4705 玩游戏
  4. ubuntu16.04打造vim和python3的IDE
  5. 微信公共开发人员文档 阅读笔记
  6. [c#] const 与 readonly
  7. android显示网络gif图片
  8. Linux下动态共享库加载及使用详解
  9. 开发高性能的 ASP.NET 应用程序
  10. 在ubuntu系统下cocos2dx移植到android平台