> Java > java지도 시간 > 본문

springboot가 mybatis 페이징 인터셉터를 통합하는 방법

WBOY
풀어 주다: 2023-05-13 16:31:13
앞으로
1697명이 탐색했습니다.

소개

오늘 개발을 하다가 프로덕션 서버에서 하면 GIT에서 많은 문제를 일으킬까 봐 개발 서버에서는 하기 싫기 때문에 작성한 코드를 최적화하고 싶었습니다. , 그리고 내 휠(도구)로 분리합니다. 프로젝트에서 최종 실행 후 목록을 받았을 때 최소 10초 동안 멈춰 있는 것을 발견했습니다. 일반적으로 내 일반 버전은 약 800ms입니다. (오래 보지 마세요, 데이터의 양이 매우 많기 때문에 정상입니다.), 전제로 정말 최적화가 필요할 때 최적화된 플러스 버전을 출시할 예정입니다. 이 앱 프로젝트를 처음 받았을 때 PageHelper.startPage(page, num ); (paging)을 사용했는데, 이제 페이지가 분할되어 데이터 캡슐화(PageInfo)가 발견되었습니다. 휠에서 이 문제를 발견했습니다. SQL 뒤에 있는 제한을 연결하는 데 도움이 되지 않아 모든 것을 얻을 수 있게 되었고, PageInfo 페이징이 발생하여 엄청난 양의 데이터가 매우 정체되었습니다...

10초:

springboot가 mybatis 페이징 인터셉터를 통합하는 방법

일반:

springboot가 mybatis 페이징 인터셉터를 통합하는 방법

springboot는 mybatis 페이징 인터셉터를 통합합니다.

페이지 차단은 실제로 SQL을 가져온 다음 SQL Splice 제한을 변환하는 것입니다

pom.xml

   <!-- 引入分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.2.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
         <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
로그인 후 복사

yml

spring:
  application:
    name: spring-cloud-dynamic
  datasource:
    #类型
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/f2f?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: root
    password: 

    initial-size: 2
    max-idle: 10
    min-idle: 1
    max-wait: 60000
    max-active: 20 #最大空闲连接数
    #多久进行一次检测,检测需要关闭的空闲连接
    time-between-eviction-tuns-millis: 60000
로그인 후 복사

MybatisConfig

/**
 * @author lanys
 * @Description:
 * @date 23/7/2021 下午8:38
 */

@Configuration
@EnableTransactionManagement
@PropertySource(value = "classpath:application.yml", ignoreResourceNotFound = true)
public class MybatisConfig implements TransactionManagementConfigurer {

    @Value("${mybatis.mapper-locations}")
    private String mapper;

    @Value("${mybatis.type-aliases-package}")
    private String aliases;

    @Autowired
    private DataSource dataSource;

    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        // 设置数据源
        bean.setDataSource(dataSource);
        // 设置xml
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapper));
        // 设置别名
        bean.setTypeAliasesPackage(aliases);
        // 添加分页插件
        bean.setPlugins(new Interceptor[]{pageInterceptor()});
        bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        return bean.getObject();
    }

    /**
     * 分页拦截器
     * @return
     */
    private PageInterceptor pageInterceptor() {
        PageInterceptor pageInterceptor = new PageInterceptor();
        // 详见 com.github.pagehelper.page.PageParams
        Properties p = new Properties();
        // RowBounds是否进行count查询 - 默认不查询
        p.setProperty("rowBoundsWithCount", "true");
        // 当设置为true的时候,如果page size设置为0(或RowBounds的limit=0),就不执行分页,返回全部结果
        p.setProperty("pageSizeZero", "true");
        // 分页合理化
        p.setProperty("reasonable", "false");
        // 是否支持接口参数来传递分页参数,默认false
        p.setProperty("supportMethodsArguments", "true");
        // 设置数据库方言 , 也可以不设置,会动态获取
        p.setProperty("helperDialect", "mysql");
        pageInterceptor.setProperties(p);
        return pageInterceptor;
    }

    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }
}
로그인 후 복사

테스트

자신만의 코드

/**
     * 关注列表
     * @param userId
     * @param page
     * @param size
     * @return
     */
    @Override
    public List<DynamicInfo> focusList(Long userId, Integer page, Integer size) {
        PageHelper.startPage(page, size);

        List<DynamicInfo> listByUserId = new ArrayList<>();
        try {
            //获取自己关注列表
            listByUserId = this.dynamicReleaseMapper.getListFocusId(userId);
            if (listByUserId == null || listByUserId.size() == 0){
                return listByUserId;
            }
            //List<DynamicInfo> listByUserId = this.dynamicReleaseMapper.getListFocusId(userId).stream().filter(x->(x.getIsPicture()!=2 && x.getIsVideo() !=2)||(x.getIsPicture()==2 && x.getIsVideo() !=2)||(x.getIsPicture()!=2 && x.getIsVideo() ==2)).collect(Collectors.toList());
            publicGetDynamicInfo(userId,listByUserId);
            //}
            log.info("-------获取关注列表-------");
            return listByUserId;
        } catch (Exception e) {
            log.error("获取关注列表异常",e);
        }
        return listByUserId;
    }
로그인 후 복사

페이지를 매기려면 PageHelper.startPage(page, size);를 추가하세요. 그렇지 않으면 기본적으로 페이지가 매겨지지 않습니다. 직접 제한을 추가할 수도 있습니다.

결과(sql 문은 매우 길어서 일부가 가로채어집니다.):

GROUP BY id ORDER BY create_time desc LIMIT ?
로그인 후 복사

위 내용은 springboot가 mybatis 페이징 인터셉터를 통합하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!