SmartSql 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
SmartSql 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
SmartSql 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
SmartSql 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
SmartSql 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !
授权协议 Apache
开发语言 C#
操作系统 跨平台
软件类型 开源软件
开源组织
地区 国产
投 递 者 Ahoo-Wang
适用人群 未知
收录时间 2018-11-16

软件简介

介绍

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本身很简单,为何要增加一层翻译器呢?

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

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

特性概览

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(IUserRepository userRepository)
        {
            this.userRepository = userRepository;
        }
    }

SmartSql 最佳实践 -> SmartCode

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 SmartCode SmartCode SmartCode

SmartCode 生成的目录结构

SmartCode-directory-structure

读写分离

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

监控执行命令

Query

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

Query-Detail

查看执行的SQL语句

Query-Statement

事务

Transaction

异常

Error

异常堆栈跟踪

Error-Detail

 

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (3)

加载中
还得写SQL语句,这对用惯lambda语句的我来说简直就是走下坡路了 -- 确实如此
2019/08/13 12:29
回复
举报
浓浓的mybatis风格,xml太多了
2019/07/24 17:28
回复
举报
还得写SQL语句,这对用惯lambda语句的我来说简直就是走下坡路了,还是喜欢chloe.orm和dos.orm
2019/01/20 15:47
回复
举报
更多评论
暂无内容
发表了博客
2018/10/15 23:05

SmartSql 常见问题

常见问题 为什么不支持 Linq? SmartSql 希望 开发人员更多的接触 Sql ,获得绝对的控制权与安全感。所以目前没有计划支持 Code First 编程模式。 我想好了Sql怎么写,然后再来写Linq,完了可能还要再查看一下Linq输出的Sql是什么样的,这真是糟糕的体验。要想对Sql做绝对的优化,那么开发者必须对Sql有绝对的控制权。另外Sql本身很简单,为何要增加一层翻译器呢? Codefirst 一个美好,却不切实际的想法。 对SmartSql很感兴趣,不...

0
0
发表于服务端专区
2019/04/11 10:15

SmartSql 介绍

# SmartSql介绍 SmartSql = MyBatis + Cache(Memory | Redis) + R/W Splitting +Dynamic Repository + Diagnostics ...... ## 她是如何工作的? SmartSql 借鉴了MyBatis的思想,使用XML来管理SQL,并且提供了若干个筛选器标签来消除代码层面的各种if/else的判断分支。 SmartSql将管理你的SQL,并且通过筛选标签来维护本来你在代码层面的各种条件判断,使你的代码更加优美。 同时SmartSql还提供了以下各种特性(包括但不限于): ...

0
0
发表于服务端专区
2019/04/11 10:15

SmartSql 入门

# 入门 ## 安装 ``` chsarp Install-Package SmartSql Install-Package SmartSql.Schema // 以及相应ADO.NET驱动 ``` ## 从连接字符串创建SmartSql实例 ``` chsarp var smartSqlBuilder = new SmartSqlBuilder() .UseDataSource(DbProvider.SQLSERVER, ConnectionString) .Build(); ``` ## 从XML中创建SmartSql实例 ``` xml ``` ``` xml T.Id = @Id T.UserName = @UserName T.ExtendedInfo = @ExtendedInfo INSERT INTO T_User ...

0
0
发表了博客
2019/04/11 00:02

SmartSql 入门

入门 安装 Install-Package SmartSql Install-Package SmartSql.Schema // 以及相应ADO.NET驱动 从连接字符串创建SmartSql实例 var smartSqlBuilder = new SmartSqlBuilder() .UseDataSource(DbProvider.SQLSERVER, ConnectionString) .Build(); 从XML中创建SmartSql实例 <?xml version="1.0" encoding="utf-8" ?> <SmartSqlMapConfig xmlns="http://SmartSql.net/schemas/SmartSqlMapConfig.xsd"> <Settings Igno...

0
0
发表了博客
2018/11/16 21:15

SmartSql Map

SmartSqlMap 属性 说明 Scope 域,用于SqlMap定义Sql声明范围 Statement标签 属性 说明 Id 唯一性编号 Cache 缓存策略编号,引用自Cache标签 Statement 筛选子标签 标签 真条件 IsEmpty null or 空字符串 or 空IEnumerable IsEqual 与比较值相等 IsFalse 参数为 false IsGreaterEqual 参数大于等于比较值 IsGreaterThan 参数大于比较值 IsLessEqual 参数小于等于比较值 IsLessThan 参数小于比较值 IsNotEmpty !(null or 空字符串 ...

0
0
发表了博客
2019/04/11 00:06

SmartSql 介绍

介绍 SmartSql = MyBatis + Cache(Memory | Redis) + R/W Splitting +Dynamic Repository + Diagnostics ...... 她是如何工作的? SmartSql 借鉴了MyBatis的思想,使用XML来管理SQL,并且提供了若干个筛选器标签来消除代码层面的各种if/else的判断分支。 SmartSql将管理你的SQL,并且通过筛选标签来维护本来你在代码层面的各种条件判断,使你的代码更加优美。 同时SmartSql还提供了以下各种特性(包括但不限于): 动态代理仓储 ...

0
0
发表于开发技能专区
2019/04/24 14:18

你必须知道的 SmartSql !

# 介绍 > SmartSql = MyBatis + Cache(Memory | Redis) + R/W Splitting +Dynamic Repository + Diagnostics ...... --- > 简洁、高效、高性能、扩展性、监控、渐进式开发! ## 她是如何工作的? SmartSql 借鉴了 MyBatis 的思想,使用 XML 来管理 SQL ,并且提供了若干个筛选器标签来消除代码层面的各种 if/else 的判断分支。 SmartSql将管理你的 SQL ,并且通过筛选标签来维护本来你在代码层面的各种条件判断,使你的代码更加...

0
0
发表了博客
2019/04/24 14:05

你必须知道的 SmartSql !

<p align="center"> <a href="https://www.smartsql.net/" target="_blank"> <img width="100"src="https://raw.githubusercontent.com/dotnetcore/SmartSql/master/SmartSql.png"/> </a> </p> 介绍 SmartSql = MyBatis + Cache(Memory | Redis) + R/W Splitting +Dynamic Repository + Diagnostics ...... 简洁、高效、高性能、扩展性、监控、渐进式开发! 她是如何工作的? SmartSql 借鉴了 MyBatis 的思想,使用 XML 来管理 ...

0
0
发表了博客
2018/10/15 15:21

SmartSql 快速使用指南

SmartSql 快速使用指南(https://github.com/Ahoo-Wang/SmartSql) ISmartSqlMapper 常用(部分)接口概述 函数 说明 Execute IDbCommand.ExecuteNonQuery,执行返回受影响行数 ExecuteScalar IDbCommand.ExecuteScalar,执行并返回查询返回的ReultSet中第一行的第一列 Query 执行返回实体列表 QuerySingle 执行返回单个实体 GetDataTable 执行返回DataTable GetDataSet 执行返回DataSet BeginTransaction 开启事务 CommitTransactio...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
3 评论
16 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部