Maison > Java > javaDidacticiel > Comment Springboot intègre l'intercepteur de pagination mybatis

Comment Springboot intègre l'intercepteur de pagination mybatis

WBOY
Libérer: 2023-05-13 16:31:13
avant
1797 Les gens l'ont consulté

Introduction

Quand je développais aujourd'hui, je voulais optimiser le code que j'écrivais, car je ne voulais pas le faire sur le serveur de développement, de peur que cela cause beaucoup de choses de problèmes lorsque GIT arrive sur le serveur de production, puis je l'ai séparé dans mon projet de roue (outil). Après l'exécution finale, j'ai constaté que lorsque j'ai reçu la liste, elle était bloquée pendant au moins 10 secondes. Ma version normale prend généralement environ 800 ms (ne la regardez pas longtemps car la quantité de données est très importante), le principe est que je sais aussi qu'elle est très lente lorsque j'ai vraiment besoin d'optimiser. Je vais publier ma version optimisée plus et revenir à 10 secondes. Lorsque j'ai reçu ce projet d'application pour la première fois, j'ai utilisé PageHelper.startPage(page, num (paging), et les pages étaient déjà divisées avant l'encapsulation des données (PageInfo); a été trouvé. Maintenant, j'ai trouvé ce problème lorsque je suis passé à la roue. Cela ne m'a pas aidé à définir la limite. L'épissage à l'arrière du SQL m'a permis d'obtenir tout, puis la pagination PageInfo l'a provoqué. être coincé. Enfin...

10 secondes :

Comment Springboot intègre lintercepteur de pagination mybatis

Normal :

# 🎜🎜#Comment Springboot intègre lintercepteur de pagination mybatis

springboot intègre l'intercepteur de pagination mybatis

L'interception de pagination consiste en fait à obtenir le SQL puis la limite d'épissage SQL

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>
Copier après la connexion

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
Copier après la connexion

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);
    }
}
Copier après la connexion

test

# 🎜 🎜#Mon propre code

/**
     * 关注列表
     * @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;
    }
Copier après la connexion
#🎜🎜 #Si tu souhaitez paginer, ajoutez PageHelper.startPage(page, size);, sinon il ne sera pas paginé par défaut. Vous pouvez également ajouter une limite vous-même.

Result (L'instruction SQL est très longue et en fait partie. est intercepté) :

GROUP BY id ORDER BY create_time desc LIMIT ?
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal