BeanUtils.copyProperties批量
时间: 2023-10-21 08:29:45 浏览: 97
引用中提到了BeanUtils.copyProperties和PropertyUtils.copyProperties两个方法的比较。BeanUtils.copyProperties和PropertyUtils.copyProperties都是用于对象之间属性的复制。不过它们在处理类型转换方面有所不同。BeanUtils.copyProperties会进行类型转换,而PropertyUtils.copyProperties不会。所以,如果需要进行类型转换,使用BeanUtils.copyProperties会更适合。引用中指出,在进行了类型转换的情况下,BeanUtils.copyProperties的速度比不上PropertyUtils.copyProperties。这是因为类型转换会增加额外的计算和处理步骤,从而降低了复制的速度。如果在性能要求较高的场景下,可以考虑使用PropertyUtils.copyProperties来提高复制的速度。所以,根据具体的需求和场景,可以选择适合的方法来进行属性的批量复制。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
相关问题
当addDTO有一万条时,怎么优化下面的代码减轻数据库压力,提高整体性能 for (SysOperaDTO sysOperaDTO : addDTO) { SysOperateLog sysOperateLog = new SysOperateLog(); BeanUtils.copyProperties(sysOperaDTO, sysOperateLog); String uid = UUID.randomUUID().toString(); // 请求的地址 sysOperateLog.setOperId(uid); sysOperateLog.setOperTime(new Date()); operLogService.save(sysOperateLog); }
在这种情况下,插入一万条记录到数据库会给数据库带来很大的压力。为了减轻数据库压力,可以考虑使用批量插入的方式。具体实现可以采用以下两种方式:
1. 使用JdbcTemplate批量插入数据
可以使用Spring框架的JdbcTemplate批量插入数据。示例代码如下:
```java
final List<SysOperateLog> sysOperateLogs = new ArrayList<>();
for (SysOperaDTO sysOperaDTO : addDTO) {
SysOperateLog sysOperateLog = new SysOperateLog();
BeanUtils.copyProperties(sysOperaDTO, sysOperateLog);
String uid = UUID.randomUUID().toString();
sysOperateLog.setOperId(uid);
sysOperateLog.setOperTime(new Date());
sysOperateLogs.add(sysOperateLog);
}
jdbcTemplate.batchUpdate("insert into sys_operate_log (id, oper_user, oper_ip, oper_type, oper_time) values (?, ?, ?, ?, ?)",
new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
SysOperateLog sysOperateLog = sysOperateLogs.get(i);
ps.setString(1, sysOperateLog.getId());
ps.setString(2, sysOperateLog.getOperUser());
ps.setString(3, sysOperateLog.getOperIp());
ps.setString(4, sysOperateLog.getOperType());
ps.setTimestamp(5, new Timestamp(sysOperateLog.getOperTime().getTime()));
}
@Override
public int getBatchSize() {
return sysOperateLogs.size();
}
});
```
2. 使用MyBatis批量插入数据
如果项目中使用了MyBatis框架,可以使用MyBatis的批量插入功能。示例代码如下:
```java
final List<SysOperateLog> sysOperateLogs = new ArrayList<>();
for (SysOperaDTO sysOperaDTO : addDTO) {
SysOperateLog sysOperateLog = new SysOperateLog();
BeanUtils.copyProperties(sysOperaDTO, sysOperateLog);
String uid = UUID.randomUUID().toString();
sysOperateLog.setOperId(uid);
sysOperateLog.setOperTime(new Date());
sysOperateLogs.add(sysOperateLog);
}
sqlSessionTemplate.execute(new SqlSessionCallback<Void>() {
@Override
public Void doInSqlSession(SqlSession sqlSession) {
SysOperateLogMapper mapper = sqlSession.getMapper(SysOperateLogMapper.class);
mapper.batchInsert(sysOperateLogs);
return null;
}
});
```
使用批量插入的方式可以有效减轻数据库压力,提高整体性能。
public SchemaColumnRuleResponseDto checkUserAndOrg(SchemaColumnRuleRequestDto requestDto,SchemaColumnRuleEo schemaColumnRuleEo){ Map<String, OrganizationEo> organizationEoMap = comDataComponent.getAllOrganizationMap(); Map<String, UserEo> userEoMap =comDataComponent.getUserMapByUid(); String code = ""; SchemaColumnRuleResponseDto responseDto = new SchemaColumnRuleResponseDto(); BeanUtils.copyProperties(requestDto,responseDto); //用户是否存在 if(!CollectionUtils.isEmpty(requestDto.getColumnPermissionUserList())){ for (String userUid : requestDto.getColumnPermissionUserList()) { if(!userEoMap.containsKey(userUid)){ code = Message.NOT_EXIST.getCode(); responseDto.setResultCode(code); responseDto.setResultMsg(userUid+messageInfo.getMessageByCode(code)); return responseDto; } } schemaColumnRuleEo.setColumnPermissionUserList(JSONObject.toJSONString(requestDto.getColumnPermissionUserList())); } //用户组织是否存在 if(!CollectionUtils.isEmpty(requestDto.getColumnPermissionOrgList())){ List<String> orgList = requestDto.getColumnPermissionOrgList(); for (String orgCode : orgList) { if(!organizationEoMap.containsKey(orgCode)){ code = Message.NOT_EXIST.getCode(); responseDto.setResultCode(code); responseDto.setResultMsg(orgCode+messageInfo.getMessageByCode(code)); return responseDto; } } schemaColumnRuleEo.setColumnPermissionOrgList(JSONObject.toJSONString(orgList)); } return new SchemaColumnRuleResponseDto(); }优化这个方法
可以考虑以下优化方法:
1. 使用批量查询代替循环查询
可以将用户和组织的查询改为批量查询,避免循环查询,从而提高查询效率。
2. 使用异常处理代替返回码
可以使用异常处理来代替返回码,将异常信息捕获后直接抛出异常,让调用者处理异常。这样可以减少代码量,让代码更加简洁。
3. 减少重复代码
可以将相同的代码提取出来,封装成方法,减少重复代码。比如,将获取消息信息的方法封装成一个方法,避免多次重复编写。
优化后的代码如下:
```
public SchemaColumnRuleResponseDto checkUserAndOrg(SchemaColumnRuleRequestDto requestDto,SchemaColumnRuleEo schemaColumnRuleEo){
Map<String, OrganizationEo> organizationEoMap = comDataComponent.getAllOrganizationMap();
Map<String, UserEo> userEoMap = comDataComponent.getUserMapByUid();
SchemaColumnRuleResponseDto responseDto = new SchemaColumnRuleResponseDto();
BeanUtils.copyProperties(requestDto,responseDto);
// 查询用户是否存在
List<String> notExistUserList = new ArrayList<>();
if(!CollectionUtils.isEmpty(requestDto.getColumnPermissionUserList())){
for (String userUid : requestDto.getColumnPermissionUserList()) {
if(!userEoMap.containsKey(userUid)){
notExistUserList.add(userUid);
}
}
if(!CollectionUtils.isEmpty(notExistUserList)){
throw new BusinessException(Message.NOT_EXIST.getCode(), notExistUserList.toString() + messageInfo.getMessageByCode(Message.NOT_EXIST.getCode()));
}
schemaColumnRuleEo.setColumnPermissionUserList(JSONObject.toJSONString(requestDto.getColumnPermissionUserList()));
}
// 查询用户组织是否存在
List<String> notExistOrgList = new ArrayList<>();
if(!CollectionUtils.isEmpty(requestDto.getColumnPermissionOrgList())){
List<String> orgList = requestDto.getColumnPermissionOrgList();
for (String orgCode : orgList) {
if(!organizationEoMap.containsKey(orgCode)){
notExistOrgList.add(orgCode);
}
}
if(!CollectionUtils.isEmpty(notExistOrgList)){
throw new BusinessException(Message.NOT_EXIST.getCode(), notExistOrgList.toString() + messageInfo.getMessageByCode(Message.NOT_EXIST.getCode()));
}
schemaColumnRuleEo.setColumnPermissionOrgList(JSONObject.toJSONString(orgList));
}
return responseDto;
}
```
阅读全文