ShardingSphere学习之分页

我爱海鲸 2023-04-11 01:25:52 ShardingSphere、分库分表

简介ShardingSphere、分库、分表

1、官方文档:https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/yaml-config/rules/sharding/

2、链接上一篇文章:ShardingSphere学习之水平分表

上一篇文章中我们已经实现了一个简单的水平分表,能够满足基本的查询和数据插入的需求了,现在我们在进行企业操作中比较重要的一点:分页查询

3、完整的项目截图:

4、MybatisPlusConfig类:

package xyz.haijin.sharding.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author: haijin
 * @Date: 2022/11/19 12:30
 */
@Configuration
public class MybatisPlusConfig {

    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

5、PageBean类:

package xyz.haijin.sharding.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author: haijin
 * @Date: 2022/11/19 12:30
 */
@Configuration
public class MybatisPlusConfig {

    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

6、BaseEntityWrapper类:

package xyz.haijin.sharding.wrapper;

import com.baomidou.mybatisplus.core.metadata.IPage;
import xyz.haijin.sharding.model.PageBean;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 实体转化工具类
 * @author liuhaijin
 * @date 2022/7/18
 */
public abstract class BaseEntityWrapper<E, V> {
    public BaseEntityWrapper() {
    }

    public abstract V entityVO(E entity);

    public List<V> listVO(List<E> list) {
        return (List)list.stream().map(this::entityVO).collect(Collectors.toList());
    }

    /**
     * 将查询的分页数据封装为返回对象
     * @param list 当前分页的数据
     * @param total 总数据条数
     * @param current 当前页码
     * @param pageSize 当前页码容量
     * @return ignore
     */
    public PageBean<V> pageFmVO(List<E> list, int total, int current, int pageSize) {
        List<V> records = this.listVO(list);
        PageBean<V> pageBean = new PageBean<>();
        // 当前页码
        pageBean.setCurrentPage(current);
        // 页面容量
        pageBean.setPageSize(pageSize);
        // 总数量
        pageBean.setTotalCount(total);
        // 总页数
        int totalPage = total / pageSize + (total % pageSize == 0 ? 0 : 1);
        pageBean.setTotalPage(totalPage);
        // 查询的数据
        pageBean.setList(records);
        return pageBean;
    }

    /**
     * 分页实体类集合包装
     *
     * @param pages 分页对象
     * @return IPage<V>
     */
    public PageBean<V> pageVO(IPage<E> pages) {
        List<V> records = listVO(pages.getRecords());
        PageBean<V> pageBean = new PageBean<>();
        // 当前页码
        pageBean.setCurrentPage(pages.getCurrent());
        // 页面容量
        pageBean.setPageSize(pages.getSize());
        // 总数量
        pageBean.setTotalCount(pages.getTotal());
        // 总页数
        long totalPage = pages.getPages();
        pageBean.setTotalPage(totalPage);
        // 查询的数据
        pageBean.setList(records);
        return pageBean;
    }
}

7、分页查询:

  @Test
    public void pageCourse() {
        Page<Course> page = courseService.page(new Page<>(1, 10), Wrappers.<Course>lambdaQuery()
                .orderByDesc(Course::getCid)
        );
        System.out.println(page.getRecords());
    }

如图:

8、异常,在搭建的过程中,我也有很多异常,基本上的解决还是靠官方的文档,这个框架的更新也比较快,很多东西百度出来可能并不能满足。

Not allow DML operation without sharding conditions

碰到了上述的一个问题,怎么的解决的呢?

这其实是一个配置的问题,解决的办法就是:

        # 分片审计算法配置
        auditors:
          # 这里对应 auditorNames:
          #                - sharding_key_required_auditor
          sharding_key_required_auditor:
            type: DML_SHARDING_CONDITIONS

取消这段配置。至于这个配置的具体作用我还是没想明白。以后在看。

2023-04-11

start:

相关文章

剖析Sharding-Sphere系列——结果归并

end

你好:我的2025