(原创)一步步优化业务代码之——从数据库获取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 可支持前端.后台动态扩展业务代码快速开发框架. 框架内置定制开发的代码生成器,生成的代码不需要复制也不需要更改, ...
随机推荐
- 003 TCP/IP协议详解(一)
TCP/IP TCP/IP 意味着 TCP 和 IP 在一起协同工作. TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信. IP 负责计算机之间的通信. TCP 负责将数据分割并装入 IP ...
- Linux下MySQL主从复制(Binlog)的部署过程
什么是 MySQL 的主从复制 Mysql内建的复制功能是构建大型高性能应用程序的基础, 将Mysql数据分布到多个系统上,这种分布机制是通过将Mysql某一台主机数据复制到其它主机(slaves)上 ...
- kivy之TextInput属性实操练习
TextInput属性比较多,常用在页面设计上的属性做了实操练习,便于很直观的了解学习本部件.并将其中一个输入提示的属性在实操源码里单独建立了一个功能进行演示. 主程序文件main.py我就不贴出来了 ...
- jpa中遇到关键字
@Column(name = "`rank`") 或者 @Column(name = "\"use\"")
- WPF 中TextBox 增加输入检测,错误提示
先来总结下实现错误提示功能的几个要点 1:binding 的ValidationRules 2 :Validation.ErrorTemplate 首先我们在界面添加一个TextBox, Text绑定 ...
- 快速创建Spring web项目
第一步,把包和文件夹建好 第二步.pom文件添加依赖 放到properties标签内 <spring_version>4.1.2.RELEASE</spring_version> ...
- 使用dom4j工具:获得文本内容(四)
package dom4j_read; import java.io.File; import org.dom4j.Document; import org.dom4j.Element; import ...
- 🏆【JVM技术专区】「难点-核心-遗漏」TLAB内存分配+锁的碰撞(技术串烧)!
JVM内存分配及申请过程 当使用new关键字或者其他任何方式进行创建一个类的对象时,JVM虚拟机需要为该对象分配内存空间,而对象的大小在类加载完成后已经确定了,所以分配内存只需要在Java堆中划分出一 ...
- Linux Ubuntu SVN图形界面 安装使用
安装 sudo apt-get install rapidsvn 使用 rapidsvn
- PHP小数点后保留位数并四舍五入
ceil() 函数向上舍入为最接近的整数,进一(k>0).ceil(0.60) --> 1ceil(0.40) --> 1ceil(5) --> 5ceil(5.1) --&g ...