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
+
+
+ * 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+ * 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+ * 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+ * 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