因为工作的工作的特殊性,这段时间自己的电脑不能够连接外网,所以一些东西做了总结,不能分享出来。

  今天是八月十五,自己一个人在北京的一个小房子里,休息了个够。开始新的学习。

# #入参全部使用 DTO

 

对于对象的转换,很多字段的set get 应该考虑放在实体类中去写一个静态方法去转换。

比如说

OrderEntity 里边有五十个字段 ;requestDTO 有五十个字段,现在需要将requestDTO里边的五十个字段放到 orderEntity里边去。显然必定要有 五十个set get ,像这样没有人格业务逻辑性的代码不应该放在我们的逻辑代码里边,我们可以考虑在 OrderEntity 里边提供一个静态的方法,用来转换DTO对象,方法的入参就是 DTO对象,出参就是orderEntity对象。

 

# # 枚举的使用

 

对于一些状态码,我们最好是使用枚举,这样比注释更加语义化。维护起来也比较方便。

再来看一写例子:

public static enum orderPayStatus{

/**
* 待支付。状态码:1
*/
DAI_ZHI_FU("1"),
/**
* 已支付。状态码:2
*/
YI_ZHI_FU("2"),
/**
* 旅客取消。状态码:3
*/
LVKE_QU_XIAO("3"),
/**
* 系统取消状态码:4
*/
XITONG_QU_XIAO("4"),
/**
* 已出票。状态码:5
*/
YI_CHU_PIAO("5"),
/**
* 出票失败。状态码:6
*/
CHU_PIAO_SHI_BAI("6"),
/**
* 已退票。状态码:7
*/
YI_TUI_PIAO("7");

private String value;

orderPayStatus(String value) {
this.value = value;
}

public String getValue() {
return this.value;
}
}

m

# # 关于使用string类型时间的问题

 

因为看到的就文档上时间类型是String的,同时又要去查询这个String类型的时间的之前三十分钟的数据。比方说:201909121230123  这个string串代表的是2019年09月12号12点30分123毫秒 想要查询小于这个时间的所有数据。所以查询条件肯定是这个字段小于这个时间。

我的疑惑在于 String类型的时间串能不能去比较时间,以及怎么比。最后经过测试知道,string串在数据库中是支持比较大小的。可以作为查询的条件。String串就是一个一个字符去比较的。从前往后,一位小于则整个串就小于另外一个串。

 

# # 获取当前时间戳

 

Long nowTimeMillis = System.currentTimeMillis();

Timestamp  nowTime = new Timestamp(nowTimeMillis);

 

Timestamp 的 默认格式是:2019-09-10 09:30:08.949

# # 获取当前时间的前多少分钟,或者获取后N 分钟

Long nowTimeMillis = System.currentTimeMillis();

Timestamp  nowTime = new Timestamp(nowTimeMillis + N*60*1000);

 

# # JPA 的分页的问题

 

  之前没有考虑过分页的事,项目中突然用到了。

  自己有这样一个错误的理解。觉得分页也是查询出来所有的数据,然后分好页,将分好的全部页返回。

  从我要写的接口来说,首先要求分页,返回结果是一个list类型的对象。List里边放的是一条一条的数据。根据我错误的理解,然后就产生了这样的疑问。我先去分页,查询出来所有的数据,然后再从分页结果中取出来所有的数据再转换成list,我错误的理解,导致了这样的疑惑,为啥不直接做一个查询全部的操作,

  前边说了,上边的思考是建立在我错误的理解上的。真正的分页是这样来做的,首先你要传入页码,然后传入每页想要存放数据的条数。然后根据这个页数去查询数据,比方说有一百条数据,现在要查第三页的数据,每页存放十条数据。正确的做法是先查询总的数据条数,根据页码。和每页存放的数据条数,算出来要查询的数据是第二十一条到第三十条数据。

  再写一个分页查询的案例:

 

public List<KTPayFaultBriefTrainResult> queryRefundfailOrders(KTPayFaultBriefTrainDTO ktPayFaultBriefTrainDTO) {

int limitMin = ktPayFaultBriefTrainDTO.getLimitMin();

Integer pageNo = 0;

Integer singlePageNum = 0;



if (limitMin == 0){

//如果limitMin不传值,则设置默认值,默认为当前时间的前20分钟

limitMin = 20;

}

long timeMillis = System.currentTimeMillis();

Timestamp nowTime = new Timestamp(timeMillis - limitMin*60*1000);

String payTime = DateUtils.dateToString(nowTime, "yyyyMMddHHmmss");



List<KTAppendixFaultEntity> list = new ArrayList<KTAppendixFaultEntity>() ;

if(ktPayFaultBriefTrainDTO.getPageNo() == null || ktPayFaultBriefTrainDTO.getPageNo() == "0"){

list = ktAppendixFaultRepository.queryRefundfailOrders(payTime);

}else {

pageNo = Integer.parseInt( ktPayFaultBriefTrainDTO.getPageNo());

singlePageNum = Integer.parseInt(ktPayFaultBriefTrainDTO.getSinglePageNum());

Pageable pageable = new PageRequest(pageNo, singlePageNum, Sort.Direction.ASC, "appendixFaultId");



Page<KTAppendixFaultEntity> pageList = ktAppendixFaultRepository.queryRefundfailOrders(payTime,pageable);

list = pageList.getContent();

}





List<KTPayFaultBriefTrainResult> result = new ArrayList<>();

for (int i = 0; i <list.size() ; i++) {

//转换 KTAppendixFaultEntity —> KTPayFaultBriefTrainResult

KTPayFaultBriefTrainResult ktPayFaultBriefTrainResult = KTAppendixFaultEntity.convertToKTPayFaultBriefTrainResult(list.get(i));

ktPayFaultBriefTrainResult.setPageNo(pageNo.toString());

ktPayFaultBriefTrainResult.setSinglePageNum(singlePageNum.toString());

result.add(ktPayFaultBriefTrainResult);

}

return result;



}

# # SVN工具的使用

  从SVN上边拉项目,第一次拉取下边,需要稍微配置一下。需要注意以下几个问题。首先就是项目拉下来以后环境的问题。一这里我以Maven项目为例,肯定会出这样的问题,那就是拉下来的项目不能使用, 有JDK的原因,有Maven 的原因,其实开发前,最好是能够做到Maven仓库一致,这样不用自己去下载jar包,特别是使用的私服,有可能有点jar包并没有。关于这一块内容,我单独写一篇文章。​

 

  不说太多,重要的一点,在公司做团队开发,才出现的问题,比方说最常见的问题,就是冲突。所谓的冲突是在提交代码的时候发生的,冲突就是你修改了这块代码,别人也修改了这块代码。别人还比你先提交了,那么如果你提交之前不先更新一下代码的话,就一定会报冲突。有时候冲突就要将自己的代码备份,然后重新拉下来项目,然后再将自己的代码放进去,再重新提交。

  不产生冲突的最好的方案就是提交前一定要先从SVN上拉一下代码,然后等都更新下来了再去提交。

 

  另外,做团队开发,对于自己编写的代码,修改的代码,一定要先测试通过,不报错,再提交,不然就把别人坑了,因为你提交的错误代码,导致别人要等待,项目启动不了。