(原创)一步步优化业务代码之——从数据库获取DataTable并绑定到List<Class>
一,前言
现实业务当中,有一个很常见的流程:从数据库获取数据到DataTable,然后将DataTable绑定到实体类集合上,一般是List<Class>,代码写起来也简单:遍历+赋值就可以了。
但是,代码逻辑虽然简单,代码量不小,而且代码往往很臃肿。本篇文章就来一步步对这种业务代码进行优化。
本文使用C#进行实现及演示。
相信看完的你,一定会有所收获!
本文地址:https://www.cnblogs.com/lesliexin/p/15307862.html
二,基础写法
就像前言所说,代码逻辑很简单——遍历+赋值,我们来看一下最基础的写法。
看起来还好,但是,DataTable是存在空值情况的,而空值在实际业务中是个很严重的存在,所以我们需要对DataTable中的空值进行判断。改造后的代码如下:
如果没经历过太多业务代码的读者可能觉得这样看起来也还好,这是因为我为了演示,只设计了几个字段,但在实际业务中,往往都是几十个字段,甚至上百个字段,而且字段名也不是就“AAA”这样三个字母,而是十几、二十几个字母;当写出来时,好几页屏幕都是这种代码,别提有多刺激了。
而且,这里演示时所有属性字段都是string类型的,现实中肯定不是这样,会有int,double,Datetime,bool等等类型,那样代码量会“更胜一筹”,这点在下文会讲。
三,第一步优化
看了上面的代码,可以发现,绝大部分代码都是重复的三元判断,所以在实际写代码时,我都是用Excel的下拉复制功能去写的^_^
我们第一步的优化,就是将这个三元判断优化掉,方法是使用扩展方法,在扩展方法里实现三元判断,并返回我们需要的值。
我们新建一静态类,并新建一扩展方法如下:
有了扩展方法后,我们的代码就可以改成下面这样:
立马简洁了好多有不有!
四,第二步优化
就像上面所说的,不可能所有的属性字段都是string类型的,会有int,double,Datetime,bool等等类型,这就涉及到类型转换的问题。加上类型转换后,不管是使用Convert还是TryParse,代码就又会臃肿了起来。
所以,我们要将这些类型转换给优化掉,优化的方式同样是采用扩展方法,将类型转换包含在扩展方法中。
使用了扩展方法后,代码相较之前前简洁了不少。
五,第三步优化
这时候,我们发现了另一个问题,就是扩展方法太多了。
而且,可以预见的是,随着属性类型的增多,肯定要编写对应的扩展方法,比如:StrToInt(),StrToLong()等等。
同时可发现这些类型转换的扩展方法都是一样的逻辑,所以我们这一次就优化类型转换的扩展方法。
我们新建一个泛型扩展方法,以支持将string转换成指定类型。
这样下来,所有类型转换的扩展方法就变成这一个扩展方法,在使用时只需要写上对应的类型即可。
六,第四步优化
这种时候,有小伙伴就要问了,既然都是依次调用这两个扩展方法,那能不是将这两个再合并一下?当然可以!
我们再改造一下扩展方法,将这两步合而为一。
这种时候,赋值的代码就变成成了这样。
一切仿佛发生了改变,一切又仿佛从未改变。
七,第五步优化
一般而言,到第四步时,已经足够优化了,使用起来也足够简单,代码逻辑也清晰,但是,这还不够,因为还要重复的去一行一行的赋值,都是一样写法,就不能优化掉吗?!
所以这一步我们就将这些给优化掉。
这里面涉及到两个重点,一个是获取类里的属性信息,包含属性名和属性类型;一个是获取DataTable中相应的值并转换为相应的类型。
同时,因为存在属性名与列名一样但大小写不同的情况,也需要进行判断。
实现了这个扩展方法,赋值部分的代码就可以简化成一行代码。
很惊艳是不是?原来要写很多行的代码,现在一行就搞定了,很舒服有不有!
八,第六步优化
什么?还要优化?还能优化?当然可以!
上面的优化只能针对属性名与列名一致的情况,当属性名与列名不一致时,怎么办?
而这,就是我们这一步优化的目标。
为了解决属性名与列名不一致的问题,我们需要用到特性标签,我们新建一个特性类,里面包含一个属性,用来指定属性名所对应的列名。
同时,我们改造下上一步的扩展方法ToList<T>,增加对特性标签的获取与判断。
使用时,在实体类上添加上特性标签即可,比如类的属性“AAA”要取DataTable中列“FFF”对应的值,则在属性“AAA”上加上特性标签“[DT("FFF")]”,其它不需要作任何改变。
九,结束语
至此,经过六步的优化,“从数据库获取数据到DataTable,然后绑定到List<Class>”这一流程的业务代码已经优化完毕,使用时只需要一行代码即可达到目标。
当然,现实中的业务流程肯定千奇百怪,复杂性也不尽相同。本篇文章只是提供一个优化业务代码的思路,以及在特定情况下,可以直接套用本文代码,以节省开发时间,提高开发效率。
感谢阅读,欢迎大家评论指正!
(原创)一步步优化业务代码之——从数据库获取DataTable并绑定到List<Class>的更多相关文章
- Tomcat启动时加载数据到缓存---web.xml中listener加载顺序(例如顺序:1、初始化spring容器,2、初始化线程池,3、加载业务代码,将数据库中数据加载到内存中)
最近公司要做功能迁移,原来的后台使用的Netty,现在要迁移到在uap上,也就是说所有后台的代码不能通过netty写的加载顺序加载了. 问题就来了,怎样让迁移到tomcat的代码按照原来的加载顺序进行 ...
- Loadrunner脚本优化-参数化之关联MySQL数据库获取数据
脚本优化-参数化之关联MySQL数据库获取数据 by:授客 QQ:1033553122 测试环境: Loadrunner 11 Win7 64位 实操: 1. 安装MySQL ODBC驱动程序 O ...
- 从零到千万用户,我是如何一步步优化MySQL数据库的?
写在前面 很多小伙伴留言说让我写一些工作过程中的真实案例,写些啥呢?想来想去,写一篇我在以前公司从零开始到用户超千万的数据库架构升级演变的过程吧. 本文记录了我之前初到一家创业公司,从零开始到用户超千 ...
- JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码
本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 提升到 20 (提升了 7 倍) ...
- 朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑
我承认,本文的标题有一点标题党,特别是写业务代码,大家因为没有足够重视一些细节最容易调的坑(侧重Java,当然,本文说的这些点很多是不限制于语言的). 1.客户端的使用 我们在使用Redis.Elas ...
- 使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码 (jvm性能调优)
技术交流群:233513714 本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 ...
- 从spring源码汲取营养:模仿spring事件发布机制,解耦业务代码
前言 最近在项目中做了一项优化,对业务代码进行解耦.我们部门做的是警用系统,通俗的说,可理解为110报警.一条警情,会先后经过接警员.处警调度员.一线警员,警情是需要记录每一步的日志,是要可追溯的,比 ...
- PostgreSQL 优化器代码概览
简介 PostgreSQL 的开发源自上世纪80年代,它最初是 Michael Stonebraker 等人在美国国防部支持下创建的POSTGRE项目.上世纪末,Andrew Yu 等人在它上面搭建了 ...
- vue+.netcore可支持业务代码扩展的开发框架 VOL.Vue 2.0版本发布
框架介绍 这是一个基于vue.element-ui.iview..netcore3.1 可支持前端.后台动态扩展业务代码快速开发框架. 框架内置定制开发的代码生成器,生成的代码不需要复制也不需要更改, ...
随机推荐
- SQL 练习40
按照出生日期来计算学生的年龄信息 IF OBJECT_ID('GetStudentAge','FN') IS NOT NULL DROP FUNCTION GetStudentAge GO CREAT ...
- 【spring 注解驱动开发】spring对象的生命周期
尚学堂spring 注解驱动开发学习笔记之 - 生命周期 生命周期 1.生命周期-@Bean指定初始化和销毁方法 2.生命周期-InitializingBean和DisposableBean 3.生命 ...
- 定时执行的任务Quartz.net
- 学习Java的9张思维导图
转自:https://blog.csdn.net/aitaozi11/article/details/79652943 网上搜集了java的学习思维导图,分享给大家. 01.Java程序设计(基础) ...
- Vivado实战—单周期CPU指令分析
引言 不知道你是否和我有过同样的感受,<计算机组成原理>这门学科学起来如此的艰难:一节课下来,教室黑板上留下了满满的 "足迹",看上去也挺简单的,不就是 0 和 1 ...
- Redis(三):新数据类型
配置文件redis.conf详解 bind=127.0.0.1 # 表示只能在本机中访问redis,将该行注释掉,即可接收任何IP地址的访问 protected-mode # 设置为no,表示关闭保护 ...
- 三大操作系统对比使用之·MacOSX
时间:2018-11-13 整理:byzqy 本篇是一篇个人对Mac系统使用习惯和应用推荐的分享,在此记录,以便后续使用查询! 打开终端: command+空格,调出"聚焦搜索(Spotli ...
- 挂载redhat镜像创建本地yum源
上传镜像文件到/mnt文件夹下,或者上传到其他文件夹下 挂载镜像路径/mnt/cdrom 在mnt文件夹下创建cdrom文件夹 创建命令:mkdir cdrom 挂载镜像命令:mount rhel- ...
- git02
Git Gui的使用 Ssh key 介绍及使用 Ssh key介绍 我理解的就是每台电脑上会产生出一个ssh key,然后自己有一个远程账户,但是自己有可能有很多台电脑, 包括家里的电脑还有公司的电 ...
- 2021-06-14 BZOJ4919:大根堆
BZOJ4919:大根堆 Description: 题目描述 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你 ...