Varias formas de escribir paginación en MyBatis-Plus

Introducción

MyBatis-Plus (se abre en ventana nueva) (MP para abreviar) es unaherramienta de mejora para MyBatis (se abre en ventana nueva) Sobre la base de MyBatis, solo se realizan mejoras sin cambios, y nació para simplificar el desarrollo y mejorar la eficiencia.

característica

  • Sin intrusión : solo mejora y sin cambios, la introducción no afectará el proyecto existente, tan suave como la seda.

  • Baja pérdida : el CURD básico se inyectará automáticamente cuando se inicie, el rendimiento es básicamente sin pérdidas y la operación orientada a objetos se realiza directamente

  • Potentes operaciones CRUD : mapeador general y servicio general incorporados, la mayoría de las operaciones CRUD en una sola tabla se pueden realizar con solo una pequeña cantidad de configuración, y hay un potente constructor de condiciones para satisfacer diversas necesidades de uso

  • Admite llamada de formulario Lambda : a través de expresiones Lambda, es conveniente escribir varias condiciones de consulta, sin necesidad de preocuparse por los errores tipográficos de campo

  • Admite la generación automática de claves principales : admite hasta 4 estrategias de claves principales (incluido un generador de ID único distribuido - Secuencia), que se pueden configurar libremente para resolver perfectamente el problema de la clave principal

  • Admite el modo ActiveRecord : admite la llamada de formulario ActiveRecord, la clase de entidad solo necesita heredar la clase Model para realizar potentes operaciones CRUD

  • Admite operaciones generales globales personalizadas : admite inyección de método general global (escribir una vez, usar en cualquier lugar)

  • Generador de código incorporado : use el código o el complemento Maven para generar rápidamente código de capa de mapeador, modelo, servicio, controlador, motor de plantilla de soporte y más configuraciones personalizadas que están esperando que las use

  • Complemento de paginación incorporado : basado en la paginación física de MyBatis, los desarrolladores no necesitan preocuparse por operaciones específicas. Después de configurar el complemento, escribir paginación es equivalente a una consulta de lista normal.

  • El complemento de paginación admite múltiples bases de datos : admite MySQL, MariaDB, Oracle, DB2, H2, HSQL, SQLite, Postgre, SQLServer y otras bases de datos

  • Complemento de análisis de rendimiento incorporado : puede generar declaraciones SQL y su tiempo de ejecución. Se recomienda habilitar esta función durante el desarrollo y las pruebas, que pueden descubrir rápidamente las consultas lentas.

  • Complemento de intercepción global incorporado : proporciona análisis inteligente y bloqueo de operaciones de eliminación y actualización en toda la tabla, y también puede personalizar las reglas de intercepción para evitar operaciones incorrectas

base de datos de soporte

Cualquier base de datos que pueda usar MyBatis para CRUD y admita SQL estándar, el soporte específico es el siguiente, si no está en la lista a continuación, consulte la parte de paginación del tutorial PR para su soporte.
  • MySQL, Oracle, DB2, H2, HSQL, SQLite, PostgreSQL, SQLServer, Phoenix, Gauss, ClickHouse, Sybase, OceanBase, Firebird, Cubrid, Goldilocks, csiidb, informix, TEngine, redshift

  • Base de datos Dameng, Base de datos Xugu, Base de datos Jincang de la Universidad Renmin, Base de datos general Nanda (Huaku), Base de datos general Nanda, Base de datos Shentong, Base de datos Hangao, Base de datos Youxuan

Inicio rápido

agregar dependencias

La nueva versión MyBatis-Plus 3.0 está basada en JDK8 y proporciona llamadas lambda, por lo que los requisitos para instalar e integrar MP3.0 son los siguientes:

  • JDK 8+

  • Maven o Gradle

Proyecto Spring Boot

experto:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>最新版本</version>
</dependency>

proyecto de primavera

experto:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>最新版本</version>
</dependency>

configuración

Agregue la configuración relevante de la base de datos H2 en el archivo de configuración application.yml:

# DataSource Config
spring:
  datasource:
    driver-class-name: org.h2.Driver
    schema: classpath:db/schema-h2.sql
    username: root
    password: test
  sql:
    init:
      schema-locations: classpath:db/schema-h2.sql
      data-locations: classpath:db/data-h2.sql

Agregue la anotación @MapperScan a la clase de inicio Spring Boot para escanear la carpeta Mapper:

@SpringBootApplication
@MapperScan("com.baomidou.mybatisplus.samples.quickstart.mapper")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

Paginas

método uno:

Utilice la interfaz de la página de servicio de mybatis-plus


    @GetMapping("/pageList")
    @ApiOperation(value = "分页列表", notes = "query和user")
    public R<IPage<User>> pageList(@ApiIgnore User user, Query query) {
        //无条件分页
        IPage<User> pages = userService.page(Condition.getPage(query));
        //有条件分页
        IPage<User> pages = userService.page(Condition.getPage(query), Wrappers.lambdaQuery(user));
        return R.data(pages);
    }

Método 2:

Paginación sql personalizada


Código de la capa del controlador:

    @GetMapping("/pageList")
   @ApiOperation(value = "分页列表", notes = "query和user")
    public R<IPage<User>> pageList(@ApiIgnore User user, Query query) {
        IPage<User> pages = userService.selectUserPage(Condition.getPage(query), user);
        return R.data(pages);
    }

Llame al método asignador sql de paginación personalizado en el servicio

  @Override
    public IPage<User> selectUserPage(IPage<User> page, User user) {
        return page.setRecords(baseMapper.selectUserPage(page, user));
    }

Defina la interfaz de paginación del mapeador:


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.gis.spacedata.bladex.domain.entity.system.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;

import java.util.List;

public interface UserMapper extends BaseMapper<User> {

    List<User> selectUserPage(IPage<User> page, @Param("user") User user);

}

mybatisxml:

    <select id="selectUserPage" resultMap="userResultMap">
        select * from blade_user where is_deleted = 0
        <if test="user.tenantId!=null and user.tenantId != ''">
            and tenant_id = #{user.tenantId}
        </if>
        <if test="user.account!=null and user.account != ''">
            and account like CONCAT('%',#{user.account},'%')
        </if>
        <if test="user.realName!=null and user.realName != ''">
            and real_name like CONCAT('%',#{user.realName},'%')
        </if>
        <if test="user.roleId!=null and user.roleId != ''">
            and CAST(#{user.roleId} AS VARCHAR)= ANY(STRING_TO_ARRAY(role_id, ','))
        </if>
        ORDER BY id
    </select>

Clase de herramienta de condición:


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springblade.core.launch.constant.TokenConstant;
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;

import java.util.Map;

/**
 * 分页工具
 *
 * @author Chill
 */
public class Condition {

    /**
     * 转化成mybatis plus中的Page
     *
     * @param query 查询条件
     * @return IPage
     */
    public static <T> IPage<T> getPage(Query query) {
        Page<T> page = new Page<>(Func.toInt(query.getCurrent(), 1), Func.toInt(query.getSize(), 10));
        page.setAsc(Func.toStrArray(SqlKeyword.filter(query.getAscs())));
        page.setDesc(Func.toStrArray(SqlKeyword.filter(query.getDescs())));
        return page;
    }

    /**
     * 获取mybatis plus中的QueryWrapper
     *
     * @param entity 实体
     * @param <T>    类型
     * @return QueryWrapper
     */
    public static <T> QueryWrapper<T> getQueryWrapper(T entity) {
        return new QueryWrapper<>(entity);
    }

    /**
     * 获取mybatis plus中的QueryWrapper
     *
     * @param query 查询条件
     * @param clazz 实体类
     * @param <T>   类型
     * @return QueryWrapper
     */
    public static <T> QueryWrapper<T> getQueryWrapper(Map<String, Object> query, Class<T> clazz) {
        Kv exclude = Kv.create().set(TokenConstant.HEADER, TokenConstant.HEADER)
            .set("current", "current").set("size", "size").set("ascs", "ascs").set("descs", "descs");
        return getQueryWrapper(query, exclude, clazz);
    }

    /**
     * 获取mybatis plus中的QueryWrapper
     *
     * @param query   查询条件
     * @param exclude 排除的查询条件
     * @param clazz   实体类
     * @param <T>     类型
     * @return QueryWrapper
     */
    public static <T> QueryWrapper<T> getQueryWrapper(Map<String, Object> query, Map<String, Object> exclude, Class<T> clazz) {
        exclude.forEach((k, v) -> query.remove(k));
        QueryWrapper<T> qw = new QueryWrapper<>();
        qw.setEntity(BeanUtil.newInstance(clazz));
        SqlKeyword.buildCondition(query, qw);
        return qw;
    }

}

Método 3:

Clase Db usando mybatis-plus

ilustrar:

  • Use el método de llamada estática para ejecutar el método CRUD, evite la inyección del ciclo de servicio en el entorno Spring, simplifique el código y mejore la eficiencia

  • BaseMapper que debe inyectarse en la entidad correspondiente en el proyecto

  • Para el parámetro Wrapper, se debe pasar Entity o EntityClass en Wrapper para encontrar el Mapper correspondiente

  • No se recomienda llamarlo en un bucle. Si se guarda en lotes, se recomienda usar Db.saveBatch(data) para guardar los datos después de construirlos.



    @Test
    void testPage() {
        IPage<Entity> page = Db.page(new Page<>(1, 1), Entity.class);
        Assertions.assertEquals(2, page.getTotal());
        page = Db.page(new Page<>(1, 1), Wrappers.lambdaQuery(Entity.class));
        Assertions.assertEquals(1, page.getRecords().size());
    }

Complemento de paginación de página

Lo extraño es que los datos que consulta siguen siendo todos los datos y no logra nuestro efecto de paginación.

Todos sabemos que el principio de paginación es donde límite?,?

Es decir, solo agregue la condición where después de esta declaración de consulta, podemos interceptar esta declaración y agregarle nuestra condición where, que también es el retiro de la idea AOP (solo mejora el código original, sin modificación)

Cuerpo del complemento MybatisPlusInterceptor

Este complemento es un complemento central, que actualmente representa los métodos Executor#query, Executor#update y StatementHandler#prepare.

Interceptor interno

Los complementos que proporcionamos implementarán funciones basadas en esta interfaz

Funciones disponibles actualmente:

  • Paginación automática: PaginationInnerInterceptor

  • Tenencia múltiple: TenantLineInnerInterceptor

  • Nombre de la tabla dinámica: DynamicTableNameInnerInterceptor

  • Cerradura optimista: OptimisticLockerInnerInterceptor

  • Propiedades SQL: IllegalSQLInnerInterceptor

  • Impedir la actualización y eliminación de tablas completas: BlockAttackInnerInterceptor

Configuración del complemento de paginación

Transacción Spring, complemento de paginación MybatisPlus, escaneo de paquetes Mybatis y otras configuraciones


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;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * spring事务、MybatisPlus分页插件、mybatis包扫描等配置
 *
 * @author tarzan liu
 * @since JDK1.8
 * @date 2021年5月11日
 */
@EnableTransactionManagement
@Configuration
@MapperScan(basePackages = "com.tarzan.**.mapper")
public class MybatisPlusConfig {

    /**
     * 分页插件
     */
    @Bean
    public MybatisPlusInterceptor paginationInterceptor() {
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        paginationInnerInterceptor.setMaxLimit(-1L);
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
        return mybatisPlusInterceptor;
    }
}

En el código, paginationInnerInterceptor.setMaxLimit(-1L); significa que no hay límite en el número máximo de páginas. De forma predeterminada, el límite máximo es de 500 datos por página.

Supongo que te gusta

Origin blog.csdn.net/weixin_40986713/article/details/129195211
Recomendado
Clasificación