java项目干货(SpringBoot+Mysql)(二)

第二个项目:研招办

 

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.由于没有专门的测试人员,所以在写测试的时候,前台说测试有问题,那么如果自己确定后台没有问题,那么有可能是因为数据库中的测试数据出现了问题,导致前台没有测试成功,此时需要重新修改测试数据库中的测试数据,符合前台测试的要求

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值