第二个项目:研招办
1.我负责的那两张表中涉及到了级联的关系,对象之间的,数据库属性之间的,需要仔细考虑
2.在mybatis的dao层中,如果传入多个字符参数,需要使用@Param进行参数绑定.否则会导致
nested exception is org.apache.ibatis.binding.BindingException
3.在mybatis中可以使用批量查询,提高效率
这个需要结合实际需求,看一下是否使用这个技术,比如说如果前台只需要获取到一个结果,
而且查询条件也只有一个,那就没有必要使用,用了效率可能更低
4.DOClever中JSONObject的传递中参数的顺序和后台中接收类的字段的顺序无关
5.可以通过反射来实现依据类型的批处理
/**
* @Description: 检查类对象中所有String字段的合法性
* 如果类中没有String类型的字段,或者类中没有字段,默认返回false
*/
public static boolean AllStringFieldsAreIllegal(Object o) {
Field[] fields = o.getClass().getDeclaredFields();
for (Field field:fields
) {
field.setAccessible(true);//在用反射时访问私有变量,否则无法把private修饰的字段提取出来
try {
//判断该字段是否是String类型
if (field.getGenericType().getTypeName().equals("java.lang.String")) {
if(field.get(o)==null){
return true;
}
//此时必为String类型,直接强制转换
return CheckVariableUtil.stringVariableIsEmpty((String) field.get(o));
}
} catch (Exception e) {
e.printStackTrace();
}
field.setAccessible(false);
}
return false;
}
6.这个项目我第一个任务是处理前台报名信息模块的第一张表:考生报考信息表,是业务逻辑超级复杂的一个
第二个任务是处理网报模块的8种状态位的设计和联动,逻辑也很复杂,一直在处理业务逻辑4
学会了使用ipad的Notability画业务流程图
7.在mybatis的使用中,需要使用下面的方式进行模糊查询,以防止SQL注入攻击
8.前端的Json数据解析
Array类型
List<Integer> deleteIdList = Arrays.asList();//删除ID的List
//解析JSON字符串
JSONArray deleteIdListJSONArray = dataCenterService
.getParamValueFromParamOfRequestParamJsonByParamName("deleteIdList");
if (deleteIdListJSONArray != null) {
deleteIdList = deleteIdListJSONArray.toJavaList(Integer.class);
}
//判断前端传递是否为空
if (deleteIdList.size() != 0) {
dataCenterService.setData("deleteIdList", deleteIdList);
} else {
ExceptionUtil.setWarningMsgAndThrow(ReasonOfWarning.DELETE_LIST_IS_NULL);
return;
}
Object类型
后台接收方式
String jsonString = JSONObject.toJSONString(dataCenterService.getParamValueFromParamOfRequestParamJsonByParamName("qozdky"));
Qozdky qozdky = JSONObject.parseObject(jsonString, Qozdky.class);
9.使用pageHelper遇到的坑1:pagesize错误
由于多次SQL查询,所以导致pagesize会重复计算,比如说下面的例子多查询了2次,那么最终返回的pagesize会在原有的基础上重复加2
PageHelper.startPage(pageNum, pageSize);
List<NetworkReportingManagement> networkReportingManagementList = new ArrayList<>();
if ((qo.getEnrolStateList() == null || qo.getEnrolStateList().size() == 0)
&& (qo.getPaymentStateList() == null) || qo.getPaymentStateList().size() == 0) {
qo.setEnrolState(EnrolState.ALREADY_PASSED);//设置未通过状态位
networkReportingManagementList.addAll(networkReportingManagementDao.
fuzzyQueryFromTbBmxxAndUserDetails(qo));
qo.setEnrolState(EnrolState.APPLICATION_MATERIALS_HAVE_BEEN_RECEIVED);
networkReportingManagementList.addAll(networkReportingManagementDao.
fuzzyQueryFromTbBmxxAndUserDetails(qo));
qo.setEnrolState(EnrolState.FAILED_02);
networkReportingManagementList.addAll(networkReportingManagementDao.
fuzzyQueryFromTbBmxxAndUserDetails(qo));
} else {
networkReportingManagementList.addAll(networkReportingManagementDao
.fuzzyQueryFromTbBmxxAndUserDetails(qo));
}
//返回结果集
PageInfo<NetworkReportingManagement> pageResult =
new PageInfo<NetworkReportingManagement>(networkReportingManagementList);
10.使用pageHelper遇到的坑2:total错误
还是由于多次SQL造成了total错误,导致total是和当前的List的大小是一样的,而不是总共查询的数量
/**
* @Description: 模糊查询已通过信息
*/
public void fuzzyQueryAlreadyPassedInformationRequestProcess() {
//初始化
QueryObject qo = dataCenterService.getData("QueryObject");
Integer pageNum = dataCenterService.getData("pageNum");
Integer pageSize = dataCenterService.getData("pageSize");
PageHelper.startPage(pageNum, pageSize);
//业务处理
List<NetworkReportingManagement> networkReportingManagementList = new ArrayList<>();
if (qo.getEnrolStateList() == null || qo.getEnrolStateList().size() == 0) {
List<Integer> integers = Arrays.asList(EnrolState.ALREADY_PASSED, EnrolState.PENDING_VERIFICATION_PAYMENT,
EnrolState.APPLICATION_MATERIALS_HAVE_BEEN_RECEIVED, EnrolState.FAILED_02);
qo.setEnrolStateList(integers);
networkReportingManagementList.addAll(networkReportingManagementDao.fuzzyQueryFromTbBmxxAndUserDetails(qo));
} else {
networkReportingManagementList=networkReportingManagementDao.fuzzyQueryFromTbBmxxAndUserDetails(qo);
}
//返回结果集
PageInfo<NetworkReportingManagement> pageResult =
new PageInfo<NetworkReportingManagement>(networkReportingManagementList);
ResponseData responseData = dataCenterService.getResponseDataFromDataLocal();
ResponseDataUtil.putValueToData(responseData, "networkReportingManagementList", pageResult);
ResponseDataUtil.setHeadOfResponseDataWithSuccessInfo(responseData);
}
11.使用时间戳(时间的毫秒值)来传递日期,后台只负责传递时间的数据,格式显示的是由前端进行控制,这样就可以实现了前后台的分离
12.由于没有专门的测试人员,所以在写测试的时候,前台说测试有问题,那么如果自己确定后台没有问题,那么有可能是因为数据库中的测试数据出现了问题,导致前台没有测试成功,此时需要重新修改测试数据库中的测试数据,符合前台测试的要求