做CRUD的功能时,我们常常会定义一个和表对应的实体类信息,然后这个实体类信息的属性和表中的字段一一对应,然后加上每个属性的get和set方法;更规范的做法是,在此基础上再加一个DTO类,它与实体类
长得几乎一样,但是这个类不直接和表关联。
之前一直不明白为何要再定义一个dto类,也觉得get和set方法不外乎是:
public String getEmail() { return email; } public void setEmail(String email) { this.email = email; }
这种“千篇一律”的写法。。直到最近做了对字段加解密的活,才被虐得很惨。。
下面就以对email字段来加解密,说一说我的收获。
假设有一个和表对应的实体类Info(Hibernate):
@SuppressWarnings("serial") @Table(name = "INFO") @Entity public class Info extends BasicEntity { @Column(name = "EMAIL") private String email; public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
还有一个对应的DTO:
public class InfoDTO { private String email; public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
现在如果要对email字段加解密,就是在数据库里看到的是密文,在前端UI看到的是明文。此时就跟get和set有关了。。
我们在此不讨论如何加解密。一般而言,Entity的set方法用于保存入库,get方法用于从库里取数据,你会很正常的想到这样:
@SuppressWarnings("serial") @Table(name = "INFO") @Entity public class Info extends BasicEntity { @Column(name = "EMAIL") private String email; public String getEmail() { email = ....(emial);//解密的伪代码 return email; } public void setEmail(String email) { email = ....(emial);//加密的伪代码 this.email = email; } }
set方法没有问题,但是get方法就是一个“陷阱”!在首次解密数据库里的密文email时,确实能在前端正常显示明文,但是同时数据库里的email字段也会变成明文!我们在第二次以后再去访问时,因为已经是
明文,再解密的话就会报错!
所以get方法也可能改变数据库里的值,因为一旦你在get方法里对该字段做了逻辑处理后,email是全局变量,会直接影响数据库里面的值!一般我们只认为set会改变库里的值,而get不会。但是要看get方法里
有没有对变量做逻辑处理,这就颠覆了"固化"的思维。
此时DTO类就派上用场啦!可以这样改造,保持Entity实体类的get方法不变,DTO类的get方法再做解密!如:
@SuppressWarnings("serial") @Table(name = "INFO") @Entity public class Info extends BasicEntity { @Column(name = "EMAIL") private String email; public String getEmail() { return email; } public void setEmail(String email) { email = ....(emial);//加密的伪代码 this.email = email; } }
DTO类:
public class InfoDTO { private String email; public String getEmail() { email = ....(emial);//解密的伪代码 return email; } public void setEmail(String email) { this.email = email; } }
这样,无论你访问多少次。数据库里的密文会一直保持,我们可以通过debug知道代码的执行顺序是:
Entity类的get方法从数据库里取出密文->DTO类的set方法把Entity类get到的值赋给自己->DTO类的get方法把自己get到的值做处理(直接显示或做处理)
从这个角度,可以将DTO类理解成一个数据的备份,不直接与数据库挂钩,也就不会影响数据库里的值。
还有一种情景是UI输入查询/添加或修改去保存,这是一个与上面方向相反的过程。
此时DTO类可以用于收集form查询或添加/修改表单的数据,其实也可以用Map,看字段值的多少了。
同样,如果我们考虑email这个字段,用户输入的肯定是明文,存到数据库里需是密文,此时因为在Entity类里set方法直接是加密的了,所以我们要保持在DTO里get到的值是明文,执行顺序:
用户输入明文->DTO类的set方法来保存输入信息->DTO类的get方法来获得输入->Entity类的set方法加密
这时候我们会发现,如果在DTO类的get方法里还保留解密逻辑,就会出错,所以此时DTO的get方法又不能加了。
这就引申出一个问题,我们一般DTO当作Entity类和UI之间的介质,当他要作为接收参数的角色时,get方法里也不能加逻辑处理,此时需要注意!此时,我们只能用其他参数接收载体如Map
所以当字段需要做逻辑处理,不再是传统的get和set时,需要注意get和set对值的改变!
下面一张图是我对get和set的理解(图是用wps画的,很渣勿喷~)
以上加解密只是一个例子,用于说明字段不再是单纯get和set时需要注意的地方!!!
相关推荐
这个"JavaBean getset"的主题聚焦于JavaBean中的get和set方法。 首先,让我们理解什么是getter和setter方法。在面向对象编程中,getter和setter方法是用于访问和修改对象属性的方法。getter方法用于获取对象的属性...
其中,GET/SET自动生成插件是一项实用的功能,它能帮助开发者快速地为类中的字段生成对应的GET和SET方法,并且可以添加自定义的注释模板,提高代码的规范性和可读性。 这个"IDEA插件之GET/SET自动生成带模版注释...
3. **生成Get、Set方法**:光标放在属性定义行上,使用快捷键`Alt + Shift + S`(或右键选择"Source" -> "Generate Getters and Setters"),在弹出的对话框中,勾选你想要生成的get和set方法,然后点击"OK"。...
在MFC类中,首先需要定义一个私有或保护的成员变量来存储属性的值,然后创建一对`Get`和`Set`函数来获取和设置这个属性。例如,如果有一个整型属性`m_nValue`,可以这样定义: ```cpp private: int m_nValue; ...
需要注意的是,set和get方法的名称必须与属性名相同,而且在get方法前需要加上 `get` 关键字,set方法前则加上 `set` 关键字。 使用set和get方法时,我们可以通过点符号来访问属性: ```javascript console.log...
### EF4.1 Code First 学习教程 #### 一、引言 本教程旨在帮助初学者理解并掌握 Entity Framework 4.1 (简称 EF4.1) 的 Code First 方法,这是一...希望这篇教程能帮助你更好地理解和应用 EF4.1 的 Code First 方法。
SET(Social Engineer's Toolkit)是一款功能强大的社会工程学工具,能够帮助用户模拟各种攻击场景,从而更好地理解和防御此类攻击。本文将重点介绍SET中的`set_config`配置文件,通过解析其中的关键配置项,帮助...
MatDynObj 是针对 MATLAB 的 dynamicprops 类的扩展,它通过提供更加简便的 `get` 和 `set` 方法,进一步增强了动态属性的易用性。 MatDynObj 的核心设计目标是简化对动态属性的操作,使得用户可以更加直观地访问和...
本文将深入探讨GET和POST两种主要的HTTP请求方法,以及如何在Go语言中实现它们。 GET和POST是HTTP协议中最常见的请求方法。...结合GoHttp-master项目中的源码学习,可以进一步加深对HTTP请求在Go中的实践应用的理解。
首先,我们来理解GET和POST两种HTTP请求方法的基本概念: 1. GET:GET是最常见的HTTP方法,主要用于获取资源。在URL中,参数会被编码并附加在URL后面。GET请求是幂等的,意味着多次请求同一资源会得到相同的结果,...
为了进一步优化GET请求的实现,可以关注以下几个方面: 1. 错误处理:确保程序能够正确处理各种可能的错误情况,如网络连接问题、无效的OID、设备未响应等。 2. 性能优化:考虑请求的频率和批量处理,避免频繁的...
SNMP协议定义了四个基本操作,即GET、GETNEXT、SET和TRAP。 1. GET操作:管理站使用GET请求获取特定对象的当前值。这个对象是MIB中的一个节点,可以是设备的配置参数或状态信息。 2. GETNEXT操作:GETNEXT用于连续...
### 关于Java中的自定义日期类——MyDate 在学习编程的过程中,特别是在处理与时间相关的数据时,理解和创建自定义的日期类是非常重要的。...这些知识对于进一步深入Java编程的学习和实践具有重要意义。
在本文中,我们将深入探讨SNMP的编程协议、GET、SET和TRAP操作,并通过源码分析和实际应用案例来丰富我们的理解。 1. SNMP编程协议基础: SNMP协议基于UDP协议,使用端口号161和162。编程实现SNMP通常涉及创建SNMP...
在IT行业中,API...通过理解并熟练运用`taobao.items.search`、`item.get`和`increment.items.get`接口,开发者可以轻松地获取商品信息、进行商品搜索,以及实时跟踪商品变化,从而提升用户体验和业务价值。
### Java集合Collection、List、Set、Map使用详解 #### 1. 集合框架概述 集合框架是Java编程语言中最基本且最重要的组成部分之一。...理解这些集合的特点可以帮助开发者更好地选择合适的容器来满足应用程序的需求。
"Set TableViewer Cell Focus"这个话题是关于如何在TableViewer中设置焦点到特定单元格上,这对于实现用户交互和数据编辑功能至关重要。在Eclipse插件开发或者基于SWT(Standard Widget Toolkit)的应用程序中,...
3. 理解GET和POST/PUT在实际应用中的区别。 4. 设计并实现一个简单的HTTP服务器,能够处理这些请求并返回适当的响应。 5. 可能涉及URL编码与解码,以及HTTP头信息的处理。 【压缩包子文件的文件名称列表】"Network-...
在 HarmonyOS 操作系统中,网络通信是应用开发不可或缺的一部分,@ohos.net.http 包提供了对 HTTP 协议的支持,使得开发者可以方便地进行 GET 和 POST 请求的封装。本篇将详细介绍如何利用这些功能来实现高效且可靠...
### C#贪吃蛇游戏开发知识点解析 #### 一、项目背景与介绍 根据所提供的代码片段,本项目是一个使用C#...综上所述,这份代码提供了贪吃蛇游戏的基本框架,通过对Snake类的深入理解,可以进一步完善和扩展游戏功能。