我的BO之强类型
弱类型的缺点
有些程序员对类型比较随意,从前端传来的数据,不管应该是什么类型,都以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内部自动完成,外部使用时哪种类型方便就用哪种,十分方便。
强类型的优点:
- 防止SQL注入
- 方便运算
- 正确的取值范围
之前我的一篇文章推荐使用的7种基本数据类型讲到这方面。在数据库提供的很多种类型支持的情况下,我们也只挑战少数几种类型使用。在BO层则是以最贴切的类型来使用,并不局限于7种。比如BO中使用的枚举型,在数据库中往往表现为String
型或Integer
型。两者并不矛盾。
我的BO之强类型的更多相关文章
- C语言,C#,Java,JavaScript之强类型与弱类型
奇葩的我今天想到一个坑爹的问题,都说Java是强类型的语言,JavaScript是弱类型的语言. 嗯嗯,那初学时候的C语言呢? 呵呵哒,突然觉得短路了.说Java是强类型的语言是因为遇到这样的情况: ...
- 重新整理 .net core 实践篇—————配置系统之强类型配置[十]
前言 前文中我们去获取value值的时候,都是通过configurationRoot 来获取的,如configurationRoot["key"],这种形式. 这种形式有一个不好的 ...
- 我的BO之导航属性
我的BO 1-我的BO之强类型 2-我的BO之数据保护 3-我的BO之状态控制 4-我的BO之导航属性 数据需要导航 数据之间普遍存在关系,做业务处理时往往也是按照关系在数据之间查询和处理.业务处理可 ...
- 我的BO之状态控制
我的BO 1-我的BO之强类型 2-我的BO之数据保护 3-我的BO之状态控制 4-我的BO之导航属性 MIS常有状态 信息管理系统(MIS)常常有流程,一个流程由多个环节构成,不同的环节的流转通过状 ...
- 我的BO之数据保护
我的BO 1-我的BO之强类型 2-我的BO之数据保护 3-我的BO之状态控制 4-我的BO之导航属性 数据保护指什么 软件的运行离不开数据,数据一般存在对象中.这种对象在 Java 统称为 POJO ...
- 6. ASP.NET MVC 5.0 中的HTML Helper【HTML 帮助类】
这篇文章,我将带领大家学习HTML Helper.[PS:上一篇-->5.ASP.NET MVC 中的Area[区域]是什么] HTML Helpers是用来创建HTML标签进而创建HTML控件 ...
- ASP.NET MVC @html帮助类
原文:https://www.cnblogs.com/caofangsheng/p/10462494.html HTML Helpers是用来创建HTML标签进而创建HTML控件的.HTML Help ...
- 重新整理 .net core 实践篇—————配置文件之环境配置[九]
前言 在当今在互联网微服务比较适用的情况下,docker 可以说一个利器.每次我们打包docker的时候都是适用docker 的配置文件,那么配置文件里面会设置环境变量,这个时候需要我们的应用能够识别 ...
- 如何读取Access里的OLE类型的图片
身份证一类读卡器读取的照片信息,保存在Access数据库中一般为OLE型字段,图片为BMP格式,因为是用其读卡器写入的,其数据类型为常二进制数据. 再用报表或EXCEL读取这些图片时,如果将该图片字段 ...
随机推荐
- Angular记录(11)
开始使用Angular写页面 使用WebStorm:版本2018.3.5 官网资料 资料大部分有中文翻译,很不错 速查表:https://www.angular.cn/guide/cheatsheet ...
- $refs的用法及作用
获取DOM元素,一般用document.querySelector获取这个dom节点,然后在获取input的值 但是用ref绑定之后,就不需要在获取dom节点了,直接在上面的input上绑定input ...
- 078、Docker 最常用的监控方案(2019-04-25 周四)
参考https://www.cnblogs.com/CloudMan6/p/7637361.html 当 Docker 部署规模逐步变大后,可视化监控容器环境的性能和健康状态会变得越来越重要. ...
- Mathematica 代码
s1 = ContourPlot3D[x^2 + z^2 == 1, {x, -1, 1}, {y, 0, 1}, {z, -1, 1}] s2 = ContourPlot3D[ y == 1 + S ...
- matlab 加根号
text(3,0.5,'z=0.2$$\sqrt{c/h_0}$$+0.3','interpreter','latex')
- IO流的操作规律。
1. 明确源和目的 源代表输入流: InputStream, Reader 目的代表输出流: OutputStream, Writer 2. 操作数据是否纯文本 纯文本:字符流 非纯文本: 字节流 ...
- dialog自适应大小、固定大小、底部显示
创建一个从底部显示的对话框 if (dialog == null) { dialog = new Dialog(context, R.style.theme_from_bottom); View vi ...
- javascript获取当前域名
<script language="javascript">//获取域名host = window.location.host;host2=document.domai ...
- Mysql 反向解析 导致远程访问慢
在云端部署了mysql后,发现远程连接的响应速度非常慢(3-10s) 但是在本地访问数据库却没有问题 经过一番google这才知道原来mysql默认会进行反向解析,即通过ip地址反向向ISP申请获取域 ...
- docker-elk装IK自定义分词库
本人的elasticsearch是docker环境下运行 运行elasticsearch的容器,通过docker命令:docker exec -it 955e8d32d4a9 /bin/bash 进入 ...