SmartSql-Starter
- 拥抱 跨平台 DotNet Core,是时候了。
- 高性能、高生产力,超轻量级的ORM。107kb
- TargetFrameworks: .NETFramework 4.6 & .NETStandard 2.0
- SmartSql = MyBatis + Cache(Memory | Redis) + ZooKeeper + R/W Splitting + ......
- 1 ORM
- 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.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 分布式配置文件加载器)
BenchmarkDotNet=v0.10.14, OS=Windows 10.0.17134
Intel Core i7-6700K CPU 4.00GHz (Skylake), 1 CPU, 8 logical and 4 physical cores
.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 |
Return |
Mean |
Error |
StdDev |
Rank |
Gen 0 |
Gen 1 |
Gen 2 |
Allocated |
Native |
NativeBenchmarks |
Query_GetValue_DbNull |
IEnumerable`1 |
78.39 ms |
0.8935 ms |
0.7921 ms |
1 |
3000.0000 |
1125.0000 |
500.0000 |
15.97 MB |
SmartSql |
SmartSqlBenchmarks |
Query |
IEnumerable`1 |
78.46 ms |
0.2402 ms |
0.1875 ms |
1 |
2312.5000 |
1000.0000 |
312.5000 |
12.92 MB |
SmartSqlDapper |
SmartSqlDapperBenchmarks |
Query |
IEnumerable`1 |
78.65 ms |
1.2094 ms |
1.1312 ms |
1 |
3687.5000 |
1437.5000 |
687.5000 |
19.03 MB |
Native |
NativeBenchmarks |
Query_IsDBNull_GetValue |
IEnumerable`1 |
78.84 ms |
0.8984 ms |
0.7502 ms |
1 |
2312.5000 |
1000.0000 |
312.5000 |
12.92 MB |
Dapper |
DapperBenchmarks |
Query |
IEnumerable`1 |
79.00 ms |
1.0949 ms |
0.9706 ms |
1 |
3312.5000 |
1312.5000 |
625.0000 |
17.19 MB |
EF |
EFBenchmarks |
Query |
IEnumerable`1 |
79.44 ms |
1.6880 ms |
1.5789 ms |
1 |
6250.0000 |
- |
- |
26.05 MB |
SqlSugar |
SqlSugarBenchmarks |
Query |
IEnumerable`1 |
81.09 ms |
0.8718 ms |
0.7728 ms |
2 |
2187.5000 |
875.0000 |
250.0000 |
12.64 MB |
Chloe |
ChloeBenchmarks |
Query |
IEnumerable`1 |
83.86 ms |
1.2714 ms |
1.1893 ms |
3 |
2250.0000 |
937.5000 |
312.5000 |
12.62 MB |
EF |
EFBenchmarks |
SqlQuery |
IEnumerable`1 |
89.11 ms |
0.7562 ms |
0.6314 ms |
4 |
8187.5000 |
125.0000 |
- |
33.68 MB |
EF |
EFBenchmarks |
Query_NoTracking |
IEnumerable`1 |
93.13 ms |
0.8458 ms |
0.7912 ms |
5 |
5875.0000 |
2250.0000 |
1062.5000 |
29.71 MB |
EF |
EFBenchmarks |
SqlQuery_NoTracking |
IEnumerable`1 |
106.89 ms |
1.0998 ms |
1.0288 ms |
6 |
7437.5000 |
2875.0000 |
1312.5000 |
37.34 MB |
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.1 安装 SmartSql.DIExtension
Install-Package SmartSql.DIExtension
services.AddSmartSql();
services.AddRepositoryFactory();
services.AddRepositoryFromAssembly((options) =>
{
options.AssemblyString = "SmartSql.Starter.Repository";
});
/// <summary>
/// 属性可选: [SqlMap(Scope = "User")] ,不设置 则默认 Scope 模板:I{Scope}Repository
/// 可传入自定义模板
/// RepositoryBuilder builder=new RepositoryBuilder("I{Scope}Repository");
/// </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);
int GetRecord(object reqParams);
User GetById([Param("Id")]long id);
long Insert(User entity);
int Update(User entity);
int Delete(User enttiy);
[Statement(Sql = "Select Top(@taken) T.* From T_User T With(NoLock);")]
Task<IEnumerable<User>> QueryBySqlAsync(int taken);
bool IsExist(object reqParams);
}
public class UserService
{
private readonly ITransaction _transaction;
private readonly IUserRepository _userRepository;
public UserService(
ITransaction transaction
, IUserRepository userRepository)
{
_transaction = transaction;
_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.Insert(new Entitiy.User
{
UserName = request.UserName,
Password = request.Password,
Status = Entitiy.UserStatus.Ok,
CreationTime = DateTime.Now,
});
}
public void UseTransaction()
{
try
{
_transaction.BeginTransaction();
//Biz();
_transaction.CommitTransaction();
}
catch (Exception ex)
{
_transaction.RollbackTransaction();
throw ex;
}
}
}
点击链接加入QQ群【SmartSql 官方交流群】:604762592