记录一些通用mapper的需求- springboot+mybatis

1、selectByExample 倒序然后获取list前10条记录

SampleExample example = new SampleExample();
SampleExample.Criteria criteria = example.createCriteria();
example.setOrderByClause("id desc");  //id 是要排序的列名
List<Sample> sampleList = sampleMapper.selectByExample(example).subList(0,10);  //subList(第一个坐标 , 最后一个坐标的后一位)
return sampleList;

ps. 实践了一下发现,当列表为空时,使用 subList() 会报错,严谨一点,还是先判断列表长度是否大于坐标值吧。

2、通过判断邻近记录的数据修改一条记录

用上一篇文章的数据,同一个数据表operation,同一个 num 作业有连续三条纪录,分别用 type 表示不同流程,用 finish_flag 记录该流程完成情况 ,多加一列属性 terminal_flag 表示终止修改标志。表记录如下:


2.1

需求:
1、同一个 num,当流程(type )0 和 1 完成时,分别把 finish_flag 改为 1,流程(type )0 和 1 可以同时进行,当流程(type )0 和 1 都完成时,可进行流程(type )2。表记录应该如下:


2.2

2、流程(type)2完成时,把 finish_flag 改为 1,同时把流程(type )0 和 1 的 terminal_flag 改成 1,表示流程(type )0 和 1都不能再修改。表记录应该如下:
2.3

实现该需求的通用mapper语句如下:

public String updateOperation(id) {
    //传的参为要修改的记录的id
    Operation operation = operationMapper.selectByPrimaryKey(id);  //获取这条记录
    int type = operation.getType();
    //判断这条记录是否是流程0或1,若是流程0或1,判断该作业是否经历了流程2,未经历流程2,则可以更新记录;若已经历了流程2,则不能更新
    if (type == 0 || type == 1){
         int terminalFlag =operation.getTerminalFlag();
         if (terminalFlag == 0){
             updateFinishData(operation);
         }
         else return "该作业已经历了流程2,无法更新";
     }
    //若这条记录是流程2,判断该作业是否都已经历过流程0和1,若都已完成,则可以更新记录,若未全部完成,则不能更新
    else if (type == 2){
         int finishFlag1 = operationMapper.selectByPrimaryKey(operation.getId()-2).getFinishFlag();
         int finishFlag2 = operationMapper.selectByPrimaryKey(operation.getId()-1).getFinishFlag();
         int num = operationMapper.selectByPrimaryKey(operation.getId()-2).getNum();

         if (finishFlag1 == 1 && finishFlag2 == 1 && num == operation.getnum()){
            updateFinishData(operation);
            //修改流程1 2的terminalFlag
            updateTerminalFlag(operation.getId()-2);
            updateTerminalFlag(operation.getId()-1);
          }
          else return "流程0、1未完成,无法更新或其他异常";
    }
    return "修改成功";
}

/**
* 更新finishFlag
*/
public void updateFinishData(Operation operation){
    Operation operation1 = new Operation();
    operation1.setId(operation.getId());
    operation1.setfinishFlag(1);
    operationMapper.updateByPrimaryKeySelective(operation1);
}

/**
* 修改流程2记录时更新流程0或1的记录的terminalFlag
*/
public void updateTerminalFlag(int numId){
    Operation updateOperation = new Operation();
    updateOperation.setId(numId);
    updateOperation.setTerminalFlag(1);
    operationMapper.updateByPrimaryKeySelective(updateOperation);
}

3、将一组数据分类输出

同样是上面的数据表operation,需求是想获取所有记录,但是记录按流程分类,接口文档测试返回数据如下:

{
  "code": 200,
  "message": "操作成功",
  "data": [
    {
      "type": 0,
      "operation": [
        {
          "id": 1,
          "num": 1,
          "type": 0,
          "finishFlag": 0,
          "terminalFlag": 0,
        },
        {
          "id": 4,
          "num": 2,
          "type": 0,
          "finishFlag": 0,
          "terminalFlag": 0,
        },
        {
          "id": 7,
          "num": 3,
          "type": 0,
          "finishFlag": 0,
          "terminalFlag": 0,
        }
      ]
    },
    {
      "type": 1,
      "operation": [
     {
          "id": 2,
          "num": 1,
          "type": 1,
          "finishFlag": 0,
          "terminalFlag": 0,
        },
         {
          "id": 5,
          "num": 2,
          "type": 1,
          "finishFlag": 0,
          "terminalFlag": 0,
        }
      ]
    }
  ]
}
// 结果不完整

步骤:
1、先用一个实体类将 type 和 List<Operation> 封装起来。
2、查询不同 type 的 List<Operation> 增加进这个类的对象里。

  • OperationEntity:
private Integer type;
private List<Operation> operation;
// 此处省略 get/set 方法
  • Service层:
List<Operation> operation1 = operationMapper.selectByExample(example0); // type = 0 的example0
List<Operation> operation2 = operationMapper.selectByExample(example1); // type = 1 的example1
OperationEntity operationList1 = new OperationEntity();
operationList1.setType(0);
operationList1.setOperation(operation1);
List<OperationEntity> list = new ArrayList<>();
list.add(operationList1);

OperationEntity operationList2 = new OperationEntity();
operationList2.setType(1);
operationList2.setOperation(operation2);
list.add(operationList2);

return list;

4、指定时间与当前时间的对比

  • 将两个时间转化成String类型对比:
SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMddHHmmss");
SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String dayStr = formatDate.format(new Date());
String date2 = "2022-06-20 02:59:20";   //时间比当前时间早一天
String date3 = formatDate.format(date.parse(date2));

System.out.println(date3.compareTo(dayStr));

结果为:
-1

  • 直接使用date类型对比:
SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String date2 = "2022-06-20 02:59:20";  //时间比当前时间早
Date date2f = date.parse(date2);

System.out.println(date2f.after(new Date()));

结果为:
false

  • 时间的其他备忘
// String类型转日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date2 = "2022-06-19 02:59:20";
Date date2f = sdf.parse(date2);

// Date格式转时间戳
long startTime = date2f.getTime();

// 时间戳相加减(时间戳相减得到的结果是毫秒,乘以1000即是秒)
long str = 2700*1000;
long finish = startTime + str;

// 时间戳转Date格式
Date finishTime = new Date(finish);

5、参数为集合类型的查询

SQL 的查询语句为:

AND flag in (1,2)

java中如果有一个 List<Integer> 类型的数组 list 放两个整型数字1和2
通用mapper的查询语句为:

criteria.andFlagIn(list);

如果 list 将被传入 xml 中,则查询语句如下:

<if test="list.size()!=0">
     AND flag in
      <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
             #{item}
       </foreach>
</if>

参考链接:http://t.zoukankan.com/supiaopiao-p-12326011.html

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