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