SmartSql简介
0. Why
- 拥抱 跨平台 DotNet Core,是时候了。
- 高性能、高生产力,史上最轻量级的ORM。107kb
1. So SmartSql
- TargetFrameworks: .NETFramework 4.6 & .NETStandard 2.0
- SmartSql = MyBatis + Cache(Memory | Redis) + ZooKeeper + R/W Splitting + ……
2. 主要特性 (√ 为已完成,未打 √ 为计划特性)
- 1 ORM
- 1.1 Sync
- 1.2 Async
- 2 XmlConfig & XmlStatement -> Sql
- 2.1 SmartSqlMapConfig & SmartSqlMap √ (是的,你猜对了,和MyBatis一样,通过XML配置分离SQL。)
- 2.2 Config Hot Update ->ConfigWatcher & Reload (配置文件热更新:当你需要修改Sql的时候,直接修改SqlMap配置文件,保存即可。)
- 3 读写分离 √
- 3.1 读写分离 √
- 3.2 多读库 权重筛选 √ (配置多读库,根据读库权重选举读库)
- 4 日志 √
- 4.1 基于 Microsoft.Extensions.Logging.Abstractions (当你需要跟踪调试的时候一切都是那么一目了然)
- 5 Dynamic Repository
- 5.1 SmartSql.DyRepository √ (解放你的双手,你来定义仓储接口,我来实现数据库访问)
- 6 查询缓存 √ (热数据缓存,一个配置轻松搞定)
- 6.1 SmartSql.Cache.Memory √
- 6.1.1 Fifo √
- 6.1.2 Lru √
- 6.2 SmartSql.Cache.Redis √
- 6.3 缓存事务一致性
- 7 分布式配置插件
- 7.1 IConfigLoader √ (配置文件加载器)
- 7.2 LocalFileConfigLoader √ √ (本地文件配置加载器)
- 7.2.1 Load SmartSqlMapSource Xml √
- 7.3.1 Load SmartSqlMapSource Directory √
- 7.3 SmartSql.ZooKeeperConfig √ (ZooKeeper 分布式配置文件加载器)
3. 性能
BenchmarkDotNet=v0.10.14, OS=Windows 10.0.16299.431 (1709/FallCreatorsUpdate/Redstone3)
Intel Core i7-4710MQ CPU 2.50GHz (Haswell), 1 CPU, 8 logical and 4 physical cores
Frequency=2435768 Hz, Resolution=410.5481 ns, Timer=TSC
.NET Core SDK=2.1.201
[Host] : .NET Core 2.0.7 (CoreCLR 4.6.26328.01, CoreFX 4.6.26403.03), 64bit RyuJIT
DefaultJob : .NET Core 2.0.7 (CoreCLR 4.6.26328.01, CoreFX 4.6.26403.03), 64bit RyuJIT
| ORM | Type | Method | Mean | Error | StdDev | Rank | Gen 0 | Gen 1 | Gen 2 | Allocated |
|---|---|---|---|---|---|---|---|---|---|---|
| SmartSql | SmartSqlBenchmarks | Query | 101.6 ms | 0.2226 ms | 0.1738 ms | 1 | 2437.5000 | 1062.5000 | 375.0000 | 13.37 MB |
| Native | NativeBenchmarks | Query_IsDBNull_GetValue | 101.7 ms | 0.4101 ms | 0.3635 ms | 1 | 2437.5000 | 1062.5000 | 375.0000 | 13.37 MB |
| Dapper | DapperBenchmarks | Query | 104.4 ms | 1.3195 ms | 1.2342 ms | 2 | 3375.0000 | 1375.0000 | 625.0000 | 17.64 MB |
| SmartSqlDapper | SmartSqlDapperBenchmarks | Query | 105.7 ms | 1.1697 ms | 1.0941 ms | 3 | 3750.0000 | 1437.5000 | 625.0000 | 19.47 MB |
| Native | NativeBenchmarks | Query_GetValue_DbNull | 107.4 ms | 1.0710 ms | 1.0018 ms | 4 | 3062.5000 | 1187.5000 | 500.0000 | 16.42 MB |
| SqlSugar | SqlSugarBenchmarks | Query | 108.9 ms | 0.4048 ms | 0.3787 ms | 5 | 2375.0000 | 1000.0000 | 312.5000 | 13.09 MB |
| EF | EFBenchmarks | SqlQuery | 110.9 ms | 0.6922 ms | 0.6475 ms | 6 | 11062.5000 | - | - | 34.13 MB |
| Chloe | ChloeBenchmarks | Query | 14.5 ms | 2.2600 ms | 5.3711 ms | 7 | 2375.0000 | 1000.0000 | 312.5000 | 13.07 MB |
| EF | EFBenchmarks | Query_NoTracking | 126.4 ms | 1.3197 ms | 1.2344 ms | 8 | 5937.5000 | 2250.0000 | 1062.5000 | 30.16 MB |
| EF | EFBenchmarks | SqlQuery_NoTracking | 148.6 ms | 0.8290 ms | 0.7755 ms | 9 | 7437.5000 | 2937.5000 | 1250.0000 | 37.79 MB |
4. 安装 (NuGet)
Install-Package SmartSql
5. 常规代码查询
ISmartSqlMapper SqlMapper = MapperContainer.Instance.GetSqlMapper();
SqlMapper.Query<T_Test>(new RequestContext
{
Scope = "T_Test",
SqlId = "GetList",
Request = new { Ids = new long[] { 1, 2, 3, 4 } }
});
事务
try
{
ISmartSqlMapper SqlMapper = MapperContainer.Instance.GetSqlMapper();
SqlMapper.BeginTransaction();
//BizCode
SqlMapper.CommitTransaction();
}
catch (Exception ex)
{
SqlMapper.RollbackTransaction();
throw ex;
}
6. 最佳实践
6.1 安装 SmartSql.DIExtension
Install-Package SmartSql.DIExtension
6.2 注入依赖
services.AddSmartSql();
services.AddRepositoryFactory();
services.AddRepositoryFromAssembly((options) =>
{
options.AssemblyString = "SmartSql.Starter.Repository";
});
6.3 定义仓储接口
/// <summary>
/// 属性可选: [SqlMap(Scope = "User")] ,不设置 则默认 Scope 模板:I{Scope}Repository
/// 可传入自定义模板
/// RepositoryBuilder builder=new RepositoryBuilder("I{Scope}DAL");
/// </summary>
public interface IUserRepository
{
/// <summary>
/// 属性可选 [Statement(Execute = ExecuteBehavior.Auto,Id = "Query")]
/// 默认 Execute:Auto ,自动判断 执行类型
/// 默认 Id : 方法名
/// </summary>
/// <param name="reqParams"></param>
/// <returns></returns>
IEnumerable<User> Query(object reqParams);
long GetRecord(object reqParams);
User Get(object reqParams);
long Insert(User entity);
int Update(User entity);
int Delete(User enttiy);
}
6.4 尽情享用
public class UserService
{
private readonly ISmartSqlMapper _smartSqlMapper;
private readonly IUserRepository _userRepository; public UserService(
ISmartSqlMapper smartSqlMapper
, IUserRepository userRepository)
{
_smartSqlMapper = smartSqlMapper;
_userRepository = userRepository;
} public long Add(AddRequest request)
{
int existsNum = _userRepository.Exists(new { request.UserName });
if (existsNum > 0)
{
throw new ArgumentException($"{nameof(request.UserName)} has already existed!");
}
return _userRepository.Add(new Entitiy.User
{
UserName = request.UserName,
Password = request.Password,
Status = Entitiy.UserStatus.Ok,
CreationTime = DateTime.Now,
});
} public void UseTransaction()
{
try
{
_smartSqlMapper.BeginTransaction();
//Biz();
_smartSqlMapper.CommitTransaction();
}
catch (Exception ex)
{
_smartSqlMapper.RollbackTransaction();
throw ex;
}
}
}
7. 文档地址
services.AddSmartSql(); services.AddRepositoryFactory(); services.AddRepositoryFromAssembly((options) => { options.AssemblyString = "SmartSql.Starter.Repository"; });--------------------- 作者:Ahoo 来源:CSDN 原文:https://blog.csdn.net/tsgx_1989/article/details/69055089 版权声明:本文为博主原创文章,转载请附上博文链接!
SmartSql简介的更多相关文章
- SmartSql 动态仓储
动态代理仓储 SmartSql源码:https://github.com/Ahoo-Wang/SmartSql 简介 动态代理仓储(SmartSql.DyRepository)组件是SmartSql非 ...
- SmartSql使用教程(1)——初探,建立一个简单的CURD接口服务
一.引言 最近SmartSql被正式引入到了NCC,借着这个契机写一个使用教程系列 二.SmartSql简介[摘自官方文档] 1. SmartSql是什么? SmartSql = MyBatis + ...
- ASP.NET Core 1.1 简介
ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
- Cassandra简介
在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...
- REST简介
一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...
- Microservice架构模式简介
在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- HTTPS简介
一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...
随机推荐
- Codeforces 498A Crazy Town
C. Crazy Town time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- css 图片有间隔多个Img标签之间的间隙
今天写css时发现,图片加起来刚好是900px的三张图片,不能在一个900px宽容器放下,因为图片之间有间隔,我猜是浏览器把两个img标签之间的空格当成了空白节点. 在网上找到了几个不错的解决方法: ...
- linux内核的简单介绍
linux的版本号分为两个部分:内核(Kernel)和发行套件(distribution)版本. 内核版本是linus领导下的开发小组开发出的系统内核的版本号,而发行套件是由其他组织或者厂家将linu ...
- vuex存取数据展示在table里-----第一次实现
之前也看了vuex的文档,对它的原理只是了解,看代码(仅自己复习.做笔记) 流程是在组件的created中提交dispatch,然后通过action调用一个封装好的axios然后再触发mutation ...
- vector<类指针>清理
https://www.cnblogs.com/nanke/archive/2011/05/10/2042662.html 1.vector<class> &aa,作为函数参数 2 ...
- 前端学习(三十)es6的一些问题(笔记)
赋值表达式 document.onclick = document.onmouseover = fn; var a = b = c = d = 5; 不推荐 逗号表 ...
- python请求基本库使用
高级用法 http://cn.python-requests.org/zh_CN/latest/user/quickstart.html#url 3.2 requests 源码 def request ...
- (PASS)JAVA数组去重 三种方法 (不用集合)
第一种方法(只学到数组的看): 定义一个新的数组长度和旧数组的长度一样,存储除去重复数据的旧数组的数据和0, package demo01; import java.sql.Array; import ...
- python 环境变量的配置
1. 打开python安装目录 2.将python.exe重名为python3.exe 3.在环境变量的path中,添加python3的目录 4.将pip.exe的目录页添加到path中,即可完成环境 ...
- jQuery CSS方法
html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...