The DAO Pattern in Java - BAEL-1809 (#4286)
* Initial Commit * Update persistence.xml * Update UserUnitTest.java * Rename project module * Update pom.xml * Update pom.xml * Update pom.xml * Update pom.xml * Update pom.xml * Update UserApplication.java * Update JpaUserDao.java * Update UserDao.java * Update JpaUserDaoUnitTest.java * Update UserDaoUnitTest.java * Update JpaUserDaoUnitTest.java * Update UserDaoUnitTest.java * Update UserUnitTest.java * Update UserUnitTest.java * Update Dao.java * Update pom.xml * Update pom.xml * Delete JpaUserDaoUnitTest.java * Delete UserUnitTest.java
This commit is contained in:
parent
eceb217e7a
commit
8bc84886a4
|
@ -12,41 +12,63 @@
|
|||
<relativePath>..</relativePath>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.12</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hamcrest</groupId>
|
||||
<artifactId>hamcrest-core</artifactId>
|
||||
<version>1.3</version>
|
||||
<scope>test</scope>
|
||||
<dependency>
|
||||
<groupId>org.hamcrest</groupId>
|
||||
<artifactId>hamcrest-core</artifactId>
|
||||
<version>1.3</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
<artifactId>assertj-core</artifactId>
|
||||
<version>3.8.0</version>
|
||||
<version>3.9.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
<version>2.18.3</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax</groupId>
|
||||
<artifactId>javaee-api</artifactId>
|
||||
<version>8.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-core</artifactId>
|
||||
<version>5.2.16.Final</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<version>8.0.11</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>${log4j.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.googlecode.grep4j</groupId>
|
||||
<artifactId>grep4j</artifactId>
|
||||
<version>${grep4j.version}</version>
|
||||
</dependency>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>${log4j.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.googlecode.grep4j</groupId>
|
||||
<artifactId>grep4j</artifactId>
|
||||
<version>${grep4j.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<maven.compiler.source>1.8</maven.compiler.source>
|
||||
<maven.compiler.target>1.8</maven.compiler.target>
|
||||
<log4j.version>1.2.17</log4j.version>
|
||||
<grep4j.version>1.8.7</grep4j.version>
|
||||
<grep4j.version>1.8.7</grep4j.version>
|
||||
</properties>
|
||||
</project>
|
||||
</project>
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
package com.baeldung.daopattern.application;
|
||||
|
||||
import com.baeldung.daopattern.daos.Dao;
|
||||
import com.baeldung.daopattern.daos.JpaUserDao;
|
||||
import com.baeldung.daopattern.entities.User;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.Persistence;
|
||||
|
||||
public class UserApplication {
|
||||
|
||||
private static JpaUserDao jpaUserDao;
|
||||
|
||||
public static void main(String[] args) {
|
||||
User user1 = getUser(1);
|
||||
System.out.println(user1);
|
||||
updateUser(user1, new String[]{"John", "john@domain.com"});
|
||||
saveUser(new User("Monica", "monica@domain.com"));
|
||||
deleteUser(getUser(2));
|
||||
getAllUsers().forEach(user -> System.out.println(user.getName()));
|
||||
}
|
||||
|
||||
public static Dao getJpaUserDao() {
|
||||
if (jpaUserDao == null) {
|
||||
EntityManager entityManager = Persistence.createEntityManagerFactory("user-unit").createEntityManager();
|
||||
jpaUserDao = new JpaUserDao(entityManager);
|
||||
}
|
||||
return jpaUserDao;
|
||||
}
|
||||
|
||||
public static User getUser(long id) {
|
||||
Optional<User> user = getJpaUserDao().get(id);
|
||||
return user.orElse(new User("Non-existing user", "no-email"));
|
||||
}
|
||||
|
||||
public static List<User> getAllUsers() {
|
||||
return getJpaUserDao().getAll();
|
||||
}
|
||||
|
||||
public static void updateUser(User user, String[] params){
|
||||
getJpaUserDao().update(user, params);
|
||||
}
|
||||
|
||||
public static void saveUser(User user) {
|
||||
getJpaUserDao().save(user);
|
||||
}
|
||||
|
||||
public static void deleteUser(User user) {
|
||||
getJpaUserDao().delete(user);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package com.baeldung.daopattern.daos;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public interface Dao<T> {
|
||||
|
||||
Optional<T> get(long id);
|
||||
|
||||
List<T> getAll();
|
||||
|
||||
void save(T t);
|
||||
|
||||
void update(T t, String[] params);
|
||||
|
||||
void delete(T t);
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
package com.baeldung.daopattern.daos;
|
||||
|
||||
import com.baeldung.daopattern.entities.User;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Consumer;
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.EntityTransaction;
|
||||
import javax.persistence.Query;
|
||||
|
||||
public class JpaUserDao implements Dao<User> {
|
||||
|
||||
private final EntityManager entityManager;
|
||||
|
||||
public JpaUserDao(EntityManager entityManager) {
|
||||
this.entityManager = entityManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<User> get(long id) {
|
||||
return Optional.ofNullable(entityManager.find(User.class, id));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<User> getAll() {
|
||||
Query query = entityManager.createQuery("SELECT e FROM User e");
|
||||
return query.getResultList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save(User user) {
|
||||
executeInsideTransaction(entityManager -> entityManager.persist(user));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(User user, String[] params) {
|
||||
user.setName(Objects.requireNonNull(params[0], "Name cannot be null"));
|
||||
user.setEmail(Objects.requireNonNull(params[1], "Email cannot be null"));
|
||||
executeInsideTransaction(entityManager -> entityManager.merge(user));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(User user) {
|
||||
executeInsideTransaction(entityManager -> entityManager.remove(user));
|
||||
}
|
||||
|
||||
private void executeInsideTransaction(Consumer<EntityManager> action) {
|
||||
final EntityTransaction tx = entityManager.getTransaction();
|
||||
try {
|
||||
tx.begin();
|
||||
action.accept(entityManager);
|
||||
tx.commit();
|
||||
}
|
||||
catch (RuntimeException e) {
|
||||
tx.rollback();
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
package com.baeldung.daopattern.daos;
|
||||
|
||||
import com.baeldung.daopattern.entities.User;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
public class UserDao implements Dao<User> {
|
||||
|
||||
private List<User> users = new ArrayList<>();
|
||||
|
||||
public UserDao() {
|
||||
users.add(new User("John", "john@domain.com"));
|
||||
users.add(new User("Susan", "susan@domain.com"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<User> get(long id) {
|
||||
return Optional.ofNullable(users.get((int) id));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<User> getAll() {
|
||||
return users;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save(User user) {
|
||||
users.add(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(User user, String[] params) {
|
||||
user.setName(Objects.requireNonNull(params[0], "Name cannot be null"));
|
||||
user.setEmail(Objects.requireNonNull(params[1], "Email cannot be null"));
|
||||
users.add(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(User user) {
|
||||
users.remove(user);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
package com.baeldung.daopattern.entities;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.GenerationType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Table;
|
||||
|
||||
@Entity
|
||||
@Table(name = "users")
|
||||
public class User {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private long id;
|
||||
private String name;
|
||||
private String email;
|
||||
|
||||
public User(){}
|
||||
|
||||
public User(String name, String email) {
|
||||
this.name = name;
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
|
||||
<persistence-unit name="user-unit">
|
||||
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
||||
<class>com.baeldung.daopattern.entities.User</class>
|
||||
<properties>
|
||||
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
|
||||
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://url/to/database"/>
|
||||
<property name="javax.persistence.jdbc.user" value="username"/>
|
||||
<property name="javax.persistence.jdbc.password" value="passsword"/>
|
||||
<!-- Hibernate Properties -->
|
||||
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
|
||||
<property name="hibernate.show_sql" value="true"/>
|
||||
<property name="hibernate.format_sql" value="true"/>
|
||||
</properties>
|
||||
</persistence-unit>
|
||||
</persistence>
|
|
@ -0,0 +1,53 @@
|
|||
package com.baeldung.daopattern.test;
|
||||
|
||||
import com.baeldung.daopattern.daos.UserDao;
|
||||
import com.baeldung.daopattern.entities.User;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
public class UserDaoUnitTest {
|
||||
|
||||
private static UserDao userDao;
|
||||
|
||||
|
||||
@BeforeClass
|
||||
public static void setUpUserDaoInstance() {
|
||||
userDao = new UserDao();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenUserDaoInstance_whenCalledget_thenOneAssertion() {
|
||||
assertThat(userDao.get(0)).isInstanceOf(Optional.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenUserDaoInstance_whenCalledgetAll_thenOneAssertion() {
|
||||
assertThat(userDao.getAll()).isInstanceOf(List.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenUserDaoInstance_whenCalledupdate_thenTwoAssertions() {
|
||||
User user = new User("Julie", "julie@domain.com");
|
||||
userDao.update(user, new String[] {"Julie", "julie@domain.com"});
|
||||
assertThat(userDao.get(2).get().getName()).isEqualTo("Julie");
|
||||
assertThat(userDao.get(2).get().getEmail()).isEqualTo("julie@domain.com");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenUserDaoInstance_whenCalledsave_thenTwoAssertions() {
|
||||
User user = new User("Julie", "julie@domain.com");
|
||||
userDao.save(user);
|
||||
assertThat(userDao.get(2).get().getName()).isEqualTo("Julie");
|
||||
assertThat(userDao.get(2).get().getEmail()).isEqualTo("julie@domain.com");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenUserDaoInstance_whenCalleddelete_thenOneAssertion() {
|
||||
User user = new User("Julie", "julie@domain.com");
|
||||
userDao.delete(user);
|
||||
assertThat(userDao.getAll().size()).isEqualTo(2);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue