我的BO之强类型_weixin_30767835的博客-程序员资料

技术标签: java  数据库  

我的BO
1-我的BO之强类型
2-我的BO之数据保护
3-我的BO之状态控制
4-我的BO之导航属性

弱类型的缺点

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

33556-20190504092926667-688035317.jpg
图:该是什么就是什么

正确的做法是用最正确的类型表示和传送每一个数据。至少在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型。两者并不矛盾。

系列导航

1-我的BO之强类型
2-我的BO之数据保护
3-我的BO之状态控制
4-我的BO之导航属性

转载于:https://www.cnblogs.com/BillySir/p/10777167.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30767835/article/details/96408525

智能推荐

关系抽取_完整项目_CodingPark编程公园_TEAM-AG的博客-程序员资料

#人名识别 #人物属性识别 #人与人的关系识别

leetcode698. 划分为k个相等的子集_lgy54321的博客-程序员资料

题目给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。示例 1:输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4输出: True说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。注意:1 <= k <= len(nums) <= 160 &l...

定时器的问题_antd 定时器一次显示一行_lannieZ的博客-程序员资料

在a页面写一个定时,让他每秒钟打印一个1,然后跳转到b页面,此时可以看到,定时器依然在执行。这样是非常消耗性能的!解决方法1:首先在data函数里面进行定义定时器名称:data() { return { timer: null // 定时器名称 } }使用this.timer = (() => { // 某些定时器操作}, 10

android:cacheColorHint=“#00000000”_屌丝男士zkc的博客-程序员资料

istView.setCacheColorHint(0); 或者Android:cacheColorHint="#000000" 去除listview的拖动背景色自定义listview的时候,当你不使用android:cacheColorHint=“#00000000”会出现下面选中一个空间黑色底色的情况,破坏整体美观度:当你不使用android:listSel

frida之HOOK篇(二)手动hook_frida之hook篇(二)手动hook_kfyzjd2008的博客-程序员资料

一、编写测试用APPpackage com.example.helloworld;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;public class MainActivity extends AppCompatAc

DVD提取字幕的简要流程及涉及的主要工具_雪峰的博客-程序员资料

1、DVD拷盘用 DVD Decrypter,得到VOB文件2、从VOB中提取图形型字幕用 VobSub,得到 idx和sub配对的图形字幕文件3、图形型字幕转换成文本型用 SubOCR,得到 srt 字幕文件4、校对字幕用 Subtitle Workshop,得到翻译精准的 srt 字幕文件5、如果要加上字幕效果把  srt 字幕文件转换成SSA或ASS字幕,还可以用Subtitle Works

随便推点

Guice笔记_补充_iteye_887的博客-程序员资料

1、关于标注绑定,如若不是属性,是方法上的注入,如下适用标注@[email protected] Service service;//方法上的如下@Injectvoid injectService(@Www Service service) { ...}2、隐式绑定,如果缺少显示绑定(即没有写任何binder),Guice会试图注入并创建一个所依赖的...

常用端口号与对应的服务以及端口关闭_111端口是什么服务_hanghangde的博客-程序员资料

常用端口号与对应的服务以及端口关闭端口简介:本文介绍端口的概念,分类,以及如何关闭/开启一个端口  21端口:21端口主要用于FTP(File Transfer Protocol,文件传输协议)服务。  23端口:23端口主要用于Telnet(远程登录)服务,是Internet上普遍采用的登录和仿真程序。  25端口:25端口为SMTP(Simple Mail Transfer Protocol,简

数据结构实验之排序七:选课名单_猿憨憨的博客-程序员资料

数据结构实验之排序七:选课名单Time Limit: 1000MS Memory limit: 65536K题目描述随着学校规模的扩大,学生人数急剧增加,选课名单的输出也成为一个繁重的任务,我校目前有在校生3万多名,两千多门课程,请根据给定的学生选课清单输出每门课的选课学生名单。输入输入第一行给出两个正整数N( N ≤ 35000)和M(M ≤ 2000),其中N是全校学...

Cocos2d-x3.0游戏实例之《别救我》第五篇——使用Cocostudio UI编辑器创建操作界面_linuxheik的博客-程序员资料

这一篇内容其实很简单,已经对Cocostudio比较熟悉的朋友就可以随便扫一下了~(小若:熟悉Cocostudio的人谁还有空看你的基础教程呢)  笨木头花心贡献,啥?花心?不呢,是用心~转载请注明,原文地址:http://www.benmutou.com/blog/archives/892文章来源:笨木头与游戏开发  

好久没学习了。。。_和稀泥的博客-程序员资料

:cry: 啊啊啊~该好好做个计划了。

Delphi 2006 高级控件应用_delphi怎么添加rztray控件_voyan的博客-程序员资料

<br />  来源:电脑报<br />    Borland Developer Studio 2006 已于 2005 年 12 月 5 日正式发布了。 Delphi 2006 是 Borland Developer Studio 2006 产品中的一部分,我们不仅能继续开发基于 Win32 平台的应用程序,还可以使用 Delphi 语言编写 .NET 平台的应用程序,使得 Delphi 程序员可以轻松的将 Win32 平台的应用程序移植到 .NET 平台中。<br />    本文将带领读者去体验一下

推荐文章

热门文章

相关标签