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 表示终止修改标志。表记录如下:
需求:
1、同一个 num,当流程(type )0 和 1 完成时,分别把 finish_flag 改为 1,流程(type )0 和 1 可以同时进行,当流程(type )0 和 1 都完成时,可进行流程(type )2。表记录应该如下:
2、流程(type)2完成时,把 finish_flag 改为 1,同时把流程(type )0 和 1 的 terminal_flag 改成 1,表示流程(type )0 和 1都不能再修改。表记录应该如下:
实现该需求的通用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>