Skip to content

Service 开发 ​

系统集成了Mybatis-Plus,在ServiceImpl实现类中继承ServiceImpl<EntityMapper, Entity> 提高开发效率 官方文档

接口 ​

public interface TestService {
    /**
     * 分页查询
     */
    IPage<Test> findPage(TestDTO dto);
}

实现类 ​

实现类继承 ServiceImpl 泛型为对应Mapper 和 实体类

@Service
public class TestServiceImpl extends ServiceImpl<TestMapper, Test> implements TestService {
    
    @Resource
    private TestMapper testMapper;
    
    /**
     * 分页查询
     */
    IPage<Test> findPage(TestDTO dto) {
      	IPage<Test> iPage = new Page<>(dto.getPageNum(), dto.getPageSize());
        QueryWrapper<Test> queryWrapper = new QueryWrapper<>();
        // ...
    	testMapper.selectPage(iPage, queryWrapper);
        return iPage;
    }
}

Mybatis-Plus 分页配置 ​

系统分页基于 Mybatis-Plus 的 分页插件 官方文档 项目中在 lihua-base - lihua-base-mybatis - com/lihua/mybatis/config/MybatisPlusConfig.java 中配置了分页插件,可按需修改

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        // 如果配置多个插件,切记分页最后添加
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        // 分页溢出后自动查询第一页
        paginationInnerInterceptor.setOverflow(true);
        // 数据库类型
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }
}

分页参数来自 BaseDTO,单页最大 MAX_PAGE_SIZE = 100。controller 中通过 @Validated(MaxPageSizeLimit.class) 指定校验组后,超出上限的 pageNum/pageSize 会被 validation 拦截,防止大分页拖垮数据库

Mybatis-Plus 数据自动填充 ​

项目中在 lihua-base - lihua-base-mybatis - com/lihua/mybatis/handle/AutoFillHandler.java 中配置了基础字段的数据自动填充,继承了 BaseEntity 的对象在插入/更新时会自动填充 创建人、创建时间、逻辑删除标识、更新人、更新时间

java
@Component
public class AutoFillHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        // 创建用户
        if (LoginUserContext.getUserId() != null) {
            this.strictInsertFill(metaObject, "createId", String.class, LoginUserContext.getUserId());
        }
        // 创建时间
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, DateUtils.now());
        // 逻辑删除
        this.strictInsertFill(metaObject, "delFlag", String.class, "0");
    }
    
    @Override
    public void updateFill(MetaObject metaObject) {
        // 更新用户
        if (LoginUserContext.getUserId() != null) {
            this.strictUpdateFill(metaObject, "updateId", String.class, LoginUserContext.getUserId());
        }
        // 更新时间
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, DateUtils.now());
    }
}

同级排序归一化 ​

列表类业务普遍带 sort 字段做拖拽排序,最怕删插之后序号断档。lihua-base-mybatis 中的 SortUtils 提供了同级排序归一化能力:记录写序号 N 即占据组内第 N 位,原有记录从该位起顺延,最终重编为 1..N 的连续序号

  • 实体需同时继承 BaseEntity 并实现 SortEntity 接口(提供 getId()/getSort())
  • 组键列名(如 parent_id、dict_type_code)由调用方传入
  • 返回序号发生变化的行数,为 0 表示组内本已连续,可跳过缓存刷新等后置动作
// 将同一父部门下的子部门按序号归一化
SortUtils.normalize(sysDeptMapper, "parent_id", parentId);