弱类型的缺点

有些程序员对类型比较随意,从前端传来的数据,不管应该是什么类型,都以String接收。然后在什么地方转成应该有的类型则要“看心情”,在Controller, Service, DA都有,甚至有从头到尾都不转为正确类型的。这里把一切都用String表示称为“弱类型”,相应地该是什么就是什么类型称为“强类型”。比如Service方法的参数清一色String型的,其中的参数的位置传错了也发现不了。Long,Date型也是按String在各层之间传送,若在DA层没有一个强有力的组件保障,很容易就被黑客SQL注入。有些中途要作运算,不得已转为强类型运算,然后因为下一级是弱类型,又转为弱类型继续传递。许多地方明明可以判断两个值是否相等,却因为类型不同需要先作转化,转化的过程又因为值是null而出错,偏偏出错方面又没处理好,真是接连挖了几个坑等着人跳。

正确的做法是用最正确的类型表示和传送每一个数据。至少在BO这一层,要完全强类型。

枚举类型

在DTO和数据库中,可能是String,可能是Integer,但对于BO来讲,它就只应该是枚举类型。这样无疑对业务处理是最方便的。

日期时间类型

前后端交互时,出于方便调试的目的,我们采用字符串来表示,具体格式是yyyy-MM-dd HH:mm:ss。 在DTO中体现为String型,而在BO中则为Date类型。

Java的Date出现得早,受广泛各种组件的支持,但运算不方便,LocalDateTime运算方便,但出现得晚,不受广泛支持。用Date还是LocalDateTime都算强类型。本来应该采纳运算方便的LocalDateTime,但考虑到需要运算的可能性小,不需要运算的可能性大,若采用LocalDateTime,就会增加不必的正反两次与Date转化。最终决定两种类型同时支持,内部关联同一个数值。在需要运算时,读写LocalDateTime型的属性时自动转化,在不需要运算时读写Date型的属性则不会产生两次额外的转换。两种类型之间的转换由BO内部自动完成,外部使用时哪种类型方便就用哪种,十分方便。

强类型的优点:

  1. 防止SQL注入
  2. 方便运算
  3. 正确的取值范围

之前我的一篇文章推荐使用的7种基本数据类型讲到这方面。在数据库提供的很多种类型支持的情况下,我们也只挑战少数几种类型使用。在BO层则是以最贴切的类型来使用,并不局限于7种。比如BO中使用的枚举型,在数据库中往往表现为String型或Integer型。两者并不矛盾。

我的BO之强类型的更多相关文章

  1. C语言,C#,Java,JavaScript之强类型与弱类型

    奇葩的我今天想到一个坑爹的问题,都说Java是强类型的语言,JavaScript是弱类型的语言. 嗯嗯,那初学时候的C语言呢? 呵呵哒,突然觉得短路了.说Java是强类型的语言是因为遇到这样的情况: ...

  2. 重新整理 .net core 实践篇—————配置系统之强类型配置[十]

    前言 前文中我们去获取value值的时候,都是通过configurationRoot 来获取的,如configurationRoot["key"],这种形式. 这种形式有一个不好的 ...

  3. 我的BO之导航属性

    我的BO 1-我的BO之强类型 2-我的BO之数据保护 3-我的BO之状态控制 4-我的BO之导航属性 数据需要导航 数据之间普遍存在关系,做业务处理时往往也是按照关系在数据之间查询和处理.业务处理可 ...

  4. 我的BO之状态控制

    我的BO 1-我的BO之强类型 2-我的BO之数据保护 3-我的BO之状态控制 4-我的BO之导航属性 MIS常有状态 信息管理系统(MIS)常常有流程,一个流程由多个环节构成,不同的环节的流转通过状 ...

  5. 我的BO之数据保护

    我的BO 1-我的BO之强类型 2-我的BO之数据保护 3-我的BO之状态控制 4-我的BO之导航属性 数据保护指什么 软件的运行离不开数据,数据一般存在对象中.这种对象在 Java 统称为 POJO ...

  6. 6. ASP.NET MVC 5.0 中的HTML Helper【HTML 帮助类】

    这篇文章,我将带领大家学习HTML Helper.[PS:上一篇-->5.ASP.NET MVC 中的Area[区域]是什么] HTML Helpers是用来创建HTML标签进而创建HTML控件 ...

  7. ASP.NET MVC @html帮助类

    原文:https://www.cnblogs.com/caofangsheng/p/10462494.html HTML Helpers是用来创建HTML标签进而创建HTML控件的.HTML Help ...

  8. 重新整理 .net core 实践篇—————配置文件之环境配置[九]

    前言 在当今在互联网微服务比较适用的情况下,docker 可以说一个利器.每次我们打包docker的时候都是适用docker 的配置文件,那么配置文件里面会设置环境变量,这个时候需要我们的应用能够识别 ...

  9. 如何读取Access里的OLE类型的图片

    身份证一类读卡器读取的照片信息,保存在Access数据库中一般为OLE型字段,图片为BMP格式,因为是用其读卡器写入的,其数据类型为常二进制数据. 再用报表或EXCEL读取这些图片时,如果将该图片字段 ...

随机推荐

  1. Harbor删除镜像后且GC清理后,磁盘空间没有释放的问题

    1.原因 Harbor删除镜像后且GC清理后,磁盘空间没有释放.因为我们push大量相同标签的镜像,Docker 镜像由标签引用,并由唯一的摘要标识.这意味着如果myImage使用标记推送两个图像,在 ...

  2. SpringCloud笔记六:Hystrix

    目录 Hystrix是什么? Hystrix服务熔断 新建Hystrix项目 修改yml Maven的pom.xml添加hystrix引用 修改Controller Hystrix服务降级 修改api ...

  3. oracle not in 改为 not exist

    修改前 SELECT pageID, permissionID FROM tableA WHERE userID=#{userID} AND projectCode=#{projectCode} AN ...

  4. HTML页面只能使用微信浏览器打开

    看到一个项目,刚开始还以为是APP,只能用微信打开.仔细看了下原来是个web项目,只是禁用了其他浏览器打开,只能用微信浏览器打开.加上前端页面用了类似mui的模板,就更像APP了. 百度了下,参考 h ...

  5. 对于iOS架构的认识过程

    MVC 经典就是经典,没有之一.iOS中MVC架构,看懂斯坦福大学白胡子老头这张图基本上就可以了.   斯坦福大学MVC架构.png 简单理解,就是Controller对象拥有View和Model对象 ...

  6. 五十五、linux 编程——TCP 连接和关闭过程及服务器的并发处理

    55.1 TCP 连接和关闭过程 55.1.1 介绍 建立连接的过程就是三次握手的过程:客户端发送 SYN 报文给服务器,服务器回复 SYN+ACK 报文,客户机再发送 ACK 报文. 关闭连接的过程 ...

  7. meterpreter基础命令大全

    meterpreter meterpreter是Metasploit框架中的一个扩展模块,作为溢出成功以后的攻击载荷使用.为后渗透提供了很多便捷之处 基础命令 我们进入meterpreter之后,键入 ...

  8. 大受喜欢安卓触控一体机连接云端数据化管理提供例程DEMO

    1.首先,安卓系统坚持了它的开放性,为消费者和开发者同时留出了空间.这是安卓能够快速成长的关键因素.在安卓之前,没有任何一个智能操作系统的开源程度能够像安卓一样.免费开源的安卓系统节约了版权费用. 2 ...

  9. 搭建微信小程序的本地测试服务器 json-server

    1.首先需要在windows环境下安装node.js 选择 Windows Installer 下载对应的系统版本就行,然后一路next,这种方式安装好以后会把环境变量也配置好了,直接在命令行下输入 ...

  10. easyui时间框只选择年月

    html: <input type="text" id="datetime" > js: <script type="text/ja ...