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);
