1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/AhooWang-SmartSql

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

SmartSql (Document)

Overview

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 и фильтровать теги, чтобы поддерживать ваши различные условные суждения на уровне кода, чтобы сделать ваш код более красивым.

Почему стоит выбрать SmartSql?

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 или DbHelper?

Dapper действительно хорош и имеет хорошую производительность, но код, который вам передадут, будет заполнен SQL и различными ветвями суждений, которые затруднят чтение и поддержку кода. Кроме того, Dapper предоставляет только DataReader для функции антисериализации Entity. А SmartSql предлагает ряд функций для повышения эффективности разработчиков.

Обзор функций

SmartSql

Динамический репозиторий

Компоненты динамического агента репозитория (SmartSql.DyRepository) — это очень уникальные функции SmartSql, которые упрощают использование SmartSql. Вмешательство в бизнес-код минимально. Можно сказать, что использование ISqlMapper — это оригинальный метод, а DyRepository автоматически помогает вам реализовать эти методы.

DyRepository нужно только определить интерфейс репозитория, через простую конфигурацию можно автоматически реализовать эти интерфейсы и зарегистрировать в контейнере IoC, при использовании инъекции мгновенное получение реализации. Принцип заключается в получении Scope и SqlId в XML-файле SmartSql через правила именования интерфейса и метода интерфейса, использовании параметров метода интерфейса в качестве Request и автоматическом определении запроса или выполнении операции через SQL в XML, и, наконец, реализации вызова 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: просто настройте подключение к базе данных, чтобы создать всё необходимое для решения, включая:

  • Инжиниринг решения.
  • Восстановление данных.
  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.
  • Доступны другие унаследованные типы кэша self-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); **Общедоступный статический метод 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"
                }
            });

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. Ниже приведён частичный скриншот.

Мониторинг выполнения команд

Query

Просмотр того, кэшируется ли кэш и количество возвращённых записей

Query-Detail

Просмотр выполненных SQL-операторов

Query-Statement

Транзакции

Transaction

Ошибки

Error

Трассировка стека исключений

Примечание: в тексте запроса присутствуют фрагменты кода на разных языках программирования, а также ссылки на внешние ресурсы. Перевод этих фрагментов и ссылок не входит в задачу данного запроса. | Пакет | NuGet Stable | Загрузки | | ------- | -------- | ------- | | SmartSql | SmartSql | SmartSql | | SmartSql.Schema | SmartSql.Schema | SmartSql.Schema | | SmartSql.TypeHandler | SmartSql.TypeHandler | SmartSql.TypeHandler | | SmartSql.DyRepository | SmartSql.DyRepository | SmartSql.DyRepository | | SmartSql.DIExtension | SmartSql.DIExtension | SmartSql.DIExtension | | SmartSql.Cache.Redis | SmartSql.Cache.Redis | SmartSql.Cache.Redis | | SmartSql.ScriptTag | SmartSql.ScriptTag | SmartSql.ScriptTag | | SmartSql.AOP | SmartSql.AOP | SmartSql.AOP | | SmartSql.Options | SmartSql.Options | SmartSql.Options | | SmartSql.Bulk | SmartSql.Bulk | SmartSql.Bulk | | SmartSql.Bulk.SqlServer | SmartSql.Bulk.SqlServer | SmartSql.Bulk.SqlServer | | SmartSql.Bulk.MsSqlServer |

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

SmartSql = MyBatis на C# + .NET Core + кеш (память | Redis) + разделение чтения и записи + PropertyChangedTrack + динамический репозиторий + InvokeSync + диагностика. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/AhooWang-SmartSql.git
git@api.gitlife.ru:oschina-mirror/AhooWang-SmartSql.git
oschina-mirror
AhooWang-SmartSql
AhooWang-SmartSql
master