From e75ac48743660d11378764d1e356fec70a6c6fe5 Mon Sep 17 00:00:00 2001 From: Torge Hamann <37174525+torge-hmn@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:09:28 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=BE=20Setup=20SQLite=20database=20(#3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add SQLite setup * Add basic user entity and repository * Adjust DB naming * Consolidate properties --- .gitignore | 3 + build.gradle.kts | 11 ++++ .../certassist/config/DatabaseConfig.java | 62 +++++++++++++++++++ .../de/mlessmann/certassist/models/User.java | 20 ++++++ .../repositories/UserRepository.java | 11 ++++ src/main/resources/application.properties | 10 +++ .../repositories/UserRepositoryTest.java | 24 +++++++ 7 files changed, 141 insertions(+) create mode 100644 src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java create mode 100644 src/main/java/de/mlessmann/certassist/models/User.java create mode 100644 src/main/java/de/mlessmann/certassist/repositories/UserRepository.java create mode 100644 src/test/java/de/mlessmann/certassist/repositories/UserRepositoryTest.java diff --git a/.gitignore b/.gitignore index c2065bc..5883108 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ out/ ### VS Code ### .vscode/ + +### SQLite DB ### +sqlLiteDb \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 7cf0fe9..22e30f7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,14 +24,25 @@ repositories { } dependencies { + implementation("org.springframework.boot:spring-boot-autoconfigure") + implementation("org.springframework.boot:spring-boot-starter-jdbc") + implementation("org.xerial:sqlite-jdbc") + implementation("org.springframework.boot:spring-boot-starter-data-jpa") + implementation("org.hibernate.orm:hibernate-community-dialects") + implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.flywaydb:flyway-core") + compileOnly("org.projectlombok:lombok") annotationProcessor("org.projectlombok:lombok") + testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.security:spring-security-test") + testImplementation("org.assertj:assertj-core") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java b/src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java new file mode 100644 index 0000000..64def67 --- /dev/null +++ b/src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java @@ -0,0 +1,62 @@ +package de.mlessmann.certassist.config; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; + +import javax.sql.DataSource; +import java.util.Objects; +import java.util.Properties; + +@Configuration +@RequiredArgsConstructor +@EnableJpaRepositories(basePackages = "de.mlessmann.certassist.repositories") +public class DatabaseConfig { + + private static final String HIBERNATE_DIALECT_PROPERTY = "hibernate.dialect"; + private static final String HIBERNATE_HBM_2_DDL_AUTO_PROPERTY = "hibernate.hbm2ddl.auto"; + private static final String HIBERNATE_SHOW_SQL_PROPERTY = "hibernate.show_sql"; + + final Environment env; + + @Bean + public DataSource dataSource() { + final DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName(Objects.requireNonNull(env.getProperty("driverClassName"))); + dataSource.setUrl(Objects.requireNonNull(env.getProperty("url"))); + dataSource.setUsername(Objects.requireNonNull(env.getProperty("username"))); + dataSource.setPassword(Objects.requireNonNull(env.getProperty("password"))); + return dataSource; + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + final LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean(); + entityManagerFactory.setDataSource(dataSource()); + entityManagerFactory.setPackagesToScan("de.mlessmann.certassist.models"); + entityManagerFactory.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); + entityManagerFactory.setJpaProperties(additionalProperties()); + return entityManagerFactory; + } + + private Properties additionalProperties() { + final Properties hibernateProperties = new Properties(); + if (env.getProperty(HIBERNATE_HBM_2_DDL_AUTO_PROPERTY) != null) { + hibernateProperties.setProperty(HIBERNATE_HBM_2_DDL_AUTO_PROPERTY, env.getProperty(HIBERNATE_HBM_2_DDL_AUTO_PROPERTY)); + } + if (env.getProperty(HIBERNATE_DIALECT_PROPERTY) != null) { + hibernateProperties.setProperty(HIBERNATE_DIALECT_PROPERTY, env.getProperty(HIBERNATE_DIALECT_PROPERTY)); + } + if (env.getProperty(HIBERNATE_SHOW_SQL_PROPERTY) != null) { + hibernateProperties.setProperty(HIBERNATE_SHOW_SQL_PROPERTY, env.getProperty(HIBERNATE_SHOW_SQL_PROPERTY)); + } + + return hibernateProperties; + } + +} diff --git a/src/main/java/de/mlessmann/certassist/models/User.java b/src/main/java/de/mlessmann/certassist/models/User.java new file mode 100644 index 0000000..78f77a4 --- /dev/null +++ b/src/main/java/de/mlessmann/certassist/models/User.java @@ -0,0 +1,20 @@ +package de.mlessmann.certassist.models; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private Long id; + + @Setter + private String username; +} diff --git a/src/main/java/de/mlessmann/certassist/repositories/UserRepository.java b/src/main/java/de/mlessmann/certassist/repositories/UserRepository.java new file mode 100644 index 0000000..4f12c8b --- /dev/null +++ b/src/main/java/de/mlessmann/certassist/repositories/UserRepository.java @@ -0,0 +1,11 @@ +package de.mlessmann.certassist.repositories; + +import de.mlessmann.certassist.models.User; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRepository extends CrudRepository { + + User findUserById(long id); +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index caa3574..1b73bda 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,11 @@ +# General spring.application.name=home-cert-assistant +# Database +driverClassName=org.sqlite.JDBC +url=jdbc:sqlite:sqlLiteDb:database?cache=shared +username=admin +password=admin +spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect +#TODO: Use flyway for db setup +hibernate.hbm2ddl.auto=create-drop +hibernate.show_sql=true \ No newline at end of file diff --git a/src/test/java/de/mlessmann/certassist/repositories/UserRepositoryTest.java b/src/test/java/de/mlessmann/certassist/repositories/UserRepositoryTest.java new file mode 100644 index 0000000..0e6f342 --- /dev/null +++ b/src/test/java/de/mlessmann/certassist/repositories/UserRepositoryTest.java @@ -0,0 +1,24 @@ +package de.mlessmann.certassist.repositories; + +import de.mlessmann.certassist.models.User; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +class UserRepositoryTest { + + @Autowired + private UserRepository userRepository; + + @Test + void findUserById() { + final User user = new User(); + user.setUsername("test"); + userRepository.save(user); + + assertThat(userRepository.findUserById(user.getId()).getUsername()).isEqualTo("test"); + } +}