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:
相关文章
end