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

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

SampleExample example = new SampleExample();
SampleExample.Criteria criteria = example.createCriteria();
example.setOrderByClause("id desc");  //id 是要排序的列名
List 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 封装起来。
2、查询不同 type 的 List 增加进这个类的对象里。

  • OperationEntity:
private Integer type;
private List operation;
// 此处省略 get/set 方法
  • Service层:
List operation1 = operationMapper.selectByExample(example0); // type = 0 的example0
List operation2 = operationMapper.selectByExample(example1); // type = 1 的example1
OperationEntity operationList1 = new OperationEntity();
operationList1.setType(0);
operationList1.setOperation(operation1);
List 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 类型的数组 list 放两个整型数字1和2
通用mapper的查询语句为:

criteria.andFlagIn(list);

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


     AND flag in
      
             #{item}
       

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

你可能感兴趣的:(记录一些通用mapper的需求- springboot+mybatis)