Skip to content

Commit

Permalink
更新 Sql生成器
Browse files Browse the repository at this point in the history
  • Loading branch information
jianxuanbing committed Aug 21, 2018
1 parent 7391cb1 commit 2bbc5f9
Show file tree
Hide file tree
Showing 12 changed files with 391 additions and 79 deletions.
23 changes: 1 addition & 22 deletions Bing.NetCore.sln
Original file line number Diff line number Diff line change
Expand Up @@ -164,13 +164,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "10-Mail", "10-Mail", "{26F5
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bing.MailKit.Tests", "tests\Bing.MailKit.Tests\Bing.MailKit.Tests.csproj", "{9FB87130-502F-4819-8768-0F0C78C04DDB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bing.Datas.Dapper", "src\Bing.Datas.Dapper\Bing.Datas.Dapper.csproj", "{7C3BE429-7A33-4054-854D-31FF1C0B340E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bing.Datas.Dapper.SqlServer", "src\Bing.Datas.Dapper.SqlServer\Bing.Datas.Dapper.SqlServer.csproj", "{C82E7C9D-1199-44F7-9174-8760BD622A25}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bing.Datas.Dapper.MySql", "src\Bing.Datas.Dapper.MySql\Bing.Datas.Dapper.MySql.csproj", "{B850E019-28C9-4ED8-AC65-C8CF87E472CB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bing.Datas.Dapper.PgSql", "src\Bing.Datas.Dapper.PgSql\Bing.Datas.Dapper.PgSql.csproj", "{DCC9106B-D857-42BB-AEA0-5CCA489B5058}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bing.Datas.Dapper", "src\Bing.Datas.Dapper\Bing.Datas.Dapper.csproj", "{7C3BE429-7A33-4054-854D-31FF1C0B340E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down Expand Up @@ -370,18 +364,6 @@ Global
{7C3BE429-7A33-4054-854D-31FF1C0B340E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7C3BE429-7A33-4054-854D-31FF1C0B340E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7C3BE429-7A33-4054-854D-31FF1C0B340E}.Release|Any CPU.Build.0 = Release|Any CPU
{C82E7C9D-1199-44F7-9174-8760BD622A25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C82E7C9D-1199-44F7-9174-8760BD622A25}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C82E7C9D-1199-44F7-9174-8760BD622A25}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C82E7C9D-1199-44F7-9174-8760BD622A25}.Release|Any CPU.Build.0 = Release|Any CPU
{B850E019-28C9-4ED8-AC65-C8CF87E472CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B850E019-28C9-4ED8-AC65-C8CF87E472CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B850E019-28C9-4ED8-AC65-C8CF87E472CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B850E019-28C9-4ED8-AC65-C8CF87E472CB}.Release|Any CPU.Build.0 = Release|Any CPU
{DCC9106B-D857-42BB-AEA0-5CCA489B5058}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DCC9106B-D857-42BB-AEA0-5CCA489B5058}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DCC9106B-D857-42BB-AEA0-5CCA489B5058}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DCC9106B-D857-42BB-AEA0-5CCA489B5058}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -462,9 +444,6 @@ Global
{26F546EE-E4AD-4B0A-B2AB-5B6F362E23C2} = {77209C11-A719-45C3-9C49-27FA702503A1}
{9FB87130-502F-4819-8768-0F0C78C04DDB} = {26F546EE-E4AD-4B0A-B2AB-5B6F362E23C2}
{7C3BE429-7A33-4054-854D-31FF1C0B340E} = {919230E8-CEFA-48BC-958A-42601DB44C4A}
{C82E7C9D-1199-44F7-9174-8760BD622A25} = {919230E8-CEFA-48BC-958A-42601DB44C4A}
{B850E019-28C9-4ED8-AC65-C8CF87E472CB} = {919230E8-CEFA-48BC-958A-42601DB44C4A}
{DCC9106B-D857-42BB-AEA0-5CCA489B5058} = {919230E8-CEFA-48BC-958A-42601DB44C4A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {82408448-62DC-44A6-B7C1-6FCEBCC12C93}
Expand Down
11 changes: 0 additions & 11 deletions src/Bing.Datas.Dapper.MySql/Bing.Datas.Dapper.MySql.csproj

This file was deleted.

11 changes: 0 additions & 11 deletions src/Bing.Datas.Dapper.PgSql/Bing.Datas.Dapper.PgSql.csproj

This file was deleted.

11 changes: 0 additions & 11 deletions src/Bing.Datas.Dapper.SqlServer/Bing.Datas.Dapper.SqlServer.csproj

This file was deleted.

24 changes: 0 additions & 24 deletions src/Bing.Datas.Dapper.SqlServer/SqlServerBuilder.cs

This file was deleted.

123 changes: 123 additions & 0 deletions src/Bing.Datas.Dapper/Extensions.Service.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
using System;
using Bing.Datas.Configs;
using Bing.Datas.Dapper.Handlers;
using Bing.Datas.Dapper.MySql;
using Bing.Datas.Dapper.PgSql;
using Bing.Datas.Dapper.SqlServer;
using Bing.Datas.Matedatas;
using Bing.Datas.Sql;
using Bing.Datas.Sql.Queries;
using Bing.Datas.Sql.Queries.Builders.Abstractions;
using Bing.Utils.Extensions;
using Dapper;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;

namespace Bing.Datas.Dapper
{
/// <summary>
/// 服务扩展
/// </summary>
public static partial class Extensions
{
/// <summary>
/// 注册Sql查询服务
/// </summary>
/// <param name="services">服务集合</param>
/// <param name="action">Sql查询配置</param>
/// <returns></returns>
public static IServiceCollection AddSqlQuery(this IServiceCollection services,
Action<SqlQueryConfig> action = null)
{
return AddSqlQuery(services, action, null, null);
}

/// <summary>
/// 注册Sql查询服务
/// </summary>
/// <typeparam name="TDatabase">IDatabase实现类型,提供数据库连接</typeparam>
/// <param name="services">服务集合</param>
/// <param name="action">Sql查询配置</param>
/// <returns></returns>
public static IServiceCollection AddSqlQuery<TDatabase>(this IServiceCollection services,
Action<SqlQueryConfig> action = null) where TDatabase : class, IDatabase
{
return AddSqlQuery(services, action, typeof(TDatabase), null);
}

/// <summary>
/// 注册Sql查询服务
/// </summary>
/// <typeparam name="TDatabase">IDatabase实现类型,提供数据库连接</typeparam>
/// <typeparam name="TEntityMatedata">IEntityMatedata实现类型,提供实体元数据解析</typeparam>
/// <param name="services">服务集合</param>
/// <param name="action">Sql查询配置</param>
/// <returns></returns>
public static IServiceCollection AddSqlQuery<TDatabase, TEntityMatedata>(this IServiceCollection services,
Action<SqlQueryConfig> action = null)
where TDatabase : class, IDatabase
where TEntityMatedata : class, IEntityMatedata
{
return AddSqlQuery(services, action, typeof(TDatabase), typeof(TEntityMatedata));
}

/// <summary>
/// 注册Sql查询服务
/// </summary>
/// <param name="services">服务集合</param>
/// <param name="action">Sql查询配置</param>
/// <param name="database">数据库类型</param>
/// <param name="entityMatedata">实体元数据解析器类型</param>
/// <returns></returns>
private static IServiceCollection AddSqlQuery(IServiceCollection services, Action<SqlQueryConfig> action,
Type database, Type entityMatedata)
{
if (database != null)
{
services.TryAddScoped(database);
services.TryAddScoped(typeof(IDatabase),t=>t.GetService(database));
}
services.TryAddScoped<ISqlQuery,SqlQuery>();
if (entityMatedata != null)
{
services.TryAddScoped(typeof(IEntityMatedata),t=>t.GetService(entityMatedata));
}
var config=new SqlQueryConfig();
action?.Invoke(config);
AddSqlBuilder(services,config);
RegisterTypeHandlers();
return services;
}

/// <summary>
/// 配置Sql生成器
/// </summary>
/// <param name="services">服务集合</param>
/// <param name="config">Sql查询配置</param>
private static void AddSqlBuilder(IServiceCollection services, SqlQueryConfig config)
{
switch (config.DatabaseType)
{
case DatabaseType.SqlServer:
services.TryAddScoped<ISqlBuilder, SqlServerBuilder>();
return;
case DatabaseType.MySql:
services.TryAddScoped<ISqlBuilder,MySqlBuilder>();
return;
case DatabaseType.PgSql:
services.TryAddScoped<ISqlBuilder,PgSqlBuilder>();
return;
default:
throw new NotImplementedException($"Sql生成器未实现 {config.DatabaseType.Description()} 数据库");
}
}

/// <summary>
/// 注册类型处理器
/// </summary>
private static void RegisterTypeHandlers()
{
SqlMapper.AddTypeHandler(typeof(string), new StringTypeHandler());
}
}
}
55 changes: 55 additions & 0 deletions src/Bing.Datas.Dapper/MySql/MySqlBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using System.Text;
using Bing.Datas.Matedatas;
using Bing.Datas.Sql.Queries.Builders.Abstractions;
using Bing.Datas.Sql.Queries.Builders.Core;

namespace Bing.Datas.Dapper.MySql
{
/// <summary>
/// MySql Sql生成器
/// </summary>
public class MySqlBuilder:SqlBuilderBase
{
/// <summary>
/// 初始化一个<see cref="MySqlBuilder"/>类型的实例
/// </summary>
/// <param name="matedata">实体元数据解析器</param>
/// <param name="parameterManager">参数管理器</param>
public MySqlBuilder(IEntityMatedata matedata=null,IParameterManager parameterManager = null) : base(matedata, parameterManager) { }

/// <summary>
/// 创建Sql生成器
/// </summary>
/// <returns></returns>
public override ISqlBuilder New()
{
return new MySqlBuilder(EntityMatedata, ParameterManager)
{
Tag = $"{Tag}{++ChildBuilderCount}"
};
}

/// <summary>
/// 创建分页Sql
/// </summary>
/// <param name="result">Sql拼接</param>
protected override void CreatePagerSql(StringBuilder result)
{
AppendSql(result, GetSelect());
AppendSql(result, GetFrom());
AppendSql(result, GetJoin());
AppendSql(result, GetWhere());
AppendSql(result, GetOrderBy());
result.Append($"Limit {GetPager().GetSkipCount()}, {GetPager().PageSize}");
}

/// <summary>
/// 获取Sql方言
/// </summary>
/// <returns></returns>
protected override IDialect GetDialect()
{
return new MySqlDialect();
}
}
}
34 changes: 34 additions & 0 deletions src/Bing.Datas.Dapper/MySql/MySqlDialect.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using Bing.Datas.Sql.Queries.Builders.Core;

namespace Bing.Datas.Dapper.MySql
{
/// <summary>
/// MySql方言
/// </summary>
public class MySqlDialect:DialectBase
{
/// <summary>
/// 获取参数前缀
/// </summary>
/// <returns></returns>
public override string GetPrefix()
{
return "@";
}

/// <summary>
/// 闭合字符-开
/// </summary>
public override char OpenQuote => '`';

/// <summary>
/// 闭合字符-闭
/// </summary>
public override char CloseQuote => '`';

/// <summary>
/// 批量操作分隔符
/// </summary>
public override char BatchSeperator => ';';
}
}
55 changes: 55 additions & 0 deletions src/Bing.Datas.Dapper/PgSql/PgSqlBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using System.Text;
using Bing.Datas.Matedatas;
using Bing.Datas.Sql.Queries.Builders.Abstractions;
using Bing.Datas.Sql.Queries.Builders.Core;

namespace Bing.Datas.Dapper.PgSql
{
/// <summary>
/// PgSql Sql生成器
/// </summary>
public class PgSqlBuilder:SqlBuilderBase
{
/// <summary>
/// 初始化一个<see cref="PgSqlBuilder"/>类型的实例
/// </summary>
/// <param name="matedata">实体元数据解析器</param>
/// <param name="parameterManager">参数管理器</param>
public PgSqlBuilder(IEntityMatedata matedata = null, IParameterManager parameterManager = null) : base(matedata, parameterManager) { }

/// <summary>
/// 创建Sql生成器
/// </summary>
/// <returns></returns>
public override ISqlBuilder New()
{
return new PgSqlBuilder(EntityMatedata, ParameterManager)
{
Tag = $"{Tag}{++ChildBuilderCount}"
};
}

/// <summary>
/// 创建分页Sql
/// </summary>
/// <param name="result">Sql拼接</param>
protected override void CreatePagerSql(StringBuilder result)
{
AppendSql(result, GetSelect());
AppendSql(result, GetFrom());
AppendSql(result, GetJoin());
AppendSql(result, GetWhere());
AppendSql(result, GetOrderBy());
result.Append($"Limit {GetPager().PageSize} OFFSET {GetPager().GetSkipCount()}");
}

/// <summary>
/// 获取Sql方言
/// </summary>
/// <returns></returns>
protected override IDialect GetDialect()
{
return new PgSqlDialect();
}
}
}
Loading

0 comments on commit 2bbc5f9

Please sign in to comment.