@@ -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> | <dependency> | ||||
<groupId>org.springframework.boot</groupId> | <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> | ||||
<dependency> | <dependency> | ||||
@@ -38,6 +43,22 @@ | |||||
<artifactId>spring-boot-starter-test</artifactId> | <artifactId>spring-boot-starter-test</artifactId> | ||||
<scope>test</scope> | <scope>test</scope> | ||||
</dependency> | </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> | </dependencies> | ||||
<build> | <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); | |||||
} | |||||
} |