1.更新操作

1.1 Insert操作

对于新增操作,

create_time,update_time,deleted ,version字段会自动填充。

merchant_code,tenant_id,dept_id,create_by,update_by,在用户登陆的情况下,会自动填充

1.2 update操作

1.2.1 id更新

数据操作规约 - 图1

数据表更新,只更新需要的字段,不允许行记录更新数据。

此时的版本信息version字段无效(version是针对乐观锁而设计的字段信息)。

1.2.2 LambdaQueryWrapper查询条件更新

此更新,若使用乐观锁,查询条件需要传入查询出的version信息。若更新成功,version会自动+1。

1.3 delete操作

1.3.1 物理删除

调用mapper中的physicalDeleteById方法,此方法有基础框架自动生成。

  1. /**
  2. * 物理删除表中记录
  3. *
  4. * @param id 表主键
  5. * @return
  6. */
  7. @Delete("delete from system_operation_log where id=#{id}")
  8. int physicalDeleteById(@Param("id") Long id);

物理删除仅适合数据量增长较快,且与业务无关的记录。比如:定时任务的执行计划

1.3.2 逻辑删除

逻辑删除,正常调用mybatis-plus提供的delete方法即可。

2 查询操作

2.1 分页查询

默认分页查询最大查询记录行数pageSize为100,当pageSize > 100时,系统会自动设置 pageSize=100.

特殊应用场景下,可通过以下配置修改pageSize默认最大值。

  1. ##设置分页查询,最大100条限制功能,默认100条
  2. mybatis-plus.max-limit=100

2.2 批量查询

CoreBaseMapper中定义里了limit方法,直接调用接口中的方法即可。

limit方法对条数做了限制,最大100。

如果要不限制,请使用limitNotRecommended方法

  1. public interface CoreBaseMapper<T> extends BaseMapper<T> {
  2. T getByPrimaryForUpdate(Serializable id);
  3. default String limit(int num) {
  4. return num > 100 ? "limit 100" : "limit " + num;
  5. }
  6. default String limitNotRecommended(int num) {
  7. return "limit " + num;
  8. }
  9. }

使用方法

  1. //对查询记录限制为100
  2. lambdaQueryWrapper.last(xxxMapper.limit(120));
  3. //不对查询记录限制为100,实际仍为120
  4. lambdaQueryWrapper.last(xxxMapper.limitNotRecommended(120));

对于确实需要查询大量数据作为计算条件的查询,可以将查询分片计算。

  1. //按每50个一组分割
  2. List<List<User>> parts = Lists.partition(users, 50);
  3. parts.stream().forEach(list -> {
  4. process(list);
  5. })

2.3 查询返回列

Repository中,对于所有直接查DB的操作,都应要求添加查询返回列参数。

例如:

  1. /**
  2. * 根据条件分页查SystemTaskNotify源信息
  3. *
  4. * @param systemTaskNotify 查询条件
  5. * @param pageIndex 页码
  6. * @param pageSize 页记录行数
  7. * @param columns 查询字段列表
  8. * @return SystemTaskNotify分页信息
  9. */
  10. public IPage<SystemTaskNotify> page(SystemTaskNotify systemTaskNotify, long pageIndex, long pageSize, List<String> columns) {
  11. Page page = new Page(pageIndex, pageSize);
  12. LambdaQueryWrapper<SystemTaskNotify> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  13. initSelectCondition(lambdaQueryWrapper, systemTaskNotify);
  14. lambdaQueryWrapper.ne(SystemTaskNotify::getId, 100L);
  15. initSelectColumn(lambdaQueryWrapper, columns);
  16. Page selectPage = systemTaskNotifyMapper.selectPage(page, lambdaQueryWrapper);
  17. return selectPage;
  18. }

此方法内部调用了initSelectColumn方法,会设置查询的返回列表字段,initSelectColumn的实现如下:

  1. /**
  2. * 设置sql查询项
  3. *
  4. * @param queryWrapper LambdaQueryWrapper
  5. * @param columns 待查询属性列表
  6. */
  7. private void initSelectColumn(LambdaQueryWrapper<SystemTaskNotify> queryWrapper, List<String> columns) {
  8. if (CollectionUtils.isEmpty(columns)) {
  9. return;
  10. }
  11. List<SFunction<SystemTaskNotify, ?>> columnsTemp = selectColumnsFilter(
  12. columns.contains("id") ? SystemTaskNotify::getId : null,
  13. columns.contains("bizType") ? SystemTaskNotify::getBizType : null,
  14. columns.contains("notifyId") ? SystemTaskNotify::getNotifyId : null,
  15. columns.contains("nextTime") ? SystemTaskNotify::getNextTime : null,
  16. columns.contains("status") ? SystemTaskNotify::getStatus : null,
  17. columns.contains("executeTimes") ? SystemTaskNotify::getExecuteTimes : null,
  18. columns.contains("context") ? SystemTaskNotify::getContext : null,
  19. columns.contains("createDate") ? SystemTaskNotify::getCreateDate : null,
  20. columns.contains("version") ? SystemTaskNotify::getVersion : null,
  21. columns.contains("createBy") ? SystemTaskNotify::getCreateBy : null,
  22. columns.contains("createTime") ? SystemTaskNotify::getCreateTime : null,
  23. columns.contains("updateBy") ? SystemTaskNotify::getUpdateBy : null,
  24. columns.contains("updateTime") ? SystemTaskNotify::getUpdateTime : null);
  25. SFunction<SystemTaskNotify, ?>[] col = new SFunction[columnsTemp.size()];
  26. for (int i = 0; i < columnsTemp.size(); i++) {
  27. col[i] = columnsTemp.get(i);
  28. }
  29. queryWrapper.select(col);
  30. }

selectColumnsFilter为框架提供的字段过滤方法。

Repository中默认生成了表包含字段,方便快速构建返回列

  1. private void selectConditionSample() {
  2. List<String> columns = new ArrayList<>();
  3. columns.add("id");
  4. columns.add("bizType");
  5. columns.add("notifyId");
  6. columns.add("nextTime");
  7. columns.add("status");
  8. columns.add("executeTimes");
  9. columns.add("context");
  10. columns.add("createDate");
  11. columns.add("version");
  12. columns.add("createBy");
  13. columns.add("createTime");
  14. columns.add("updateBy");
  15. columns.add("updateTime");
  16. columns.add("deleted");
  17. }

2.4缓存数据查询

缓存数据查询,最好是全字段查询,即columns传null即可,这样缓存数据会比较全,减少不必要的二次查询。