From 91cd70c75394cf04d5510c00d34e66ce9aca6e29 Mon Sep 17 00:00:00 2001 From: "Yangkai.Shen" <237497819@qq.com> Date: Wed, 7 Nov 2018 15:20:46 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20spring-boot-demo-orm-jpa=20?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring-boot-demo-orm-jpa/README.md | 409 +++++++++++++++++++++ spring-boot-demo-orm-jpa/pom.xml | 23 +- .../com/xkcoding/orm/jpa/config/JpaConfig.java | 59 +++ .../java/com/xkcoding/orm/jpa/entity/User.java | 69 ++++ .../orm/jpa/entity/base/AbstractAuditModel.java | 51 +++ .../com/xkcoding/orm/jpa/repository/UserDao.java | 23 ++ .../src/main/resources/application.yml | 39 ++ .../xkcoding/orm/jpa/repository/UserDaoTest.java | 130 +++++++ 8 files changed, 802 insertions(+), 1 deletion(-) create mode 100644 spring-boot-demo-orm-jpa/README.md create mode 100644 spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/config/JpaConfig.java create mode 100644 spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/entity/User.java create mode 100644 spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/entity/base/AbstractAuditModel.java create mode 100644 spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/repository/UserDao.java create mode 100644 spring-boot-demo-orm-jpa/src/test/java/com/xkcoding/orm/jpa/repository/UserDaoTest.java diff --git a/spring-boot-demo-orm-jpa/README.md b/spring-boot-demo-orm-jpa/README.md new file mode 100644 index 0000000..3e2dc3b --- /dev/null +++ b/spring-boot-demo-orm-jpa/README.md @@ -0,0 +1,409 @@ +# spring-boot-demo-orm-jpa +> 此 demo 主要演示了 Spring Boot 如何使用 JPA 操作数据库。 + +## pom.xml +```xml + + + 4.0.0 + + spring-boot-demo-orm-jpa + 1.0.0-SNAPSHOT + jar + + spring-boot-demo-orm-jpa + Demo project for Spring Boot + + + com.xkcoding + spring-boot-demo + 1.0.0-SNAPSHOT + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter + + + + mysql + mysql-connector-java + + + + org.springframework.boot + spring-boot-starter-test + test + + + + cn.hutool + hutool-all + + + + com.google.guava + guava + + + + org.projectlombok + lombok + true + + + + + spring-boot-demo-orm-jpa + + + org.springframework.boot + spring-boot-maven-plugin + + + + + +``` +## JpaConfig.java +```java +/** + *

+ * JPA配置类 + *

+ * + * @package: com.xkcoding.orm.jpa.config + * @description: JPA配置类 + * @author: yangkai.shen + * @date: Created in 2018/11/7 11:05 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Configuration +@EnableTransactionManagement +@EnableJpaAuditing +@EnableJpaRepositories(basePackages = "com.xkcoding.orm.jpa.repository", transactionManagerRef = "jpaTransactionManager") +public class JpaConfig { + @Bean + @ConfigurationProperties(prefix = "spring.datasource") + public DataSource dataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + HibernateJpaVendorAdapter japVendor = new HibernateJpaVendorAdapter(); + japVendor.setGenerateDdl(false); + LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean(); + entityManagerFactory.setDataSource(dataSource()); + entityManagerFactory.setJpaVendorAdapter(japVendor); + entityManagerFactory.setPackagesToScan("com.xkcoding.orm.jpa.entity"); + return entityManagerFactory; + } + + @Bean + public PlatformTransactionManager jpaTransactionManager(EntityManagerFactory entityManagerFactory) { + JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(entityManagerFactory); + return transactionManager; + } +} +``` +## User.java +```java +/** + *

+ * 用户实体类 + *

+ * + * @package: com.xkcoding.orm.jpa.entity + * @description: 用户实体类 + * @author: yangkai.shen + * @date: Created in 2018/11/7 14:06 + * @copyright: Copyright (c) + * @version: V1.0 + * @modified: yangkai.shen + */ +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Entity +@Table(name = "orm_user") +@ToString(callSuper = true) +public class User extends AbstractAuditModel { + /** + * 用户名 + */ + private String name; + + /** + * 加密后的密码 + */ + private String password; + + /** + * 加密使用的盐 + */ + private String salt; + + /** + * 邮箱 + */ + private String email; + + /** + * 手机号码 + */ + @Column(name = "phone_number") + private String phoneNumber; + + /** + * 状态,-1:逻辑删除,0:禁用,1:启用 + */ + private Integer status; + + /** + * 上次登录时间 + */ + @Column(name = "last_login_time") + private Date lastLoginTime; +} +``` +## AbstractAuditModel.java +```java +/** + *

+ * 实体通用父类 + *

+ * + * @package: com.xkcoding.orm.jpa.entity.base + * @description: 实体通用父类 + * @author: yangkai.shen + * @date: Created in 2018/11/7 14:01 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +@Data +public abstract class AbstractAuditModel implements Serializable { + /** + * 主键 + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 创建时间 + */ + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "create_time", nullable = false, updatable = false) + @CreatedDate + private Date createTime; + + /** + * 上次更新时间 + */ + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_update_time", nullable = false) + @LastModifiedDate + private Date lastUpdateTime; +} +``` +## UserDao.java +```java +/** + *

+ * User Dao + *

+ * + * @package: com.xkcoding.orm.jpa.repository + * @description: User Dao + * @author: yangkai.shen + * @date: Created in 2018/11/7 14:07 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Repository +public interface UserDao extends JpaRepository { + +} +``` +## application.yml +```yaml +server: + port: 8080 + servlet: + context-path: /demo +spring: + datasource: + jdbc-url: jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8 + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + initialization-mode: always + continue-on-error: true + schema: + - "classpath:db/schema.sql" + data: + - "classpath:db/data.sql" + hikari: + minimum-idle: 5 + connection-test-query: SELECT 1 FROM DUAL + maximum-pool-size: 20 + auto-commit: true + idle-timeout: 30000 + pool-name: SpringBootDemoHikariCP + max-lifetime: 60000 + connection-timeout: 30000 + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL57InnoDBDialect + open-in-view: true +logging: + level: + com.xkcoding: debug + org.hibernate.SQL: debug + org.hibernate.type: trace +``` +## UserDaoTest.java +```java +/** + *

+ * jpa 测试类 + *

+ * + * @package: com.xkcoding.orm.jpa.repository + * @description: jpa 测试类 + * @author: yangkai.shen + * @date: Created in 2018/11/7 14:09 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Slf4j +public class UserDaoTest extends SpringBootDemoOrmJpaApplicationTests { + @Autowired + private UserDao userDao; + + /** + * 测试保存 + */ + @Test + public void testSave() { + String salt = IdUtil.fastSimpleUUID(); + User testSave3 = User.builder().name("testSave3").password(SecureUtil.md5("123456" + salt)).salt(salt).email("testSave3@xkcoding.com").phoneNumber("17300000003").status(1).lastLoginTime(new DateTime()).build(); + userDao.save(testSave3); + + Assert.assertNotNull(testSave3.getId()); + Optional byId = userDao.findById(testSave3.getId()); + Assert.assertTrue(byId.isPresent()); + log.debug("【byId】= {}", byId.get()); + } + + /** + * 测试删除 + */ + @Test + public void testDelete() { + long count = userDao.count(); + userDao.deleteById(1L); + long left = userDao.count(); + Assert.assertEquals(count - 1, left); + } + + /** + * 测试修改 + */ + @Test + public void testUpdate() { + userDao.findById(1L).ifPresent(user -> { + user.setName("JPA修改名字"); + userDao.save(user); + }); + Assert.assertEquals("JPA修改名字", userDao.findById(1L).get().getName()); + } + + /** + * 测试查询单个 + */ + @Test + public void testQueryOne() { + Optional byId = userDao.findById(1L); + Assert.assertTrue(byId.isPresent()); + log.debug("【byId】= {}", byId.get()); + } + + /** + * 测试查询所有 + */ + @Test + public void testQueryAll() { + List users = userDao.findAll(); + Assert.assertNotEquals(0, users.size()); + log.debug("【users】= {}", users); + } + + /** + * 测试分页排序查询 + */ + @Test + public void testQueryPage() { + // 初始化数据 + initData(); + // JPA分页的时候起始页是页码减1 + Integer currentPage = 0; + Integer pageSize = 5; + Sort sort = Sort.by(Sort.Direction.DESC, "id"); + PageRequest pageRequest = PageRequest.of(currentPage, pageSize, sort); + Page userPage = userDao.findAll(pageRequest); + + Assert.assertEquals(5, userPage.getSize()); + Assert.assertEquals(userDao.count(), userPage.getTotalElements()); + log.debug("【id】= {}", userPage.getContent().stream().map(User::getId).collect(Collectors.toList())); + } + + /** + * 初始化10条数据 + */ + private void initData() { + List userList = Lists.newArrayList(); + for (int i = 0; i < 10; i++) { + String salt = IdUtil.fastSimpleUUID(); + int index = 3 + i; + User user = User.builder().name("testSave" + index).password(SecureUtil.md5("123456" + salt)).salt(salt).email("testSave" + index + "@xkcoding.com").phoneNumber("1730000000" + index).status(1).lastLoginTime(new DateTime()).build(); + userList.add(user); + } + userDao.saveAll(userList); + } + +} +``` + +## 参考 + +Spring Data JPA 官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/ \ No newline at end of file diff --git a/spring-boot-demo-orm-jpa/pom.xml b/spring-boot-demo-orm-jpa/pom.xml index f6d824b..acb2548 100644 --- a/spring-boot-demo-orm-jpa/pom.xml +++ b/spring-boot-demo-orm-jpa/pom.xml @@ -30,7 +30,12 @@ org.springframework.boot - spring-boot-starter-web + spring-boot-starter + + + + mysql + mysql-connector-java @@ -38,6 +43,22 @@ spring-boot-starter-test test + + + cn.hutool + hutool-all + + + + com.google.guava + guava + + + + org.projectlombok + lombok + true + diff --git a/spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/config/JpaConfig.java b/spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/config/JpaConfig.java new file mode 100644 index 0000000..c606943 --- /dev/null +++ b/spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/config/JpaConfig.java @@ -0,0 +1,59 @@ +package com.xkcoding.orm.jpa.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; + +/** + *

+ * JPA配置类 + *

+ * + * @package: com.xkcoding.orm.jpa.config + * @description: JPA配置类 + * @author: yangkai.shen + * @date: Created in 2018/11/7 11:05 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Configuration +@EnableTransactionManagement +@EnableJpaAuditing +@EnableJpaRepositories(basePackages = "com.xkcoding.orm.jpa.repository", transactionManagerRef = "jpaTransactionManager") +public class JpaConfig { + @Bean + @ConfigurationProperties(prefix = "spring.datasource") + public DataSource dataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + HibernateJpaVendorAdapter japVendor = new HibernateJpaVendorAdapter(); + japVendor.setGenerateDdl(false); + LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean(); + entityManagerFactory.setDataSource(dataSource()); + entityManagerFactory.setJpaVendorAdapter(japVendor); + entityManagerFactory.setPackagesToScan("com.xkcoding.orm.jpa.entity"); + return entityManagerFactory; + } + + @Bean + public PlatformTransactionManager jpaTransactionManager(EntityManagerFactory entityManagerFactory) { + JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(entityManagerFactory); + return transactionManager; + } +} diff --git a/spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/entity/User.java b/spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/entity/User.java new file mode 100644 index 0000000..baaeaa0 --- /dev/null +++ b/spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/entity/User.java @@ -0,0 +1,69 @@ +package com.xkcoding.orm.jpa.entity; + +import com.xkcoding.orm.jpa.entity.base.AbstractAuditModel; +import lombok.*; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; +import java.util.Date; + +/** + *

+ * 用户实体类 + *

+ * + * @package: com.xkcoding.orm.jpa.entity + * @description: 用户实体类 + * @author: yangkai.shen + * @date: Created in 2018/11/7 14:06 + * @copyright: Copyright (c) + * @version: V1.0 + * @modified: yangkai.shen + */ +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Entity +@Table(name = "orm_user") +@ToString(callSuper = true) +public class User extends AbstractAuditModel { + /** + * 用户名 + */ + private String name; + + /** + * 加密后的密码 + */ + private String password; + + /** + * 加密使用的盐 + */ + private String salt; + + /** + * 邮箱 + */ + private String email; + + /** + * 手机号码 + */ + @Column(name = "phone_number") + private String phoneNumber; + + /** + * 状态,-1:逻辑删除,0:禁用,1:启用 + */ + private Integer status; + + /** + * 上次登录时间 + */ + @Column(name = "last_login_time") + private Date lastLoginTime; +} diff --git a/spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/entity/base/AbstractAuditModel.java b/spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/entity/base/AbstractAuditModel.java new file mode 100644 index 0000000..beb8547 --- /dev/null +++ b/spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/entity/base/AbstractAuditModel.java @@ -0,0 +1,51 @@ +package com.xkcoding.orm.jpa.entity.base; + +import lombok.Data; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 实体通用父类 + *

+ * + * @package: com.xkcoding.orm.jpa.entity.base + * @description: 实体通用父类 + * @author: yangkai.shen + * @date: Created in 2018/11/7 14:01 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +@Data +public abstract class AbstractAuditModel implements Serializable { + /** + * 主键 + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 创建时间 + */ + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "create_time", nullable = false, updatable = false) + @CreatedDate + private Date createTime; + + /** + * 上次更新时间 + */ + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_update_time", nullable = false) + @LastModifiedDate + private Date lastUpdateTime; +} diff --git a/spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/repository/UserDao.java b/spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/repository/UserDao.java new file mode 100644 index 0000000..383719a --- /dev/null +++ b/spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/repository/UserDao.java @@ -0,0 +1,23 @@ +package com.xkcoding.orm.jpa.repository; + +import com.xkcoding.orm.jpa.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + *

+ * User Dao + *

+ * + * @package: com.xkcoding.orm.jpa.repository + * @description: User Dao + * @author: yangkai.shen + * @date: Created in 2018/11/7 14:07 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Repository +public interface UserDao extends JpaRepository { + +} diff --git a/spring-boot-demo-orm-jpa/src/main/resources/application.yml b/spring-boot-demo-orm-jpa/src/main/resources/application.yml index e69de29..0f9c3f4 100644 --- a/spring-boot-demo-orm-jpa/src/main/resources/application.yml +++ b/spring-boot-demo-orm-jpa/src/main/resources/application.yml @@ -0,0 +1,39 @@ +server: + port: 8080 + servlet: + context-path: /demo +spring: + datasource: + jdbc-url: jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8 + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + initialization-mode: always + continue-on-error: true + schema: + - "classpath:db/schema.sql" + data: + - "classpath:db/data.sql" + hikari: + minimum-idle: 5 + connection-test-query: SELECT 1 FROM DUAL + maximum-pool-size: 20 + auto-commit: true + idle-timeout: 30000 + pool-name: SpringBootDemoHikariCP + max-lifetime: 60000 + connection-timeout: 30000 + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL57InnoDBDialect + open-in-view: true +logging: + level: + com.xkcoding: debug + org.hibernate.SQL: debug + org.hibernate.type: trace \ No newline at end of file diff --git a/spring-boot-demo-orm-jpa/src/test/java/com/xkcoding/orm/jpa/repository/UserDaoTest.java b/spring-boot-demo-orm-jpa/src/test/java/com/xkcoding/orm/jpa/repository/UserDaoTest.java new file mode 100644 index 0000000..edde196 --- /dev/null +++ b/spring-boot-demo-orm-jpa/src/test/java/com/xkcoding/orm/jpa/repository/UserDaoTest.java @@ -0,0 +1,130 @@ +package com.xkcoding.orm.jpa.repository; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.util.IdUtil; +import cn.hutool.crypto.SecureUtil; +import com.xkcoding.orm.jpa.SpringBootDemoOrmJpaApplicationTests; +import com.xkcoding.orm.jpa.entity.User; +import lombok.extern.slf4j.Slf4j; +import org.assertj.core.util.Lists; +import org.junit.Assert; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + *

+ * jpa 测试类 + *

+ * + * @package: com.xkcoding.orm.jpa.repository + * @description: jpa 测试类 + * @author: yangkai.shen + * @date: Created in 2018/11/7 14:09 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Slf4j +public class UserDaoTest extends SpringBootDemoOrmJpaApplicationTests { + @Autowired + private UserDao userDao; + + /** + * 测试保存 + */ + @Test + public void testSave() { + String salt = IdUtil.fastSimpleUUID(); + User testSave3 = User.builder().name("testSave3").password(SecureUtil.md5("123456" + salt)).salt(salt).email("testSave3@xkcoding.com").phoneNumber("17300000003").status(1).lastLoginTime(new DateTime()).build(); + userDao.save(testSave3); + + Assert.assertNotNull(testSave3.getId()); + Optional byId = userDao.findById(testSave3.getId()); + Assert.assertTrue(byId.isPresent()); + log.debug("【byId】= {}", byId.get()); + } + + /** + * 测试删除 + */ + @Test + public void testDelete() { + long count = userDao.count(); + userDao.deleteById(1L); + long left = userDao.count(); + Assert.assertEquals(count - 1, left); + } + + /** + * 测试修改 + */ + @Test + public void testUpdate() { + userDao.findById(1L).ifPresent(user -> { + user.setName("JPA修改名字"); + userDao.save(user); + }); + Assert.assertEquals("JPA修改名字", userDao.findById(1L).get().getName()); + } + + /** + * 测试查询单个 + */ + @Test + public void testQueryOne() { + Optional byId = userDao.findById(1L); + Assert.assertTrue(byId.isPresent()); + log.debug("【byId】= {}", byId.get()); + } + + /** + * 测试查询所有 + */ + @Test + public void testQueryAll() { + List users = userDao.findAll(); + Assert.assertNotEquals(0, users.size()); + log.debug("【users】= {}", users); + } + + /** + * 测试分页排序查询 + */ + @Test + public void testQueryPage() { + // 初始化数据 + initData(); + // JPA分页的时候起始页是页码减1 + Integer currentPage = 0; + Integer pageSize = 5; + Sort sort = Sort.by(Sort.Direction.DESC, "id"); + PageRequest pageRequest = PageRequest.of(currentPage, pageSize, sort); + Page userPage = userDao.findAll(pageRequest); + + Assert.assertEquals(5, userPage.getSize()); + Assert.assertEquals(userDao.count(), userPage.getTotalElements()); + log.debug("【id】= {}", userPage.getContent().stream().map(User::getId).collect(Collectors.toList())); + } + + /** + * 初始化10条数据 + */ + private void initData() { + List userList = Lists.newArrayList(); + for (int i = 0; i < 10; i++) { + String salt = IdUtil.fastSimpleUUID(); + int index = 3 + i; + User user = User.builder().name("testSave" + index).password(SecureUtil.md5("123456" + salt)).salt(salt).email("testSave" + index + "@xkcoding.com").phoneNumber("1730000000" + index).status(1).lastLoginTime(new DateTime()).build(); + userList.add(user); + } + userDao.saveAll(userList); + } + +} \ No newline at end of file