@@ -0,0 +1,409 @@ | |||
# spring-boot-demo-orm-jpa | |||
> 此 demo 主要演示了 Spring Boot 如何使用 JPA 操作数据库。 | |||
## pom.xml | |||
```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> | |||
<artifactId>spring-boot-demo-orm-jpa</artifactId> | |||
<version>1.0.0-SNAPSHOT</version> | |||
<packaging>jar</packaging> | |||
<name>spring-boot-demo-orm-jpa</name> | |||
<description>Demo project for Spring Boot</description> | |||
<parent> | |||
<groupId>com.xkcoding</groupId> | |||
<artifactId>spring-boot-demo</artifactId> | |||
<version>1.0.0-SNAPSHOT</version> | |||
</parent> | |||
<properties> | |||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | |||
<java.version>1.8</java.version> | |||
</properties> | |||
<dependencies> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-data-jpa</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>mysql</groupId> | |||
<artifactId>mysql-connector-java</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-test</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>cn.hutool</groupId> | |||
<artifactId>hutool-all</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.google.guava</groupId> | |||
<artifactId>guava</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.projectlombok</groupId> | |||
<artifactId>lombok</artifactId> | |||
<optional>true</optional> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
<finalName>spring-boot-demo-orm-jpa</finalName> | |||
<plugins> | |||
<plugin> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-maven-plugin</artifactId> | |||
</plugin> | |||
</plugins> | |||
</build> | |||
</project> | |||
``` | |||
## JpaConfig.java | |||
```java | |||
/** | |||
* <p> | |||
* JPA配置类 | |||
* </p> | |||
* | |||
* @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 | |||
/** | |||
* <p> | |||
* 用户实体类 | |||
* </p> | |||
* | |||
* @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 | |||
/** | |||
* <p> | |||
* 实体通用父类 | |||
* </p> | |||
* | |||
* @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 | |||
/** | |||
* <p> | |||
* User Dao | |||
* </p> | |||
* | |||
* @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<User, Long> { | |||
} | |||
``` | |||
## 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 | |||
/** | |||
* <p> | |||
* jpa 测试类 | |||
* </p> | |||
* | |||
* @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<User> 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<User> byId = userDao.findById(1L); | |||
Assert.assertTrue(byId.isPresent()); | |||
log.debug("【byId】= {}", byId.get()); | |||
} | |||
/** | |||
* 测试查询所有 | |||
*/ | |||
@Test | |||
public void testQueryAll() { | |||
List<User> 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<User> 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<User> 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/ |
@@ -30,7 +30,12 @@ | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-web</artifactId> | |||
<artifactId>spring-boot-starter</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>mysql</groupId> | |||
<artifactId>mysql-connector-java</artifactId> | |||
</dependency> | |||
<dependency> | |||
@@ -38,6 +43,22 @@ | |||
<artifactId>spring-boot-starter-test</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>cn.hutool</groupId> | |||
<artifactId>hutool-all</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.google.guava</groupId> | |||
<artifactId>guava</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.projectlombok</groupId> | |||
<artifactId>lombok</artifactId> | |||
<optional>true</optional> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
@@ -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; | |||
/** | |||
* <p> | |||
* JPA配置类 | |||
* </p> | |||
* | |||
* @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; | |||
} | |||
} |
@@ -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; | |||
/** | |||
* <p> | |||
* 用户实体类 | |||
* </p> | |||
* | |||
* @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; | |||
} |
@@ -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; | |||
/** | |||
* <p> | |||
* 实体通用父类 | |||
* </p> | |||
* | |||
* @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; | |||
} |
@@ -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; | |||
/** | |||
* <p> | |||
* User Dao | |||
* </p> | |||
* | |||
* @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<User, Long> { | |||
} |
@@ -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 |
@@ -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; | |||
/** | |||
* <p> | |||
* jpa 测试类 | |||
* </p> | |||
* | |||
* @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<User> 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<User> byId = userDao.findById(1L); | |||
Assert.assertTrue(byId.isPresent()); | |||
log.debug("【byId】= {}", byId.get()); | |||
} | |||
/** | |||
* 测试查询所有 | |||
*/ | |||
@Test | |||
public void testQueryAll() { | |||
List<User> 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<User> 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<User> 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); | |||
} | |||
} |