开发中自己容易忽略出bug的点,记录下

1.查询结果排序

  • 默认asc正序, desc倒序, field(t.state, '01', '02', '03') 按照t.state的规定状态排序

2.树形结果,例如产品分类、子分类递归等容易忽略的点要注意

  • 逻辑删除标志位一定要考虑
  • 结合实际业务需求详细考虑

3.设计数据库一定详细考虑

  • 例如时间,如果存字符串可以考虑varchar(20),如果设置不合理
-- 修改字段为varchar类型
ALTER TABLE `t_job` MODIFY `expect_solve_time` varchar(20) comment '期望解决时间';

4.用Map返回结果的时候,如果是List>

  • 如上面的返回类型,如果是list.add(map);加进去的需要考虑不要使用同一个Map对象,不然由于指针都会指向这个map,导致加入list的都是最后一个map对象。加了多少次,就有多少个最后一个相同的map对象。

5.字符长度限制

  • @Length(max=200, message="不能超过200字符")
  • if (StringUtils.length(param) > 200) return false;

6.条件查询(特指字典表中的类型什么的)

  • 需要前端传入的是Id(最好不要字典翻译后的typeName)

7.导出Excel的时候,一定要把id,字典等翻译过来显示

8.写统计sql的时候

  • 一定要避免for循环中写sql查询,因为这样性能全部消耗在连接数据库上了
  • 可以查询所有再过滤,甚至在sql中用foreach循环都比sql写在for中多次连接强

mybatis foreach

  • 接收集合参数的时候list集合可以写collection = "list",其他集合必须写collection = "collection"
  • Map参数接收,直接写collection = "Map名字"
#单参数list类型

#单参数array数组类型

  • 如果map中传的是个List需要判断list.size > 0

          and t.module_id in
          
            #{item}
          
        
#自己把参数封装Map类型

10.递归的时候返回SET(Entity)的时候实体类要重写equals和hashcode()

11.时间向下半小时取整

/**
     * 时间就近取整
     * 08:00 -> 08:00,
     * 08:20 -> 08:30,
     * 08:30 -> 08:30,
     * 08:45 -> 09:00,
     * 23:56 -> 00:00
     *
     * @param time
     * @return outTime
     */
    public static String getCompleteTime(String time) {
        String hour = "00";//小时
        String minutes = "00";//分钟
        String outTime = "00:00";
        StringTokenizer st = new StringTokenizer(time, ":");
        List inTime = new ArrayList<>();
        while (st.hasMoreElements()) {
            inTime.add(st.nextToken());
        }
        hour = inTime.get(0);
        minutes = inTime.get(1);
        if (Integer.parseInt(minutes) > 30) {
            hour = (Integer.parseInt(hour) + 1) + "";
            outTime = hour + ":00";
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
            try {
                outTime = sdf.format(sdf.parse(outTime));
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (Integer.parseInt(minutes) == 00) {
            outTime = hour + ":00";
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
            try {
                outTime = sdf.format(sdf.parse(outTime));
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (Integer.parseInt(minutes) <= 30 && Integer.parseInt(minutes) != 00) {
            outTime = hour + ":30";
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");

            try {
                outTime = sdf.format(sdf.parse(outTime));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return outTime;
    }

12.关于mysql中查询 != 和 <> 的使用

  • 注意这两个不等于的查询结果都不会包括null,只能用is null来获取

13.插入的时候使用insertSelective()能够避免数据库字段有默认值,却被插入为NULL

14.启动自动执行数据库sql文件

spring:
  datasource:
    initialization-mode: never #不执行初始化 #always执行初始化 #embedded只初始化内存数据库
    schema: classpath:static/mall.sql
    sql-script-encoding: UTF-8

15.mybatis plus的AR模式new User()可以用builder模式builder.build()替代

16.如果工程中同时存在application.properties文件和 application.yml文件,yml文件会先加载,而后加载的properties文件会覆盖yml文件

17.批量插入的sql的正确格式是,注意values后面没有额外的大括号,所以mybatis中应该这么写,open和close中不要加额外的括号

insert into pms_qc_project_cutting_table_activity (proj_id, cutting_activity_id, `program`, description, is_deleted, create_time, update_time) 
values 
(?, ?, ?, ?, '0', ?, now()) , 
(?, ?, ?, ?, '0', ?, now()) ,
(?, ?, ?, ?, '0', ?, now()) 

    insert into pms_qc_project_cutting_table_activity (proj_id, cutting_activity_id, `program`,
      description, is_deleted, create_time, update_time)
    values
    
      (#{item.projId}, #{item.cuttingActivityId}, #{item.program}, #{item.description}, '0', #{item.createTime}, now())
    
  

18.使用PageHelper插件进行分页的时候,PageHelper.startPage()必须在查询语句上面紧挨着!!!否则不会分页返回所有

PageHelper.startPage(pageInfo.getPage(), pageInfo.getLimit());
        final List list= mapper.query(paramMap);
        com.github.pagehelper.PageInfo voPageInfo = new com.github.pagehelper.PageInfo<>(list);
        PageVo pageVo = new PageVo<>();
        pageVo.setTotal((int)voPageInfo.getTotal());
        pageVo.setList(voPageInfo.getList());
        return pageVo;

你可能感兴趣的:(开发中自己容易忽略出bug的点,记录下)