开发中自己容易忽略出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<Map<String, Object>>

  • 如上面的返回类型,如果是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类型
<select id="countByUserList" resultType="_int" parameterType="list">
select count(*) from users
  <where>
    id in
    <foreach item="item" collection="list" separator="," open="(" close=")" index="">
      #{item.id, jdbcType=NUMERIC}
    </foreach>
  </where>
</select>
#单参数array数组类型
<select id="dynamicForeach2Test" resultType="Blog">
     select * from t_blog where id in
     <foreach collection="array" index="index" item="item" open="(" separator="," close=")">
          #{item}
     </foreach>
</select>
  • 如果map中传的是个List需要判断list.size > 0
<if test="moduleIds!=null and moduleIds.size > 0">
          and t.module_id in
          <foreach collection="moduleIds" item="item" index="index" open="(" separator="," close=")">
            #{item}
          </foreach>
        </if>
#自己把参数封装Map类型
<select id="dynamicForeach3Test" resultType="Blog">
         select * from t_blog where title like "%"#{title}"%" and id in
          <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
               #{item}
          </foreach>
 </select>

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<String> 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 id="addBatch" parameterType="list">
    insert into pms_qc_project_cutting_table_activity (proj_id, cutting_activity_id, `program`,
      description, is_deleted, create_time, update_time)
    values
    <foreach collection="list" index="index" item="item" open="" separator="," close="">
      (#{item.projId}, #{item.cuttingActivityId}, #{item.program}, #{item.description}, '0', #{item.createTime}, now())
    </foreach>
  </insert>

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

PageHelper.startPage(pageInfo.getPage(), pageInfo.getLimit());
        final List<T> list= mapper.query(paramMap);
        com.github.pagehelper.PageInfo<T> voPageInfo = new com.github.pagehelper.PageInfo<>(list);
        PageVo<T> pageVo = new PageVo<>();
        pageVo.setTotal((int)voPageInfo.getTotal());
        pageVo.setList(voPageInfo.getList());
        return pageVo;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345