什麼是Http無狀態?Session、Cookie、Token三者之間的區別
阿新 • • 發佈:2022-05-24
mybatis-plus分頁查詢
首先建立一個數據庫表,如下圖所示:
然後建立一個Spring Boot專案,pom.xml和配置如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.kaven</groupId> <artifactId>mybatis-plus</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> <relativePath/> </parent> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency><groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
application.yaml配置:
spring: application: name: mybatis-plus datasource: driver-class-name: com.mysql.jdbc.Driver username: root password: ITkaven@123 url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useSSL=false server: port: 8085 logging: level: root: warn com.kaven.mybatisplus.dao: trace pattern: console: '%p%m%n' mybatis-plus: mapper-locations: classpath:mappers/*.xml
實體類User:
package com.kaven.mybatisplus.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @TableName("user") @Data public class User { @TableId private String id; @TableField("username") private String username; @TableField("password") private String password; @TableField("age") private Integer age; /** * 使用 @TableField(exist = false) ,表示該欄位在資料庫中不存在 ,所以不會插入資料庫中 * 使用 transient 、 static 修飾屬性也不會插入資料庫中 */ @TableField(exist = false) private String phone; }
Mapper介面UserMapper:
package com.kaven.mybatisplus.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.kaven.mybatisplus.entity.User; import org.springframework.stereotype.Component; @Component public interface UserMapper extends BaseMapper<User> {}
啟動類:
package com.kaven.mybatisplus; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan(basePackages = "com.kaven.mybatisplus.dao") public class AppRun { public static void main(String[] args) { SpringApplication.run(AppRun.class , args); } }
@MapperScan(basePackages = "com.kaven.mybatisplus.dao")
這個一定要加上。
我們先在資料庫中新增幾行資料,方便演示。
為了使用MyBatis-Plus來實現分頁查詢,還需要一些配置。
package com.kaven.mybatisplus.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MybatisPlusConfig { /** * 新的分頁外掛,一緩和二緩遵循mybatis的規則,需要設定 MybatisConfiguration#useDeprecatedExecutor = false 避免快取出現問題(該屬性會在舊外掛移除後一同移除) */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); paginationInnerInterceptor.setDbType(DbType.MYSQL); paginationInnerInterceptor.setOverflow(true); interceptor.addInnerInterceptor(paginationInnerInterceptor); return interceptor; } @Bean public ConfigurationCustomizer configurationCustomizer() { return configuration -> configuration.setUseDeprecatedExecutor(false); } }
專案結構如下圖:
現在來使用一下分頁查詢方法selectPage()
。
package com.kaven.mybatisplus.dao; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.kaven.mybatisplus.entity.User; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class UserMapperPageTest { @Autowired private UserMapper userMapper; @Test public void selectPage(){ LambdaQueryWrapper<User> userLambdaQueryWrapper = Wrappers.lambdaQuery(); userLambdaQueryWrapper.like(User::getUsername , "k"); Page<User> userPage = new Page<>(1 , 2); IPage<User> userIPage = userMapper.selectPage(userPage , userLambdaQueryWrapper); System.out.println("總頁數: "+userIPage.getPages()); System.out.println("總記錄數: "+userIPage.getTotal()); userIPage.getRecords().forEach(System.out::println); } }
結果如下:
結果是正確的,可以看到該方法執行了兩條sql
,一條是查詢總記錄數,一條是查詢我們需要的資料。
如果我們並不需要總記錄數,查詢總記錄數就完全沒有必要,因為它也需要耗時,其實可以設定不查詢總記錄數。
package com.kaven.mybatisplus.dao; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.kaven.mybatisplus.entity.User; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class UserMapperPageTest { @Autowired private UserMapper userMapper; @Test public void selectPage(){ LambdaQueryWrapper<User> userLambdaQueryWrapper = Wrappers.lambdaQuery(); userLambdaQueryWrapper.like(User::getUsername , "k"); Page<User> userPage = new Page<>(1 , 2 , false); IPage<User> userIPage = userMapper.selectPage(userPage , userLambdaQueryWrapper); System.out.println("總頁數: "+userIPage.getPages()); System.out.println("總記錄數: "+userIPage.getTotal()); userIPage.getRecords().forEach(System.out::println); } }
Page<User> userPage = new Page<>(1 , 2 , false);
在這裡設定為false
即可。
結果如下:
從上圖可以看到只有一條sql
,總頁數和總記錄數都為0
,因為我們設定了不需要去查詢這些資訊。
再來演示一下selectMapsPage()
的用法。
package com.kaven.mybatisplus.dao; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.kaven.mybatisplus.entity.User; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.HashMap; import java.util.List; import java.util.Map; @RunWith(SpringRunner.class) @SpringBootTest public class UserMapperPageTest { @Autowired private UserMapper userMapper; @Test public void selectMapsPage(){ LambdaQueryWrapper<User> userLambdaQueryWrapper = Wrappers.lambdaQuery(); userLambdaQueryWrapper.select(User::getUsername).like(User::getUsername , "k"); Page<Map<String , Object>> mapPage = new Page<>(1 , 2 , false); IPage<Map<String , Object>> mapIPage = userMapper.selectMapsPage(mapPage , userLambdaQueryWrapper); System.out.println("總頁數: "+mapIPage.getPages()); System.out.println("總記錄數: "+mapIPage.getTotal()); mapIPage.getRecords().forEach(System.out::println); } }
結果如下:
結果也是正確的,從用法上也可以看出應用場景。
基於可擴充套件性,MyBatis-Plus還可以使用自定義sql
的方法來實現分頁查詢,這樣便於多表等複雜條件。
修改UserMapper介面:
package com.kaven.mybatisplus.dao; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.kaven.mybatisplus.entity.User; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; @Component public interface UserMapper extends BaseMapper<User> { IPage<User> selectByPage(IPage<User> userPage , @Param(Constants.WRAPPER) Wrapper<User> userWrapper); }
UserMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.kaven.mybatisplus.dao.UserMapper"> <select id="selectByPage" resultType="com.kaven.mybatisplus.entity.User"> select * from user ${ew.customSqlSegment} </select> </mapper>
也可以使用Mybatis
的註解來代替xml配置檔案(如@Select
)。
測試程式碼:
package com.kaven.mybatisplus.dao; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.kaven.mybatisplus.entity.User; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.HashMap; import java.util.List; import java.util.Map; @RunWith(SpringRunner.class) @SpringBootTest public class UserMapperPageTest { @Autowired private UserMapper userMapper; @Test public void selectByPage(){ LambdaQueryWrapper<User> userLambdaQueryWrapper = Wrappers.lambdaQuery(); userLambdaQueryWrapper.like(User::getUsername , "k"); Page<User> mapPage = new Page<>(1 , 2 , false); IPage<User> mapIPage = userMapper.selectByPage(mapPage , userLambdaQueryWrapper); System.out.println("總頁數: "+mapIPage.getPages()); System.out.println("總記錄數: "+mapIPage.getTotal()); mapIPage.getRecords().forEach(System.out::println); } }
結果如下:
結果也是正確的。