SmartSql = MyBatis + Cache(Memory | Redis) + R/W Splitting +Dynamic Repository + Diagnostics ......
Simple, efficient, high-performance, scalable, monitoring, progressive development!
SmartSql использует идеи MyBatis, использует XML для управления SQL и предоставляет несколько тегов фильтров для устранения различных ветвей if/else на уровне кода. SmartSql будет управлять вашим SQL и фильтровать теги, чтобы поддерживать ваши различные условные суждения на уровне кода, чтобы сделать ваш код более красивым.
ORM, linq системы DotNet, который в основном является Linq, очень хорош, устраняя зависимость разработчика от SQL. Но он игнорирует тот факт, что сам SQL не сложен, и разработчикам трудно написать Linq для генерации SQL с хорошей производительностью в сложных сценариях запросов, и я считаю, что студенты, которые использовали EF, должны иметь такой опыт: «Я думаю о том, как писать SQL, а затем пишу Linq. Всё. Возможно, вы также захотите посмотреть, как выглядит вывод SQL из Linq». Это был очень плохой опыт. Чтобы быть абсолютно оптимизированным для SQL, разработчики должны иметь абсолютный контроль над SQL. Кроме того, SQL сам по себе очень прост, зачем добавлять слой переводчиков?
SmartSql уже более двух лет находится вне официального открытого исходного кода, в производственной среде после нескольких проверок микросервисов. Есть также некоторые компании, которые используют SmartSql (если вы тоже используете SmartSql, добро пожаловать, чтобы отправить вопрос) Кто использует SmartSql. Теперь присоединился к NCC. Будущее (Roadmap-2019) SmartSql продолжит добавлять новые функции, чтобы помочь разработчикам повысить эффективность. Добро пожаловать, чтобы отправить Issue https://github.com/dotnetcore/SmartSql/issues.
Dapper действительно хорош и имеет хорошую производительность, но код, который вам передадут, будет заполнен SQL и различными ветвями суждений, которые затруднят чтение и поддержку кода. Кроме того, Dapper предоставляет только DataReader для функции антисериализации Entity. А SmartSql предлагает ряд функций для повышения эффективности разработчиков.
Компоненты динамического агента репозитория (SmartSql.DyRepository) — это очень уникальные функции SmartSql, которые упрощают использование SmartSql. Вмешательство в бизнес-код минимально. Можно сказать, что использование ISqlMapper — это оригинальный метод, а DyRepository автоматически помогает вам реализовать эти методы.
DyRepository нужно только определить интерфейс репозитория, через простую конфигурацию можно автоматически реализовать эти интерфейсы и зарегистрировать в контейнере IoC, при использовании инъекции мгновенное получение реализации. Принцип заключается в получении Scope и SqlId в XML-файле SmartSql через правила именования интерфейса и метода интерфейса, использовании параметров метода интерфейса в качестве Request и автоматическом определении запроса или выполнении операции через SQL в XML, и, наконец, реализации вызова ISqlMapper.
public interface IUserRepository : IRepository<User, long>
{
}
services.AddSmartSql()
.AddRepositoryFromAssembly(options => { options.AssemblyString = "SmartSql.Starter.Repository"; });
public class UserService
{
IUserRepository userRepository;
public UserService(IUserRepository userRepository)
{
this.userRepository = userRepository;
}
}
ReStore:
Type: Process
Parameters:
FileName: powershell
WorkingDirectory: '{{Project.Output.Path}}'
Args: dotnet restore
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
Разделение на чтение и запись в 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>
<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>
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); **Общедоступный статический метод DeleteById<TEntity, TPrimaryKey> (this ISqlMapper sqlMapper, TPrimaryKey id)**
**Общедоступный статический метод DeleteMany<TEntity, TPrimaryKey> (this ISqlMapper sqlMapper, IEnumerable<TPrimaryKey> ids)**
## Генератор идентификаторов
### SnowflakeId
```xml
<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"
}
});
<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"
}
});
[Transaction]
public virtual long AddWithTran(User user)
{
return _userRepository.Insert(user);
}
Когда транзакция вложена, атрибут транзакции дочерней функции больше не включается, вместо этого используется транзакция, которая вызывает функцию через родительскую.
[Transaction]
public virtual long AddWithTranWrap(User user)
{
return AddWithTran(user);
}
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();
}
SmartSql в настоящее время поддерживает мониторинг Skywalking и активируется установкой агента SkyAPM-dotnet. Ниже приведён частичный скриншот.
Примечание: в тексте запроса присутствуют фрагменты кода на разных языках программирования, а также ссылки на внешние ресурсы. Перевод этих фрагментов и ссылок не входит в задачу данного запроса. | Пакет | NuGet Stable | Загрузки |
| ------- | -------- | ------- |
| SmartSql | |
|
| SmartSql.Schema |
|
|
| SmartSql.TypeHandler |
|
|
| SmartSql.DyRepository |
|
|
| SmartSql.DIExtension |
|
|
| SmartSql.Cache.Redis |
|
|
| SmartSql.ScriptTag |
|
|
| SmartSql.AOP |
|
|
| SmartSql.Options |
|
|
| SmartSql.Bulk |
|
|
| SmartSql.Bulk.SqlServer |
|
|
| SmartSql.Bulk.MsSqlServer |
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )