DTO

如果一次性返回整个实体类,可能造成数据库表结构的泄漏,比如用户名密码一般不需要返回,用DTO解决这个问题

有一个Model:Expert.java

public class Expert {
	/**
	 * 专家编号
	 */
	@Id
	@Column(name = "expert_id")
	@ApiModelProperty("专家编号")
	@GeneratedValue(generator = "JDBC")
	private Long expertId;

	/**
	 * 登录名
	 */
	@ApiModelProperty(value = "登陆名,最大长度50", required = true)
	@NotBlank(message = "用户名不能为空!")
	@Length(min = 1, max = 50)
	@Transient
	private String loginName;

	/**
	 * 密码
	 */
	@ApiModelProperty(value = "登陆密码", required = true)
	@NotBlank(message = "密码不能为空!")
	@Length(min = 1, max = 500)
	@Transient
	private String password;

	/**
	 * 民族
	 */
	@ApiModelProperty(value = "民族", required = true)
	@Length(min = 1, max = 10)
	private String nation;

现在要求根据专家id查询专家信息,返回不带用户名和密码

创建一个DTO


public class ExpertDto {
	/**
	 * 专家编号
	 */
	@Id
	@Column(name = "expert_id")
	@ApiModelProperty("专家编号")
	@GeneratedValue(generator = "JDBC")
	private Long expertId;

	/**
	 * 民族
	 */
	@ApiModelProperty(value = "民族", required = true)
	@Length(min = 1, max = 30)
	private String nation;

用BeanUtils.copyProperties(source, target)方法, 根据专家id查询专家信息,返回不带用户名和密码

/**
	 * 根据id查询专家
	 * 
	 * @param id
	 * @return
	 */
	public ExpertDto selectByPrimaryKey(long expertId) {
		Expert source = expertMapper.selectByPrimaryKey(expertId);
		ExpertDto target = new ExpertDto();
		BeanUtils.copyProperties(source, target);
		return target;
	}



### 什么是DTO (Data Transfer Object) DTO(数据传输对象),用于封装数据以便于在不同的软件组件间传递。这种模式特别适用于分层架构的应用程序中,其中服务层通过这些对象向表示层提供所需的数据[^2]。 具体来说,在N层应用程序里,DTO类型的对象通常由服务层创建并填充好必要的属性之后发送给客户端或其他层次结构内的接收方;反之亦然——当请求从外部进入系统内部时也会携带相应的输入参数作为方法调用的一部分传入业务逻辑处理单元内进行解析和操作前转换成对应的实体实例形式保存起来供后续流程继续沿用下去直到最终完成整个事务周期为止[^1]。 ### 如何使用DTO 为了更好地理解如何运用DTO概念构建实际项目中的解决方案,下面给出一段简单的Java代码片段展示了一个典型场景下的实现方式: 假设存在两个类`UserEntity` 和 `UserDTO`, 前者代表数据库表记录而后者则是用来承载前端页面交互过程中所需要显示的信息字段集合体之一部分而已: ```java // 实体类 UserEntity.java public class UserEntity { private Long id; private String name; private Integer age; // getter setter 方法... } // 数据传输对象 UserDTO.java public class UserDTO { private String fullName; // 可能是name加上其他信息组成的全名 private int yearsOld; public static UserDTO from(UserEntity entity){ if(entity==null)return null; var dto=new UserDTO(); dto.fullName=entity.getName(); // 这里可以做更多复杂的组合计算 dto.yearsOld=entity.getAge(); return dto; } } ``` 上述例子展示了怎样把来自持久化存储介质里的原始资料映射成为适合Web API响应报文体格式要求的新颖版本,并且还提供了静态工厂函数帮助简化这一过程从而减少重复劳动所带来的错误风险同时提高了可读性和维护效率等方面的优势特性[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值