当前位置: 首页 > news >正文

云南公司网站建设湖南网站开发公司

云南公司网站建设,湖南网站开发公司,品牌网站制作哪家好,惠州做网站哪家公司好Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 在我的各种开发框架中#xff0c;数据访问有的基于微软企业库#xff0c;有的基于EFCore的实体框架#xff0c;两者各有其…Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 在我的各种开发框架中数据访问有的基于微软企业库有的基于EFCore的实体框架两者各有其应用场景不过多的去比较。最近在使用SqlSugar的时候觉得这个数据访问处理的组件确实很灵活据说性能也是很不错于是用来整合测试一下它对多种关系型数据库如SqlServer、Oracle、Mysql、SQLite、PostgreSQL都很容易提供支持通过特性标注的方式可以很好的实现数据访问的处理这点很类似EfCore的处理同时SqlSugar又提供很灵活的SQL处理操作。因此多花了一些时间把SqlSugar的数据访问操作进行一定的封装处理最后使之适应更广泛的应用。在这个处理过程中我编写一些单元测试用来测试其相关功能并编写了几个模块的Winform界面进行测试效果还是很不错借此总结分享一下。 1、SQLSugar的相关介绍 SqlSugar是一款 老牌 .NET 开源ORM框架由果糖大数据科技团队维护和更新 使用文档可以参考官方文档https://www.donet5.com/Home/Doc, GitHub的地址是https://github.com/donet5/SqlSugar 优点 简单易用、功能齐全、高性能、轻量级支持数据库MySql、SqlServer、Sqlite、Oracle 、 postgresql、达梦、人大金仓。 由于它是ORM的框架组件因此标识性的处理也是常规的操作一般的SQLSugar对数据实体对象提供和数据库信息的标注处理。 如对于数据库表的标注 [**SugarTable**(TB\_DictData)] public class DictDataInfo { }以及对字段信息主键的标注 /// /// 编号/// [SugarColumn(**IsPrimaryKey** true)]public virtual string ID { get; set; }或者是自增字段的标注处理 public class Person {//数据库字段[SqlSugar.SugarColumn(IsPrimaryKey true,**IsIdentity** true)]public int Id { get; set; }而有些字段和数据库字段是没有对应关系的可以设置忽略标识如下所示。 public class Person {//数据库字段[SqlSugar.SugarColumn(IsPrimaryKey true,IsIdentity true)]public int Id { get; set; }public int SexId { get; set; }//非数据库字段[SqlSugar.SugarColumn(**IsIgnore true**)]public string SexName { get; set; }.......定义了这些实体和数据库关系后我们操作数据库可以使用 SqlSugarClient 或者 SqlSugarScope 对数据库进行增、删、查、改等功能SqlSugarClient 和SqlSugarScope 几乎一样两者差异之处是后者使用单例单件模式如果我们的对象也是单件模式就考虑使用SqlSugarScope 对象操作数据库。 例如我们创建一个SqlSugarClient的对象实例用它来操作数据库获取信息。 var db new SqlSugarClient(new ConnectionConfig() {DbType DbType.SqlServer,ConnectionString connectionString,InitKeyType InitKeyType.Attribute,IsAutoCloseConnection true,AopEvents new AopEvents{OnLogExecuting (sql, p) {Log.Information(sql);Log.Information(string.Join(,, p?.Select(it it.ParameterName : it.Value)));}} });那接下来我们就可以利用db来进行数据的增删改查处理操作了。 //查询表的所有var list db.Queryable().ToList();//插入db.Insertable(new Student() { SchoolId 1, Name jack }).ExecuteCommand();//更新db.Updateable(new Student() { Id 1, SchoolId 2, Name jack2 }).ExecuteCommand();//删除db.Deleteable().Where(it it.Id 1).ExecuteCommand();一般来说我们可能倾向于把操作封装为一个函数处理如下所示 /// /// 保存数据到数据库 /// /// /// public async Taskbool SaveData(LongVoiceResultDto dto) {bool result false;if(dto ! null){using(var db CreateDb()){var info new ConsultationInfo();info.DiscernStatus dto.taskId;info.OperateStatus 未识别;if (dto.data ! null dto.data.speechResult ! null){if (dto.data.statusCode 3){info.OperateStatus 已识别;}var speechResult dto.data.speechResult;info.DiscernText speechResult.resultText;}result await db.Insertable(info).ExecuteCommandAsync() 0;}}return result; }从上面的代码来看我们定义好实体信息后就可以直接用SqlSugarClient的对象实例来处理数据库信息了过程非常简单高效特别对于一些简单的单表操作非常简洁。 2、SQLSugar的基类封装 上面的简单代码我们可以看到SqlSugarClient的对象实例的快捷操作数据库操作非常方便。 不过一般来说对于一个成熟的项目我们一般是要尽可能的重用一些处理代码并提供最大程度的简化封装。因此我们在实际使用来开发项目的时候需要对 SqlSugar数据库的处理进行一定的封装操作以期最大程度的优化代码。 首先我们定义一个对象用来承载数据库SqlSugarScope(或者SqlSugarClient)实例的信息用于数据访问的基类上下文方便使用的目的。 /// /// 数据库上下文信息/// public class DbContext{/// /// 数据库类型。/// public DbType DbType { get; set; }/// /// 连接字符串。/// public string ConnectionString { get; set; }/// /// 数据库类型。/// public SqlSugarScope Client { get; set; }public DbContext(){//默认采用配置项名//appSettings/DefaultDb 配置项为指定连接字符串的namevar dbConfigName ConfigurationManager.AppSettings[DefaultDb];Init(dbConfigName);}public DbContext(string dbConfigName){Init(dbConfigName);}我们为了方便配置不同的数据库信息因此通过定义一个默认的键 DefaultDb 来确定具体使用那个连接字符串。如下是我们的数据库连接字符串。 /spanxml version1.0 encodingutf-8? configurationconnectionStringsadd namesqlserver providerNameSystem.Data.SqlClient connectionStringPersist Security InfoFalse;Data Source(local);Initial CatalogWinFramework;Integrated SecuritySSPI /add namemysql providerNameMySql.Data.MySqlClient connectionStringServerlocalhost;Databasewinframework;Uidroot;Pwd123456;SslModenone /add namesqlite providerNameSystem.Data.SQLite connectionStringData Source|DataDirectory|\WinFramework.db;Version3; /add namenpgsql providerNameNpgsql connectionStringServerlocalhost;Port5432;Databasewinframework;User Idpostgres;Password123456 /add nameoracle providerNameOracleManaged connectionStringData Source(DESCRIPTION(ADDRESS(PROTOCOLTCP)(HOSTlocalhost)(PORT1521))(CONNECT\_DATA(SERVERDEDICATED)(SERVICE\_NAMEorcl)));User IDwin;Passwordwin /add nameDm providerNameDm connectionStringServerlocalhost;User IDSYSDBA;PWDSYSDBA;DatabaseWINFRAMEWORK; /connectionStringsappSettingsadd keyDefaultDb valuesqlserver /appSettingsstartupsupportedRuntime versionv4.0 sku.NETFramework,Versionv4.8 /startup configuration其中我们通过连接字符串中的 providerName 的类别来确定具体使用那种数据库类型。 /// /// 根据链接字符串的providerName决定那种数据库类型/// /// /// private DbType GetSugarDbType(ConnectionStringSettings setting){DbType dbType DbType.SqlServer; //默认值var providerName setting.ProviderName;if (providerName ! null){//数据库providerNameSqlClient MySqlClient SQLite OracleManaged/OracleClient Npgsqlif (providerName.EndsWith(.SqlClient, StringComparison.OrdinalIgnoreCase)){dbType DbType.SqlServer;}else if (providerName.EndsWith(.MySqlClient, StringComparison.OrdinalIgnoreCase)){dbType DbType.MySql;}else if (providerName.EndsWith(.SQLite, StringComparison.OrdinalIgnoreCase)){dbType DbType.Sqlite;}else if (providerName.EndsWith(OracleManaged, StringComparison.OrdinalIgnoreCase)){dbType DbType.Oracle;}else if (providerName.EndsWith(.OracleClient, StringComparison.OrdinalIgnoreCase)){dbType DbType.Oracle;}else if (providerName.EndsWith(Npgsql, StringComparison.OrdinalIgnoreCase)){dbType DbType.PostgreSQL;}else if (providerName.EndsWith(Dm, StringComparison.OrdinalIgnoreCase)){dbType DbType.Dm;}}return dbType;}这样我们就可以动态设置数据库的配置信息了我们可以使用配置信息初始化数据库操作实例的代码逻辑。 数据库上下文对象处理好后我们就来设计我们的数据库操作基类对象了基类对象需要基于实体信息来定义一些常规的CRUD接口并应最大程度的提供一些重写或者设置处理。 /// /// 基于SqlSugar的数据库访问操作的基类对象/// /// 定义映射的实体类/// 主键的类型如intstring等/// 或者分页信息的条件对象public class MyCrudServicewhere TEntity : class, new()where TGetListInput : IPagedAndSortedResultRequest{/// /// 数据库上下文信息/// protected DbContext dbContent;/// /// 简化SugarClient 的 ADO对象/// protected IAdo Ado{get{return dbContent.Client.Ado;}}/// /// 实体对象处理类/// protected SimpleClient EntityDb{get{return dbContent.Client.GetSimpleClient();}}/// /// 数据库配置名称默认为空。/// 可在子类指定不同的配置名称用于访问不同的数据库/// public string DbConfigName { get; set; }public MyCrudService(){dbContent new DbContext();}我们看到基类提供一些SqlSugarClient对象的应用以方便对数据的处理操作。 我们看看获取所有以及根据Lamda条件表达式获取列表的操作代码非常方便的。 /// /// 获取所有记录/// public virtual async Task GetAllAsync(){var list await EntityDb.GetListAsync();return new ListResultDto(){Items list};}/// /// 根据条件获取所有记录/// public virtual async Task GetAllAsync(Expressionbool input, string orderBy null){var query EntityDb.AsQueryable().Where(input);query query.OrderByIF(!string.IsNullOrEmpty(orderBy), orderBy);var list await query.ToListAsync();return new ListResultDto(){Items list};}由于本身的SqlSugarClient/SqlSugarScope提供了很多接口函数因此我们的基类只需要在它的基础上进行一些简单的封装即可如删除处理代码。 /// /// 删除指定ID的对象/// /// 记录ID/// public virtual async Taskbool DeleteAsync(TEntity input){return await EntityDb.DeleteAsync(input);}/// /// 根据指定条件删除集合/// /// /// public virtual async Taskbool DeleteAsync(Expressionbool input){var result await EntityDb.DeleteAsync(input);return result;}/// /// 删除指定ID的对象/// /// 记录ID/// public virtual async Taskbool DeleteByIdAsync(TKey id){return await EntityDb.DeleteByIdAsync(id);}/// /// 删除集合/// /// 删除条件集合/// public async virtual Taskbool DeleteByIdsAsync(IEnumerable input){dynamic ids input.ToArray();return await EntityDb.DeleteByIdsAsync(ids);}上面删除可以根据实体类Lamda条件表达式主键或者主键列表等简单封装一下就可以了。 根据相关的数据操作需要我们为该基类定义很多常规通用的基类接口包含很多常规的CRUD等的方法列出一个列表方便参考即可。 3、SQLSugar数据访问的单元测试 为了对不同数据库类型的不同操作进行检查看其是否能够正常工作我们需要编写一些测试的代码用于检查我们基类函数封装的有效性只有对每一个基类接口进行测试了才能够放心的使用。 为了编写单元测试我们需要为几个表编写对应的实体类和相应的服务类继承自SQLSugar的数据访问基类我们可以使用代码生成工具Database2Sharp来快速生成实体类代码如下所示。 生成代码直接显示在代码工具上可以复制下来使用。 后面有空会调整一下代码生成工具Database2Sharp把SQLSugar的ORM实体类和基于CRUD基类的服务类一并生成代码出来就完美了和其他项目开发一样快速生成项目代码即可。 完成了实体类信息的处理后我们来继承一下基类服务类并重写查询条件处理和列表排序的函数即可如下代码所示。 /// /// 应用层服务接口实现/// public class DictDataService : MyCrudServicestring, DictDataPagedDto{/// /// 自定义条件处理/// /// 查询条件Dto/// protected override ISugarQueryable CreateFilteredQueryAsync(DictDataPagedDto input){var query base.CreateFilteredQueryAsync(input);query query.WhereIF(!input.Name.IsNullOrWhiteSpace(), t t.Name.Contains(input.Name)).WhereIF(!string.IsNullOrEmpty(input.Remark), t t.Remark.Contains(input.Remark)).WhereIF(!string.IsNullOrEmpty(input.Value), t t.Value input.Value).WhereIF(!string.IsNullOrEmpty(input.DictType\_ID), t t.DictType\_ID input.DictType\_ID);return query;}/// /// 自定义排序处理/// /// 可查询LINQ/// 查询条件Dto/// protected override ISugarQueryable ApplySorting(ISugarQueryable query, DictDataPagedDto input){return base.ApplySorting(query, input).OrderBy(s s.DictType\_ID).OrderBy(s s.Seq);//先按第一个字段排序然后再按第二字段排序//return base.ApplySorting(query, input).OrderBy(ss.DictData\_ID).OrderBy(s s.Seq);}}其中 CreateFilteredQueryAsync 代码是重写构建查询条件处理的逻辑而ApplySorting函数用于指定列表的排序规则。 有了代码生成工具的辅助因此我们编写一些单元测试函数用于测试编写单元测试也是非常方便的事情。 代码的单元测试编写如下所示。 [**TestClass**]public class UnitTest1{/// /// 测试查找记录/// /// [**TestMethod**]public async Task TestMethod1()创建单元测试项目并指定测试类为[Testclass]以及测试方法[TestMethod]即可测试方法我们根据实际要求编写覆盖所有方法的测试即可。 例如我对于测试返回列表和单体数据的接口编写单元代码如下所示。 [TestClass]public class UnitTest1{/// /// 测试查找记录/// /// [TestMethod]public async Task TestMethod1(){var input new DictTypePagedDto(){Name 客户};//可以使用BLLFactory工厂类处理var service BLLFactory.Instance;//new DictTypeService();var count await service.CountAsync(s true);Assert.AreNotEqual(0, count);var list await service.GetAllAsync();Assert.IsNotNull(list);Assert.IsNotNull(list.Items);Assert.IsTrue(list.Items.Count 0);list await service.GetListAsync(input);Assert.IsNotNull(list);Assert.IsNotNull(list.Items);Assert.IsTrue(list.Items.Count 0);var ids list.Items.Select(s { return s.ID; }).Take(2);list await service.GetAllByIdsAsync(ids);Assert.IsNotNull(list);Assert.IsNotNull(list.Items);Assert.IsTrue(list.Items.Count 0);var id list.Items[0].ID;var info await service.GetAsync(id);Assert.IsNotNull(info);Assert.AreEqual(id, info.ID);info await service.GetFirstAsync(s true);Assert.IsNotNull(info);await Task.CompletedTask;}测试增删改查的接口的单元测试代码如下所示。 /// /// 测试增删改查/// /// [TestMethod]public async Task TestMethod2(){var info new DictTypeInfo(){ID Guid.NewGuid().ToString(),Code test,Name test,Remark test,PID -1, Seq 001};var service new DictTypeService();var insert await service.InsertAsync(info);Assert.IsTrue(insert);info.Name test2;var update await service.UpdateAsync(info);Assert.IsTrue(update);var deleted await service.DeleteByIdAsync(info.ID);Assert.IsTrue(deleted);var entity await service.GetAsync(info.ID);Assert.IsNull(entity);}测试对SQL语句执行过程的单元测试代码如下 /// /// 测试执行语句的处理/// /// [TestMethod]public async Task TestMethod3(){var service new DictTypeService();var sql string.Format(Select * from TB\_DictType);var table service.SqlTable(sql);Assert.IsNotNull(table);Assert.IsTrue(table.Rows.Count 0);var ds service.SqlDataSet(sql);Assert.IsNotNull(ds);Assert.IsTrue(ds.Tables.Count 0);sql string.Format(Select Name from TB\_DictType);var list service.SqlValueList(sql);Assert.IsNotNull(list);//完全没有执行任何更新、插入返回-1var result service.SqlExecute(sql);Assert.IsTrue(result -1);await Task.CompletedTask;}测试数据库参数化及多数据库切换处理的单元测试代码如下所示。 /// /// 测试数据库参数化及多数据处理/// /// [TestMethod]public async Task TestMethod4(){var service new DictTypeService();var sql string.Format(Select * from TB\_DictType Where PID pid);var parameters new List() { new SugarParameter(pid, -1) };//默认SQLServer数据库var table service.SqlTable(sql, parameters);Console.WriteLine(table.Rows.Count);Assert.IsNotNull(table);Assert.IsTrue(table.Rows.Count 0);//切换到MySQL数据库service.SetDbConfigName(**mysql**);var list service.SqlQuery(sql, parameters);Assert.IsNotNull(list);Assert.IsNotNull(list.Items);Assert.IsTrue(list.Items.Count 0);//切换到SQLITE数据库service.SetDbConfigName(**sqlite**);var list2 service.SqlQuery(sql, parameters);Assert.IsNotNull(list2);Assert.IsNotNull(list2.Items);Assert.IsTrue(list2.Items.Count 0);//切换到npgsql数据库service.SetDbConfigName(**npgsql**);var list3 service.SqlQuery(sql, parameters);Assert.IsNotNull(list3);Assert.IsNotNull(list3.Items);Assert.IsTrue(list3.Items.Count 0);await Task.CompletedTask;}在开发机器上安装几个不同的关系数据库用于测试并准备好数据库文件导入。 在单元测试项目中右键运行测试如下图所示。 全部测试通过这几个单元测试覆盖了我们的所有方法的测试了。 以上就是我们基于SqlSugar的ORM处理的封装并提供了丰富的基类接口和弹性化的实体类泛型约束因此 子类代码非常简洁只需要实现条件查询和排序的处理即可因此代码生成的时候会更加简便。 通过上面的预演我们基本上了解了SqlSugar的使用操作确实非常方便特别是我们基于代码生成工具的辅助开发之后会更加省事快捷使用基于强大的CRUD基类我们子类的代码更少更容易维护。 而对于一些多表关联的操作我们可以在子类额外定义一些处理函数即可。
http://www.pierceye.com/news/510790/

相关文章:

  • 做网络写手 哪个网站比较好电商网站开发用什么语言
  • 如何做网站资讯淘宝官网登录入口
  • 江苏建设工程招标网官方网站免费网址怎么申请注册
  • 河池网站优化网络宣传渠道有哪些
  • 外贸建立网站怎么做42区 网站开发指南
  • wordpress多本小说站出售延安做网站
  • 北京快速网站建设找工作一般上什么网站比较好
  • 做外贸必须有公司网站么下沙网站制作
  • 西安学校网站建设网站搜索工具
  • 小型网站的建设方案龙江人社app二维码图片
  • 西宁微网站建设wordpress更新文章post.php错误
  • 网络营销网站平台有哪些众希网站建设
  • 网站建设营销的技巧公司招聘网站排行榜
  • 长治网站建设收费多少农村自建房设计图 户型图
  • 广州网站建设 骏域网站建设做搜狗网站优化首页软
  • 广州网站设计软件简约大方网站
  • 网站建设与管理专业好吗做国际贸易如何建网站
  • 小说百度风云榜上海seo网络推广渠道
  • 建设局网站打不开是什么原因wordpress客户端插件
  • 农业 网站源码网站制作产品优化
  • 企业公司网站制作建设怎么区分营销型网站
  • 如何选择顺德网站建设网站开发源代码
  • 北京城乡建设部网站网站页面是自己做还是使用模板
  • 网新企业网站管理系统厦门好景科技做网站
  • 手机网站开发语言深圳网站建设培训
  • wordpress做的视听网站怎么用ftp清空网站
  • 网站建设能干什么网页设计代码模板人物介绍
  • 桂阳网站设计做p2p投资理财的网站
  • 做学术论文的网站从化专业做网站
  • 从化网站制作狮山公司网站建设